TCP简介
TCP(Transmission Control Protocol
传输控制协议
)是一种面向连接的、可靠的、基于字节流的
传输层
通信协议,由IETF的RFC 793定义。在简化的计算机网络OSI模型中,它完成第四层传输层所指定的功能,用户数据报协议(UDP)是同一层内[1] 另一个重要的传输协议。在因特网协议族(Internet protocol suite)中,TCP层是位于IP层之上,应用层之下的中间层。不同主机的应用层之间经常需要可靠的、像管道一样的连接,但是IP层不提供这样的流机制,而是提供不可靠的包交换。 [1]应用层向TCP层发送用于网间传输的、用8位字节表示的数据流,然后TCP把数据流分区成适当长度的报文段(通常受该计算机连接的网络的数据链路层的最大传输单元( [1] MTU)的限制)。之后TCP把结果包传给IP层,由它来通过网络将包传送给接收端实体 [1] 的TCP层。TCP为了保证不发生丢包,就给每个包一个序号,同时序号也保证了传送到接收端实体的包的按序接收。然后接收端实体对已成功收到的包发回一个相应的确认(ACK);如果发送端实体在合理的往返时延(
RTT
)内未收到确认,那么对应的数据包就被假设为已丢失将会被进行重传。TCP用一个校验和函数来检验数据是否有错误;在发送和接收时都要计算校验和
下面为大家介绍Java Socket TCP协议数据传输的用法
涉及到的java类
- ServerSocket (服务器)
- Sokcet (客户端)
- InetSocketAddress (IP、端口信息)
ServerSocket(socket服务端)
1.创建ServerSocket
ServerSocket serverSocket = new ServerSocket(2000);
这样就创建了一个ServerSocket 监听给2000端口发送的数据
2.监听客户端连接
通过调用serverSocket的accept方法接受客户端的请求
Socket socket = serverSocket.accept();
accpet方法是一个阻塞方法 只有接到客户端的连接后,才会向下继续执行
返回的对象就是客户端socket对象(包含客户端ip,端口port,终端名称等)
####3.获取客户端发送的数据
InputStream is=socket.getInputStream();
byte[] buffer=new byte[1024];
//rLen代表读取到字节数量
int rLen=is.read(buffer);
socket.getInputStream()方法拿到客户端的输入流 用来读取客户端发送的数据
创建一个1024个字节的缓冲区用于读取客户端发送字节数据,这里一般需要循环读取直到rLen的值为0 说明数据读取完毕(ps 可以创建一个字节集合存放读取的的数据)
4.发送数据给客户端
OutputStream os=socket.getOutputStream();
String responseContent="respones 数据";
//将字符数据转换成字节数组
byte[] buffer=responseContent.getBytes();
//发送到客户端
os.write(buffer);
socket.getOutputStream()获取客户端的输出流,用来发送数据给客户端
下面是完整代码实现
public static void main(String[] args) throws IOException {
//创建一个server socket
ServerSocket serverSocket = new ServerSocket(2000);
System.out.println("服务器准备就绪..");
System.out.println("服务器信息:IP " + serverSocket.getInetAddress() + " P " + serverSocket.getLocalPort());
//开启监听客户端请求
for (; ; ) {
Socket socket = serverSocket.accept();
ClientHandler clientHandler = new ClientHandler(socket);
clientHandler.start();
}
}
public static class ClientHandler extends Thread {
private final Socket socket;
public ClientHandler(Socket socket) {
this.socket = socket;
}
@Override
public void run() {
super.run();
System.out.println("新客户端连接:IP " + socket.getInetAddress() + " P " + socket.getPort());
try {
PrintStream printStream = new PrintStream(socket.getOutputStream());
InputStream inputStream = socket.getInputStream();
BufferedReader socketInput = new BufferedReader(new InputStreamReader(inputStream));
while (true) {
String receiveMsg = socketInput.readLine();
if ("bye".equals(receiveMsg)) {
printStream.println("bye");
break;
} else {
System.out.println(receiveMsg);
printStream.println("server 说:" + receiveMsg.length());
}
}
socketInput.close();
printStream.close();
} catch (Exception e) {
e.printStackTrace();
System.out.println("连接异常断开");
} finally {
try {
socket.close();
} catch (IOException e) {
e.printStackTrace();
}
}
System.out.println("客户端断开连接:IP " + socket.getInetAddress() + " P " + socket.getPort());
}
}
Socket客户端
1.创建并连接SocketServer
//创建一个socket客户端对象
Socket socket = new Socket();
//连接服务器 ip 端口port 2000 超时时间3000毫米
socket.connect(new InetSocketAddress(Inet4Address.getLocalHost(), 2000),3000);
2.获取输出流用于发送数据
OutputStream outputStream = socket.getOutputStream();
String requestContent="request 数据";
//将字符数据转换成字节数组
byte[] buffer=requestContent.getBytes();
//发送到服务器
os.write(buffer);
3.获取输入流用于读取server发送的数据
InputStream is=socket.getInputStream();
byte[] buffer=new byte[1024];
//rLen代表读取到字节数量
int rLen=is.read(buffer);
拿到server的数据进行处理
下面是客户端的完整代码实现
public static void main(String[] args) throws IOException {
Socket socket = new Socket();
socket.connect(new InetSocketAddress(Inet4Address.getLocalHost(), 2000),3000);
System.out.println("发起服务器连接...");
System.out.println("客户端信息:IP " + socket.getLocalAddress() + " P " + socket.getLocalPort());
System.out.println("服务器信息:IP " + socket.getInetAddress() + " P " + socket.getPort());
try {
send(socket);
} catch (Exception e) {
e.printStackTrace();
System.out.println("异常关闭");
} finally {
socket.close();
System.out.println("客户端已退出");
}
}
public static void send(Socket socket) throws IOException {
InputStream in = System.in;
//键盘输入流
BufferedReader input = new BufferedReader(new InputStreamReader(in));
InputStream socketInputStream = socket.getInputStream();
BufferedReader socketBufferedReader = new BufferedReader(new InputStreamReader(socketInputStream));
OutputStream outputStream = socket.getOutputStream();
PrintStream printStream = new PrintStream(outputStream);
while (true) {
String request = input.readLine();
printStream.println(request);
String response = socketBufferedReader.readLine();
if ("bye".equals(response)) {
break;
} else {
System.out.println(response);
}
}
input.close();
socketBufferedReader.close();
printStream.close();
}
这就是tcp Java socket api的基本使用
下篇准备给大家讲下UDP相关知识以及用法