TCP协议:
传输控制协议 (Transmission Control Protocol)
TCP协议是面向连接的通信协议,即传输数据之前,在发送端和接收端建立逻辑连接,然后再传输数据,它提供了两台计算机之间可靠无差错的数据传输。在TCP连接中必须要明确客户端与服务器端,由客户端向服务端发出连接请求,每次连接的创建都需要经过“三次握手”
三次握手:TCP协议中,在发送数据的准备阶段,客户端与服务器之间的三次交互,以保证连接的可靠
- 第一次握手,客户端向服务器端发出连接请求,等待服务器确认
- 第二次握手,服务器端向客户端回送一个响应,通知客户端收到了连接请求
- 第三次握手,客户端再次向服务器端发送确认信息,确认连接
准备要断开连接的四次挥手
Java为客户端提供了Socket类,为服务端提供了ServerSocket类
Socket类的构造器方法
方法名 | 说明 |
---|---|
Socket(InetAddreess address,int port) | 创建流套接字并将其连接指定IP,指定端口号 |
Socket(String host,int post) | 创建流套接字并将其连接到指定主机上的指定端口号 |
相关方法
方法名 | 说明 |
---|---|
InoutStream getInputStream() | 返回此套接字的输入流 |
OutPutStream getOutputStream() | 返回此套接字的输出流 |
ServerSocket类的构造器方法
f方法名 | 说明 |
---|---|
ServerSocket(int port) | 创建服务器的套接字绑定到指定的端口 |
相关方法
方法名 | 说明 |
---|---|
Socket accpet() | 监听要连接到的套接字并接受它 |
accpet方法是堵塞的,作用就是等待客户端的连接 | |
read方法也是阻塞的 |
测试
客户端
public static void main(String[] args) throws IOException {
/**
* 1.创建客户端的Socket对象,绑定到指定的IP和端口号
* 2.获取输出流,写数据发送过去
*/
Socket socket = new Socket (InetAddress.getByName ("192.168.1.52"),4399);
OutputStream os = socket.getOutputStream ();
os.write ("天皇盖地虎".getBytes ());
socket.shutdownOutput ();
InputStream ss = socket.getInputStream ();
byte[] arr = new byte[1024];
int len ;
while ((len=ss.read (arr))!=-1){
String msg = new String (arr, 0, len);
System.out.println (msg);
}
ss.close ();
os.close ();
socket.close ();
}
服务端
public static void main(String[] args) throws IOException {
/**
* 1.创建服务器的ServerSocket对象,绑定指定的端口号
* 2.ServerSocket对象调用accpet堵塞方法,也就是只有一个客户端连接
* 3获取输入流,读数据
*/
ServerSocket serverSocket = new ServerSocket (4399);
Socket accept = serverSocket.accept ();
InputStream is = accept.getInputStream ();
/* int len ;
while ((len=is.read ())!=-1){
System.out.println ((char) len);
}*/
byte[] arr = new byte[1024];
int len ;
while ((len=is.read (arr))!=-1){
String msg = new String (arr, 0, len);
System.out.println (msg);
}
//回复信息给客户端
OutputStream ss = accept.getOutputStream ();
ss.write ("宝塔镇河妖".getBytes ());
//关闭资源
ss.close ();
is.close ();
serverSocket.close ();
}