Java基础,基于TCP和UDP协议的Socket的使用方法

Java基础Socket的使用方法具体代码

基于TCP协议的Socket使用,模拟客户端发送数据,服务端接受数据

    @Test
    public void client() throws IOException {
    
    

        //创建socket对象,指明服务器的ip和端口号
        InetAddress inetAddress = InetAddress.getByName("127.0.0.1");
        Socket socket = new Socket(inetAddress,8899);

        //获取一个输出流,用于输出数据
        OutputStream outputStream = socket.getOutputStream();
        //写出数据
        outputStream.write("我是客户端大姐".getBytes());
        //资源的关闭
        outputStream.close();
        socket.close();
    }

    @Test
    public void server() throws IOException {
    
    
        
        //创建serverSocket,指明自己的端口号
        ServerSocket serverSocket = new ServerSocket(8899);
        //调用accept()方法表示接受来自客户端的socket
        Socket socket = serverSocket.accept();
        //读入收入流的数据
        InputStream inputStream = socket.getInputStream();
        //不建议这么写(会导致数据丢失)
//        byte[] bytes = new byte[5];
//        int len;
//        while((len = inputStream.read(bytes)) != -1) {
    
    
//            String str = new String(bytes,0,len);
//            System.out.println(str);
//        }
        //建议这么写
        ByteArrayOutputStream byteArrayInputStream = new ByteArrayOutputStream();
        byte[] bytes = new byte[10];
        int len;
        while ((len = inputStream.read(bytes)) != -1){
    
    
            byteArrayInputStream.write(bytes,0,len);
        }
        System.out.println(byteArrayInputStream.toString());
        
        //关闭资源
        byteArrayInputStream.close();
        inputStream.close();
        socket.close();
        serverSocket.close();
    }

服务端接受到图片之后给客户端一个反馈

 @Test
    public void client() throws IOException {
    
    

        //创建socket对象,指明服务器的ip和端口号
        InetAddress inetAddress = InetAddress.getByName("127.0.0.1");
        Socket socket = new Socket(inetAddress,8899);

        //获取一个输出流,用于输出数据
        OutputStream outputStream = socket.getOutputStream();
        //写出数据
        File file = new File("三刀流索隆.jpg");

        FileInputStream fileInputStream = new FileInputStream(file);
        byte[] buffer = new byte[20];
        int len;
        while((len = fileInputStream.read(buffer))!= -1){
    
    
            outputStream.write(buffer,0,len);
        }
        //关闭数据的输出
        socket.shutdownOutput();

        //客户端发送完数据,等待服务端相应,把消息相应到控制台。
        InputStream inputStream = socket.getInputStream();
        ByteArrayOutputStream byteArrayOutputStream = new ByteArrayOutputStream();
        while((len = inputStream.read(buffer)) != -1){
    
    
           byteArrayOutputStream.write(buffer,0,len);
        }
        System.out.println(byteArrayOutputStream.toString());
        //资源的关闭
        inputStream.close();
        byteArrayOutputStream.close();
        outputStream.close();
        socket.close();
    }

    @Test
    public void server() throws IOException {
    
    

        //创建serverSocket,指明自己的端口号
        ServerSocket serverSocket = new ServerSocket(8899);
        //调用accept()方法表示接受来自客户端的socket
        Socket socket = serverSocket.accept();
        //读入收入流的数据
        InputStream inputStream = socket.getInputStream();

        File file = new File("另一个三刀流索隆.jpg");
        FileOutputStream fileOutputStream = new FileOutputStream(file);
        byte[] buffer = new byte[20];
        int len;
        while ((len = inputStream.read(buffer)) != -1){
    
    
            fileOutputStream.write(buffer,0,len);
        }
        System.out.println("服务器接受到图片");

        //服务端接受到数据之后给客户端一个反馈
        OutputStream outputStream = socket.getOutputStream();
        outputStream.write("服务端已经接受到来自客户端的数据!".getBytes());

        //关闭资源
        	fileOutputStream.close();
        	outputStream.close();
            inputStream.close();
            socket.close();
            serverSocket.close();
    }
  • 客户端发送完数据需要执行如下代码,告诉服务端我发送完全部数据了。
    socket.shutdownOutput();
  • 需要先启动服务端,在启动客户端。因为TCP协议是一种需要通过三次握手来建立可靠连接的通信协议。
  • 为什么是三次,不是一次不是两次也不是更多次数呢?
    原因是一次两次无法建立可靠的连接,再多次数对连接可靠性的提升也仅仅是微乎其微的,反而因为建立连接而消耗了过多的资源。
    TCP的连接过程可以类比为:
    客户端:我是张三,你是谁?
    服务端:我知道你是张三了,我是李四。
    客户端:我知道你知道我是张三,你是李四了。
    相比之下,TCP协议是确保数据尽可能的传输完整,UDP是不可靠的连接方式,但是UDP协议并非没有用武之地,比如网络视频的传输,要尽可能的保证视频的流畅,偶尔的丢帧是可以接受的,一般的垃圾短信的炮轰也是基于UDP协议的。

webSocket与socket区别

https://www.cnblogs.com/Javi/p/9303020.html

基于UDP的Socket使用

    @Test
    public void client() throws IOException {
    
    
        DatagramSocket datagramSocket = new DatagramSocket();
        String str = "这是基于UPD协议发送的文字";
        byte[] data = str.getBytes();
        InetAddress localHost = InetAddress.getLocalHost();
        DatagramPacket datagramPacket = new DatagramPacket(data, 0, data.length, localHost, 9000);
        datagramSocket.send(datagramPacket);
        datagramSocket.close();
    }
    
    @Test
    public  void server() throws IOException {
    
    
        DatagramSocket datagramSocket = new DatagramSocket(9000);
        byte[] buffer = new byte[1024];
        DatagramPacket datagramPacket = new DatagramPacket(buffer,0,buffer.length);
        datagramSocket.receive(datagramPacket);
        System.out.println(new String(datagramPacket.getData(),0,datagramPacket.getLength()));
    }
  • 这里可以先启动客户端在启动服务端,并不会报错,因为UDP是一种不需要建立可靠连接的协议。

猜你喜欢

转载自blog.csdn.net/weixin_43941676/article/details/108434698