以下展示一个最简单的tcp网络编程的案例。创建一个socket server和一个socket client,在client端的控制台输入字符串,能即时地把这些字符串通过tcp协议传输到server端。
服务端
以下是服务端的代码:
public class Server {
private final int port;
public Server(int port) {
this.port = port;
}
public void start() {
// 创建socket server,指定端口号
try (ServerSocket server = new ServerSocket(port)) {
System.out.println("Server started!");
System.out.println("Waiting for a client...");
// 监听指定的端口号,等待客户端来连接
Socket socket = server.accept();
System.out.println("Client accepted!");
// 连接创建后,获取输入流
DataInputStream in = new DataInputStream(new BufferedInputStream(socket.getInputStream()));
String line = "";
while (!"over".equals(line)) {
// 读取连接中输入的数据
line = in.readUTF();
System.out.println("Server receive : "+ line);
}
System.out.println("Closing connection...");
// 关闭资源
socket.close();
in.close();
} catch (IOException e) {
e.printStackTrace();
}
}
public static void main(String[] args) {
Server server = new Server(17121);
server.start();
}
}
客户端
以下是客户端的代码:
public class Client {
public Client(String address, int port) {
try {
// 创建socket连接到指定主机和端口
Socket socket = new Socket(address, port);
System.out.println("Connected!");
// 控制台输入的输入流,用于从控制台输入字符串
DataInputStream input = new DataInputStream(System.in);
// 创建socket的输出流,用于向服务端发送数据
DataOutputStream out = new DataOutputStream(socket.getOutputStream());
String line = "";
while (!"over".equals(line)) {
// 从控制台读取一行字符串
line = input.readLine();
// 将读取的字符串写入socket
out.writeUTF(line);
}
// 关闭资源
input.close();
out.close();
socket.close();
} catch (IOException e) {
e.printStackTrace();
}
}
public static void main(String[] args) {
Client client = new Client("127.0.0.1", 17121);
}
运行
先启动服务端,然后启动客户端,在客户端的终端控制台中输入字符串,按回车,服务端能够即时收到客户端发送过来的字符串。
其中的过程是在客户端和服务端之间建立了一条tcp连接,通过tcp连接将客户端发送的数据传输到了服务端。
以下是客户端输出:
Connected!
hello server
i am client
ok bye bye
over
然后再来看服务端的输出:
Server started!
Waiting for a client...
Client accepted!
Server receive : hello server
Server receive : i am client
Server receive : ok bye bye
Server receive : over
Closing connection...