TCP基本概述
TCP是一种运输层的网络协议,是一种面向连接,
可靠的,基于字节流的网络协议。进行TCP通信的时候,双方一定要先建立连接,也就是三次握手,建立稳定连接后,接下来就是我们的通信了接下来就可以进行正常的发送和接收数据。收发数据的时候是基于字节流的
三次握手解读
第一次握手
syn=1:这是SYN标志位,用于请求建立连接。表明客户端希望与服务器建立连接
seq=x:这是序列号字段,用于指定发送数据的起始序号,x为该段数据的序列号,接收数据方通过序列号来确认数据
ack=null:第一次握手中,由于客户端尚未收到服务器的确认,因此ack字段不携带任何值
第二次握手
syn=1:表明服务器希望与客户端建立连接
seq=y:该字段指定服务器发送的数据包的起始序列号,y为序列号
ack=1:这是确认号字段,用于确认收到的数据。在第二次握手中,服务器接收到客户端的请求后,对其进行确认,因此将ack字段设置为1
ACK=y+1:表示服务器期望接收到下一个序列号为x+1的数据。
第三次握手
syn=0:表示不再请求建立连接,而是确认连接已经建立
seq=y+1:该字段指定客户端发送的数据包的起始序列号,y+1为服务器想收到的序列号
ack=1:在第三次握手中,客户端接收到服务器的确认后,对其进行确认,并将ack字段设置为1
TCP编程之服务器编程步骤
1.创建ServerSocket并指定端口号
2.等待客户端连接
3.获取输入流和输出流
4.从客户端接收数据
5.向客户端发送数据
6.关闭连接和关流
代码举例
import java.net.ServerSocket;
import java.net.Socket;
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
public class TCPServer {
public static void main(String[] args) {
try {
// 创建ServerSocket并指定端口
ServerSocket serverSocket = new ServerSocket(8888);
System.out.println("服务器,已经启动,等待连接。。。。");
// 等待客户端连接
Socket clientSocket = serverSocket.accept();
System.out.println("客户端已经连接: " + clientSocket.getInetAddress().getHostAddress());
// 获取输入流和输出流
InputStream inputStream = clientSocket.getInputStream();
OutputStream outputStream = clientSocket.getOutputStream();
// 从客户端接收数据
byte[] buffer = new byte[1024];
int bytesRead = inputStream.read(buffer);
String receivedMessage = new String(buffer, 0, bytesRead);
System.out.println("来自客户端的信息: " + receivedMessage);
// 向客户端发送数据
String responseMessage = "你~好,我是服务器";
outputStream.write(responseMessage.getBytes());
// 关闭连接
inputStream.close();
outputStream.close();
clientSocket.close();
serverSocket.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}
TCP编程之客户端编程步骤
1.连接到服务器
2.获取输入流和输出流
3.向服务器发送数据
4.从服务器接收数据
5.关闭连接和关流
代码举例
import java.net.Socket;
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
public class TCPClient {
public static void main(String[] args) {
try {
// 连接到服务器
Socket socket = new Socket("localhost", 8888);
System.out.println("连接到服务器");
// 获取输入流和输出流
InputStream inputStream = socket.getInputStream();
OutputStream outputStream = socket.getOutputStream();
// 向服务器发送数据
String message = "你~好,我是客户端";
outputStream.write(message.getBytes());
// 从服务器接收数据
byte[] buffer = new byte[1024];
int bytesRead = inputStream.read(buffer);
String receivedMessage = new String(buffer, 0, bytesRead);
System.out.println("来自服务器的信息: " + receivedMessage);
// 关闭连接
inputStream.close();
outputStream.close();
socket.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}