Javaの基礎、TCPおよびUDPプロトコルに基づくソケットの使用方法

Javaベースのソケットを使用するための特定のコード

TCPプロトコルに基づくソケットを使用して、クライアントの送信データとサーバーの受信データをシミュレートします

    @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プロトコルは、信頼できる接続を確立するために3ウェイハンドシェイクを必要とする通信プロトコルであるためです。
  • なぜそれは3回、1回ではなく、2回ではなく、それ以上なのですか?
    その理由は、信頼性の高い接続を1〜2回確立することができず、何度でも接続の信頼性の向上は最小限であるが、接続の確立のために多くのリソースが消費されるためです。
    TCP接続プロセスは次のように類推できます。
    クライアント:私は張三豊です。あなたは誰ですか。
    サーバー:あなたが張三豊で、私は李弗です。
    クライアント:私が張三豊であり、あなたが李弗であることをあなたが知っていることを私は知っています。
    対照的に、TCPプロトコルはデータ送信を可能な限り完全にすることであり、UDPは信頼性の低い接続方法ですが、UDPプロトコルは、ビデオのスムーズさを可能な限り保証するために、ネットワークビデオ送信など、役に立たないわけではありません。は許容範囲であり、一般的なスパムメッセージの攻撃もUDPプロトコルに基づいています。

webSocketとソケットの違い

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

UDPベースのソケットの使用

    @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