简单的TCP网络程序
通过前面两个小节的讲解,了解了ServerSocket、Socket类的基本用法,为了让初学者更好地掌握这两个类,接下来通过一个TCP通信的案例来进一步学习这两个类的基本使用。
要实现TCP通信需要创建一个服务器端程序和一个客户端程序,为了保证数据传输的安全性,首先需要实现服务器端程序,如文件1所示。
文件1 TCPServer.java
1 import java.io.*;
2 import java.net.*;
3 // TCP服务端
4 public class TCPServer {
5 public static void main(String[] args) throws Exception {
6 // 创建指定端口号为7788的服务端ServerSocket对象
7 ServerSocket serverSocket = new ServerSocket(7788);
8 while (true){
9 // 调用ServerSocket的accept()方法开始接收数据
10 Socket client= serverSocket.accept();
11 System.out.println("与客户端连接成功,开始进行数据交互!");
12 // 获取客户端的输出流对象
13 OutputStream os = client.getOutputStream();
14 // 当客户端连接到服务端时,向客户端输出数据
15 os.write(("服务器端向客户端做出响应!").getBytes());
16 // 模拟与客户端交互耗时
17 Thread.sleep(5000);
18 // 关闭流和Socket连接
19 os.close();
20 client.close();
21 }
22 }
23 }
运行结果如图1所示。
图1 运行结果
文件1中,创建了一个服务器端程序,用于接收客户端发送的数据。在创建ServerSocket对象时指定了服务器端的端口号为7788,并在while循环中调用该对象的accept()方法持续监听客户端连接。其中,在执行accept()方法时,程序会发生阻塞,直到有客户端来访问时才会结束这种阻塞状态同时会返回一个Socket类型的对象用于表示客户端,通过该对象可以获取与客户端关联的输出流并向客户端发送信息,同时执行Thread.sleep(5000)语句模拟服务器端与客户端交互占用的时间。最后,调用Socket对象的close()方法将通信结束。
完成了服务器端程序的编写,接下来编写客户端程序,如文件1所示。
文件1 TCPClient.java
1 import java.io.*;
2 import java.net.*;
3 // TCP客户端
4 public class TCPClient {
5 public static void main(String[] args) throws Exception {
6 // 创建一个Socket并连接到指定的服务器端
7 Socket client = new Socket(InetAddress.getLocalHost(),7788);
8 // 获取服务端返回的输入流数据并打印
9 InputStream is = client.getInputStream();
10 byte[] buf = new byte[1024];
11 int len = is.read(buf);
12 while (len != -1){
13 System.out.println(new String(buf, 0, len));
14 len = is.read(buf);
15 }
16 // 关闭流和Socket连接
17 is.close();
18 client.close(); // 关闭Socket对象,释放资源
19 }
20 }
运行结果如图1所示。
图1 运行结果
文件1中,创建了一个客户端程序,用于向指定服务端发送连接并进行数据交互。在客户端创建Socket对象与服务器端建立连接后,会打印出“服务器端向客户端做出响应”,如图1所示。
同时,文件1中的服务端程序结束了阻塞状态,会打印出“与客户端连接成功,开始进行数据交互!”,如图2所示。
图2 运行结果