一种可靠的网络协议,在通信的两端各自简历一个 SOCKET 对象 通信之前要保证连接已经建立 通过 SOCKET 产生 IO 流来进行网络通信。 socket 相当于连接通道。
在 tcp 通信程序下,如果不写 服务器代码,直接使用客户端代码去链接服务器应用,是会报错的 , 而 UDP 不会。
先启动服务端 accept 方法阻塞
客户端发送数据
示例代码
public class Client {
public static void main(String[] args) throws IOException {
// 创建socket
Socket socket = null;
try {
// 在创建对象时 会连接服务器, 三次握手协议保证连接建立 连接通道
socket = new Socket("127.0.0.1",Server.PORT);
BufferedReader reader = new BufferedReader(new InputStreamReader(socket.getInputStream()));
BufferedWriter writer = new BufferedWriter(new OutputStreamWriter(socket.getOutputStream()));
// 用户输入信息
BufferedReader read = new BufferedReader(new InputStreamReader(System.in));
String msg = read.readLine();
// 发送消息
writer.write(msg + "\n");
writer.flush();
// 读取服务器返回的消息
String s = reader.readLine();
System.out.println( s);
} finally {
if (socket != null)
socket.close();
}
}
}
public class Server {
static final int PORT = 9999;
static ServerSocket serverSocket;
public static void main(String[] args) throws IOException {
try {
serverSocket = new ServerSocket(PORT);
System.out.println("服务启动成功,监听 PORT 端口");
System.out.println(serverSocket);
Socket accept = serverSocket.accept();
System.out.println("客户端 [" + accept.getPort() + "] 已连接");
BufferedReader reader = new BufferedReader(new InputStreamReader(accept.getInputStream()));
BufferedWriter writer = new BufferedWriter(new OutputStreamWriter(accept.getOutputStream()));
// 读取客户端发送的消息
String s = reader.readLine();
if (s != null) {
System.out.println("客户端 [" + accept.getPort() + "] :" + s );
writer.write("服务器 : " + s + "\n");
writer.flush();
}
} finally {
if (serverSocket != null){
serverSocket.close();
}
}
}
}
ps : 注意乱码问题,读取中文,不能一个字节一个字节读入。 由于一个汉字占 3个字节 , 读取一个输出则会 产生 乱码问题.
注意点是
在服务器接收数据完成之前,客户端才能够断开连接。 (四次挥手原则)。
什么是 TCP 三次握手?
- 简单来说 客户端像服务器发送连接请求,等待服务器确认
- 服务器向客户端返回一个响应,告诉客户端收到了请求
- 客户端向服务器发出确认消息,连接建立。
具体的: 小林coding
什么是 TCP 四次挥手?(确保连接断开,且数据处理完毕)
- 客户端向服务端发出取消连接请求。
- 服务器向客户端返回一个响应,表示收到客户端取消请求
- 服务器向客户端发出确认取消的消息(处理数据完毕)
- 客户端再次发送确认消息,连接真正取消
具体的: 小林coding