【Java】学习路径56-TCP协议 发送、接收

Posted on 2022-05-13 17:02  罗芭Remoo  阅读(76)  评论(0编辑  收藏  举报

与UDP不同的是,TCP协议使用的是Socket,而不是DatagramSocket,这是要作区分的。

构造Socket对象的时候,可以直接指定ip地址与端口号。此时需要抛出异常。

import java.net.Socket;
public class TCP_Send {
    public static void main(String[] args) throws Exception {
        //TCP使用的是Socket
        Socket s = new Socket("127.0.0.1",8989);
    }
}

当我们运行起来的时候,直接就报出一堆异常了。

这就是TCP协议和我们之前的UDP协议的不同了。

TCP是需要建立连接,才能实现通信。

值得注意的是,在TCP协议中,我们这样规定:(可能有悖于直觉)

发送端:客户端

接收端:服务器端

具体原因我们后面再具体讲解。


在TCP协议中,我们通过“流”来传输数据,“流”的优点是可以传输大量的数据。

而UDP协议所使用的“包”DatagramPacket是有大小限制的。

下面就是我们开发出来的发送端了,也就是客户端

import java.io.OutputStream;
import java.net.Socket;

public class TCP_Send {
    public static void main(String[] args) throws Exception {
        //TCP使用的是Socket
        Socket s = new Socket("127.0.0.1",8989);

        OutputStream ops = s.getOutputStream();

        ops.write("你好我是remoo,我使用TCP协议发送一段文字".getBytes());

        s.close();
        //注,ops 可以不用关闭,Socket会自动帮我们关闭。
    }
}

下面我们开发接收端,也就是服务端:

在接收端我们使用ServerSocket。

 

import java.io.InputStream;
import java.net.ServerSocket;
import java.net.Socket;

public class TCP_Receive {
    public static void main(String[] args) throws Exception {
        ServerSocket ss = new ServerSocket(8989);

        Socket clinet = ss.accept();//会暂停,等待连接!

        InputStream input = clinet.getInputStream();

        byte[] buf = new byte[1024];
        int length = input.read(buf);

        String s = new String(buf,0,length);
        System.out.println(s);

        clinet.close();
        ss.close();
        //输入输出流,Socket会自动帮我们关闭
    }
}

 

 

如何实现循环发送、接收呢?

服务器-接收端代码:

import java.io.InputStream;
import java.net.ServerSocket;
import java.net.Socket;

public class TCP_Receive {
    public static void main(String[] args) throws Exception {
        ServerSocket ss = new ServerSocket(8989);

        Socket clinet = ss.accept();//会暂停,等待连接!

        InputStream input = clinet.getInputStream();

        byte[] buf = new byte[1024];
        while(true){
            int length = input.read(buf);
            System.out.println(new String(buf,0,length));
        }
        
//        clinet.close();
//        ss.close();
        //输入输出流,Socket会自动帮我们关闭
    }
}

客户端

import java.io.OutputStream;
import java.net.Socket;
import java.util.Scanner;

public class TCP_Send {
    public static void main(String[] args) throws Exception {
        //TCP使用的是Socket
        Socket s = new Socket("127.0.0.1",8989);

        OutputStream ops = s.getOutputStream();

        Scanner sc = new Scanner(System.in);

        while (true){
            ops.write(sc.next().getBytes());
        }
        //ops.close();

    }
}

 

效果: