UDP/TCP

一、UDP/TCP区别:

  1、TCP面向连接:

    (1)连接:建立连接,形成传输数据的通道;

    (2)大数据传输:在连接中进行大数据量传输;

    (3)可靠:通过三次握手完成连接,是可靠协;

    (4)速度慢:必须建立连接,效率会稍低;

  2、UDP无连接:

    (1)无连接:将数据及源和目的封装成数据包中,不需要建立连接;

    (2)小数据传输:每个数据报的大小在限制在64k内;

    (3)不可靠:因无连接,所以是不可靠协议;

    (4)速度快:不需要建立连接,速度快;

二、UDP/DatagramSocket/DatagramPacket:

  1、传输思路:

    1)发送:

    (1)建立udpsocket服务;

    (2)提供数据,并将数据封装到数据包中;

    (3)通过socket的send服务的发送功能,将数据包发出去;

    (4)关闭资源;

    2)接收:

    (1)建立udpsocket服务,监听一个端口

    (2)定义数据包,用于存储接收到的字节数据;

    (3)通过socket的receive服务的接收功能,存入定义好的数据包中;

    (4)通过数据包中的特有功能,取出数据;

    (5)关闭资源;

  2、DatagramSocket类:用于创建udpsocket服务;

    (1)构造方法:

      1DatagramSocket();

      2)DatagramSocket(int port);指定一个端口号;

  (2)方法:

      1void send(DatagramPacket p);发送数据包;

      2void receive(DatagramPacket p);接收数据包;//此方法在接收到数据报前一直阻塞;

      3void close();关闭资源;

  3、DatagramPacket类:用于创建数据包;

    (1)构造方法:

      1)发送数据包:DatagramPacket(byte[] buf, int length, InetAddress address, int port);

        //参数:buf数据;length长度;address地址;port端口;

      2)接收数据包:DatagramPacket(byte[] buf, int length);

    (2)方法:

      1InetAddress getAddress();返回IP地址;

      2)byte[] getData();返回数据包;//创建的为1024时,没有存满则后面为默认值;

      3)int getLength();返回接收到的数据长度,不是数组的;

      4int getPort();返回端口号;

   4、示例:

    1)发送端:

public class Send {
    public static void main(String[] args) throws Exception {
        // 1、建立udpsocket服务
        DatagramSocket client = new DatagramSocket();
        // 2、提供数据,并将数据封装到数据包中
        String msg = "hello";
        byte[] data = msg.getBytes();
        DatagramPacket packet = new DatagramPacket(data, data.length, new InetSocketAddress("127.0.0.1", 8848));
        // 3、发送数据包
        client.send(packet);
        // 4、关闭资源
        client.close();
    }
}

    2)接收端:

public class Receive {
    public static void main(String[] args) throws Exception {
        // 1、建立udpsocket服务,监听一个端口;
        DatagramSocket server = new DatagramSocket(8848);
        // 2、定义数据包,用于存储接收到的字节数据;
        byte[] container = new byte[1024];
        DatagramPacket packet = new DatagramPacket(container, container.length);
        // 3、通过socket的receive服务的接收功能,存入定义好的数据包中;
        server.receive(packet);
        // 4、数据解析
        InetAddress address = packet.getAddress();
        byte[] data = packet.getData();
        int length = packet.getLength();
        int port = packet.getPort();

        System.out.println(address);
        System.out.println(new String(data, 0, length));
        System.out.println(length);
        System.out.println(port);
        // 5、关闭资源
        server.close();
    }
}

三、TCP/Socket/ServerSocket:

  1、传输思路:

  1)客户端

1)建立socket服务,并指定要连接的主机和端口;

2)获取流,并且写入数据;

3)关闭资源;

  2)服务端

1)建立socket服务,并监听一个端口;//ServerSocket

2)获取客服的传过来的对象;accpet方法;

3)把获取到对象用socket的方法转为流来处理数据;

4)关闭资源;

  2、Socket客户端套接字:

  1)构造方法:

1Socket(InetAddress address, int port);创建一个插口,连接到指定IP和端口;

2Socket(String host, int port);

  2)核心方法:

1void close()

2InputStream getInputStream();返回插口的输入流;

3OutputStream getOutputStream();返回插口的输出流;

  3、ServerSocket服务器套接字:

  1)构造方法:ServerSocket(int port);绑定特定端口服务器套接字;

  2)核心方法:

  (1Socket accept();监听连接;//此方法在连接传入之前一直阻塞;

  (2void close();

  5、示例

    1)服务端:

public class TcpService {
    public static void main(String[] args) throws Exception {
        // 1、建立socket服务,并监听一个端口;//ServerSocket;
        ServerSocket serverSocket = new ServerSocket(10086);
        // 2、获取客服的传过来的对象;accpet方法;
        Socket socket = serverSocket.accept();
        System.out.println(socket.getInetAddress().getHostAddress());
        // 3、把获取到对象用socket的方法转为流来处理数据;
        InputStream in = socket.getInputStream();
        byte[] data=new byte[1024];
        int len=in.read(data);
        System.out.println(new String(data,0,len));
        // 5、返回数据
        OutputStream out=socket.getOutputStream();
        out.write("收到,谢谢".getBytes());
        // 4、关闭资源;
        socket.close();
        serverSocket.close();
    }
}

    2)客户端:

public class TcpClient {
    public static void main(String[] args) throws Exception {
        // 1、建立socket服务,并指定要连接的主机和端口;
        Socket socket = new Socket("127.0.0.1", 10086);
        // 2、获取流,并且写入数据;
        OutputStream out = socket.getOutputStream();
        out.write("服务器你好!".getBytes());
        // 3、获取流,读取数据;
        InputStream in = socket.getInputStream();
        byte[] data = new byte[1024];
        int len = in.read(data);
        System.out.println(new String(data, 0, len));
        // 4、关闭资源
        socket.close();
    }
}

猜你喜欢

转载自www.cnblogs.com/Tractors/p/11260339.html