目录
- TCP 通信程序
- 1. TCP 协议概述
- 2. TCP 通信案例
- a. 客户端向服务器发送数据
- b. 服务器向客户端回写数据
- c. 输出结果
TCP 通信程序
1. TCP 协议概述
- TCP 协议是面向连接的通信协议,即在传输数据前先在客户端和服务器端建立逻辑连接,然后再传输数据。它提供了两台计算机之间可靠无差错的数据传输。TCP 通信过程如下图所示:
TCP ==> Transfer Control Protocol ==> 传输控制协议
TCP 协议的特点
* 面向连接的协议
* 只能由客户端主动发送数据给服务器端,服务器端接收到数据之后,可以给客户端响应数据。
* 通过三次握手建立连接,连接成功形成数据传输通道。
* 通过四次挥手断开连接
* 基于 IO 流进行数据传输
* 传输数据大小没有限制
* 因为面向连接的协议,速度慢,但是是可靠的协议。TCP 协议的使用场景
* 文件上传和下载
* 邮件发送和接收
* 远程登录TCP 协议相关的类
* Socket
* 一个该类的对象就代表一个客户端程序。
* ServerSocket
* 一个该类的对象就代表一个服务器端程序。Socket 类构造方法
* Socket(String host, int port)
* 根据 IP 地址字符串和端口号创建客户端 Socket 对象
* 注意事项:只要执行该方法,就会立即连接指定的服务器程序,如果连接不成功,则会抛出异常。
如果连接成功,则表示三次握手通过。Socket 类常用方法
* OutputStream getOutputStream(); 获得字节输出流对象
* InputStream getInputStream(); 获得字节输入流对象
2. TCP 通信案例
a. 客户端向服务器发送数据
import java.io.InputStream;
import java.io.OutputStream;
import java.net.ServerSocket;
import java.net.Socket;
/**
TCP服务器端代码实现
ServerSocket类构造方法
* ServerSocket(int port) 根据指定的端口号开启服务器。
ServerSocket类常用方法
* Socket accept() 等待客户端连接并获得与客户端关联的Socket对象
TCP服务器端代码实现步骤
* 创建ServerSocket对象并指定端口号(相当于开启了一个服务器)
* 调用ServerSocket对象的accept方法等待客端户连接并获得对应Socket对象
* 调用Socket对象的getInputStream方法获得字节输入流对象
* 调用字节输入流对象的read方法读取客户端发送的数据
* 调用Socket对象的getOutputStream方法获得字节输出流对象
* 调用字节输出流对象的write方法往客户端输出数据
* 关闭Socket和ServerSocket对象
*/
public class TCPServer {
public static void main(String[] args)throws Exception{
System.out.println("I am Server.");
// 创建服务器ocket对象
ServerSocket serverSocket = new ServerSocket(9000);
// 等待客户端连接并获得与客户端关联的Socket对象
Socket socket = serverSocket.accept();
// 获得字节输入流对象
InputStream in = socket.getInputStream();
// 创建字节数组:用来存储读取到客户端发送的数据
byte[] buf = new byte[1024];
// 读取客户端发送过来的数据
int len = in.read(buf);
System.out.println("Client send: " + new String(buf,0,len));
System.out.println("Length of content = " + len);
// 获得字节输出流对象
OutputStream out = socket.getOutputStream();
// 往客户端输出数据
out.write("Here.".getBytes());
// 关闭socket
socket.close();
// 关闭服务器(在实际开发中,服务器一般不会关闭)
serverSocket.close();
}
}
b. 服务器向客户端回写数据
import java.io.InputStream;
import java.io.OutputStream;
import java.net.Socket;
/*
TCP客户端代码实现步骤
* 创建客户端Socket对象并指定服务器地址和端口号
* 调用Socket对象的getOutputStream方法获得字节输出流对象
* 调用字节输出流对象的write方法往服务器端输出数据
* 调用Socket对象的getInputStream方法获得字节输入流对象
* 调用字节输入流对象的read方法读取服务器端返回的数据
* 关闭Socket对象断开连接。
*/
// TCP客户端代码实现
public class TCPClient {
public static void main(String[] args) throws Exception{
System.out.println("I am Client.");
// 要发送的内容
String content = "Where is Regino's Bidirectional Transmission?";
// 创建Socket对象
Socket socket = new Socket("127.0.0.1",9000);
// System.out.println(socket);
// 获得字节输出流对象
OutputStream out = socket.getOutputStream();
// 输出数据到服务器端
out.write(content.getBytes());
// 获得字节输入流对象
InputStream in = socket.getInputStream();
// 创建字节数组:用来存储读取到服务器端数据
byte[] buf = new byte[1024];
// 读取服务器端返回的数据
int len = in.read(buf);
System.out.println("Server send: " + new String(buf,0,len));
System.out.println("Length of content = " + len);
// 关闭socket对象
socket.close();
}
}
c. 输出结果