- 要通过TCP进行通信,客户端程序和服务器程序建立彼此的连接。 每个程序将一个
套接字(Socket)
绑定到其连接的末端。 客户端和服务器通过连接的套接字进行通信。 - 客户端的编程步骤:
- 创建一个Socket, 连接服务器
- 获取Socket关联的输入、输出流
- 读、写流
- 关闭流
- 关闭Socket
- 服务器端的编程步骤:
- 创建一个ServerSocket, 用来监听端口
- 接收来自客户端的请求,获取新的Socket
- 打开新Socket关联的输入、 输出流进行读、写
- 关闭流和Socket
注:先运行服务器端程序,创建套接字,开始监听 再运行客户端程序,创建套接字连接服务器端, 不然运行会保错
服务端代码
package com.fan.work;
import java.io.*;
import java.net.ServerSocket;
import java.net.Socket;
/**
* @Author: Travelmate
* @CreateTime: 2021/2/26 0:50
* @Description: 基于Tcp的服务器端
*/
public class TcpSpeakServer {
public static void main(String[] args) {
System.out.println(" ## 服务端 ##");
try {
//创建服务器端套接字,打开端口,用于监听来自客户端的连接请求
ServerSocket serverSocket = new ServerSocket(666);
//监听客户端的连接请求,如果监听到连接,则返回一个新的套接字
Socket clientSocket = serverSocket.accept();
//用新的套接字打开输出流
PrintWriter out = new PrintWriter(clientSocket.getOutputStream(), true);
//用新套接字打开输入流
BufferedReader in = new BufferedReader(
new InputStreamReader(clientSocket.getInputStream()));
//键盘输入
BufferedReader stdIn = new BufferedReader(new InputStreamReader(System.in));
//发信息
new Thread(new Runnable() {
@Override
public void run() {
String userInput;
try {
//接收键盘输入的数据
while (((userInput = stdIn.readLine()) != null)) {
//向服务器发送信息
out.println(userInput);
System.out.println("信息发送成功");
}
} catch (IOException e) {
e.printStackTrace();
}
}
}).start();
//收信息
new Thread(new Runnable() {
@Override
public void run() {
String clientInput;
try {
//接收客户端发过来的信息
while (((clientInput = in.readLine()) != null)) {
System.out.println("# 客户端:" + clientInput);
}
} catch (IOException e) {
e.printStackTrace();
}
}
}).start();
} catch (IOException e) {
e.printStackTrace();
}
}
}
客户端代码
package com.fan.work;
import java.io.*;
import java.net.Socket;
import java.net.UnknownHostException;
/**
* @Author: Travelmate
* @CreateTime: 2021/2/26 0:43
* @Description: 基于TCP的客户端
*/
public class TcpSpeakClient {
public static void main(String[] args) {
System.out.println(" ## 客户端 ##");
//服务器的IP地址, 这里表示本机,相当于127.0.0.1
String hostName = "";
int portNumber = 666;
try {
//客户端通过创建Socket, 通过服务器的IP地址和端口号,连接服务器
Socket tcpSpeakClient = new Socket(hostName, portNumber);
//通过该Socket和服务器端通信,如果想向服务器发送信息,用Socket获取输出流
//如果想接收服务器端的信息, 用Socket获取输入流
PrintWriter out = new PrintWriter(tcpSpeakClient.getOutputStream(),true);
BufferedReader in = new BufferedReader(new InputStreamReader(tcpSpeakClient.getInputStream()));
BufferedReader stdIn = new BufferedReader(new InputStreamReader(System.in));
//发信息
new Thread(new Runnable() {
@Override
public void run() {
String userInput;
try {
//接收键盘输入的数据
while (((userInput = stdIn.readLine()) != null)) {
//向服务器发送信息
out.println(userInput);
System.out.println("信息发送成功");
}
} catch (IOException e) {
e.printStackTrace();
System.exit(1);
}
}
}).start();
//收信息
new Thread(new Runnable() {
@Override
public void run() {
String clientInput;
try {
//接收服务端发过来的信息
while (((clientInput = in.readLine()) != null)) {
System.out.println("# 服务端:" + clientInput);
}
} catch (IOException e) {
e.printStackTrace();
System.exit(1);
}
}
}).start();
} catch (UnknownHostException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}
}
}
运行结果