关注「Java视界」公众号,获取更多技术干货

java中的网络编程实例

一、TCP的全称?UDP的全称?

TCP(Transfer Control Protocol)

TCP:一种面向连接(连接导向)的、可靠的、基于字节流的传输层(Transport layer)通信协议。特点:面向连接;点到点的通信;高可靠性;占用系统资源多、效率低。

UDP(User Datagram Protocol)

特点:非面向连接;传输不可靠,可能丢失;发送不管对方是否准备好,接收方收到也不确认;可以广播发送;非常简单的协议,开销小

二、如何理解Socket的含义

所谓socket通常也称作"套接字",用于描述IP地址和端口,是一个通信链的句柄。应用程序通常通过"套接字"向网络发出请求或者应答网络请求。

我们开发的网络应用程序位于应用层,TCP和UDP属于传输层协议,在应用层如何使用传输层的服务呢?在应用层和传输层之间,则是使用套接字来进行分离。

套接字就像是传输层为应用层开的一个小口,应用程序通过这个小口向远程发送数据,或者接收远程发来的数据;而这个小口以内,也就是数据进入这个口之后,或者数据从这个口出来之前,是不知道也不需要知道的,也不会关心它如何传输,这属于网络其它层次的工作。Socket就是应用层与传输层之间的桥梁。使用Socket编程可以开发客户机和服务器应用程序,可以在本地网络上进行通信,也可通过Internet在全球范围内通信。

生活案例:如果你想写封邮件发给远方的朋友,如何写信、将信打包,属于应用层。信怎么写,怎么打包完全由我们做主;而当我们将信投入邮筒时,邮筒的那个口就是套接字,在进入套接字之后,就是传输层、网络层等(邮局、公路交管或者航线等)其它层次的工作了。我们从来不会去关心信是如何从西安发往北京的,我们只知道写好了投入邮筒就OK了。

三、基于TCP的Socket网络编程的主要步骤是什么?

Java分别为TCP和UDP两种通信协议提供了相应的Socket编程类,这些类存放在java.net包中。与TCP对应的是服务器的ServerSocket和客户端的Socket,与UDP对应的是DatagramSocket。

基于TCP协议的Socket编程的主要步骤:

服务器端(server):

1.构建一个ServerSocket实例,指定本地的端口。这个socket就是用来监听指定端口的连接请求的。

2.重复如下几个步骤:

a.调用socket的accept()方法来获得下面客户端的连接请求。通过accept()方法返回的socket实例,建立一个和客户端的新连接。

b.通过这个返回的socket实例获取InputStream和OutputStream,可以通过这两个stream来分别读和写数据。

c.结束的时候调用socket实例的close()方法关闭socket连接。

客户端(client):

1.构建Socket实例,通过指定的远程服务器地址和端口来建立连接。

2.通过Socket实例包含的InputStream和OutputStream来进行数据的读写。

3.操作结束后调用socket实例的close方法,关闭。

代码实例:

服务端:
public class TCPServer {
    public static void main(String[] args) throws IOException {
        // 1.创建服务,指定服务端口
        ServerSocket serverSocket = new ServerSocket(8081);

        // 2.接受客户端的连接
        Socket socket = serverSocket.accept();
        System.out.println("服务端接受连接!");

        // 3.发送数据
        DataOutputStream dos = new DataOutputStream(new BufferedOutputStream(socket.getOutputStream()));
        dos.writeUTF("你好!我是服务端!");
        dos.flush();
    }
}
客户端:
public class TCPClient1 {
    public static void main(String[] args) throws IOException {
        // 1.创建服务,指定服务端口
        Socket client = new Socket("localhost",8081);

        // 2.接收服务端数据
        DataInputStream dis = new DataInputStream(new BufferedInputStream(client.getInputStream()));
        String s = dis.readUTF();
        System.out.println(s);
    }
}

基于UDP的Socket网络编程的主要步骤是什么?

基于UDP协议的Socket编程的主要步骤

服务器端(server):            

构造DatagramSocket实例,指定本地端口。

通过DatagramSocket实例的receive方法接收DatagramPacket.DatagramPacket中间就包含了通信的内容。

通过DatagramSocket的send和receive方法来收和发DatagramPacket.

客户端(client):

构造DatagramSocket实例。

2.通过DatagramSocket实例的send和receive方法发送DatagramPacket报文。

3.结束后,调用DatagramSocket的close方法关闭。

代码实例:

服务端:
public class UDPServer {
    public static void main(String[] args) throws IOException {
        // 1.创建服务,指定服务端口
        DatagramSocket datagramSocket = new DatagramSocket(8086);
        // 2.准备容器
        byte[] container = new byte[1024];
        // 3.打包容器
        DatagramPacket packet = new DatagramPacket(container, container.length);
        // 4.接收数据
        datagramSocket.receive(packet);
        // 5.从包里取出数据
        byte[] data = packet.getData();
        // 6.转换
        String str = convert(data);
        System.out.println(str);
    }

    public static String convert(byte[] data) throws IOException {
        ByteArrayInputStream byteArrayInputStream = new ByteArrayInputStream(data);
        DataInputStream dis = new DataInputStream(byteArrayInputStream);
        String s = dis.readUTF();
        return s;
    }
}
客户端:
public class UDPClient {
    public static void main(String[] args) throws IOException {
        // 1.创建服务,指定服务端口
        DatagramSocket client = new DatagramSocket(8088);
        // 2.准备数据
        String str = "哈哈哈!";
        byte[] data = convert(str);
        // 3.数据打包
        DatagramPacket packet = new DatagramPacket(data, data.length, new InetSocketAddress("localhost", 8086));
        // 4.发送数据
        client.send(packet);
        // 5.释放资源
        client.close();
    }

    public static byte[] convert(String str) throws IOException {
        ByteArrayOutputStream bos = new ByteArrayOutputStream();
        DataOutputStream dos = new DataOutputStream(bos);
        dos.writeUTF(str);
        dos.flush();
        byte[] data = bos.toByteArray();
        dos.close();
        return data;
    }
}

 

posted @ 2022-06-25 14:02  沙滩de流沙  阅读(97)  评论(0编辑  收藏  举报

关注「Java视界」公众号,获取更多技术干货