Demo_01.java
package TCP;
import java.io.*;
import java.net.*;
public class Demo_01 {
public static void main(String[] args) throws Exception {
new TCPServer().listen();
}
}
// TCP服务端
class TCPServer {
private static final int PORT = 10000;
public void listen() throws Exception {
ServerSocket serverSocket = new ServerSocket(PORT);
// 使用while循环不停地接收客户端发送的请求, 可允许多个用户访问同一个服务器
while (true) {
final Socket client = serverSocket.accept();
new Thread() {
public void run() {
// 使用"带资源的try"构造, 可对try块参数表中的所有AutoCloseable对象自动调用close()
try (OutputStream os = client.getOutputStream()) {
System.out.println("开始与客户端交互数据...");
os.write(("与服务端交互数据成功...").getBytes());
Thread.sleep(5000);
System.out.println("结束与客户端交互数据...");
} catch (Exception e) {
e.printStackTrace();
}
};
}.start();
}
}
}
Demo_02.java
package TCP;
import java.io.*;
import java.net.*;
public class Demo_02 {
public static void main(String[] args) throws Exception {
new TCPClient().connect();
}
}
// TCP客户端
class TCPClient {
private static final int PORT = 10000; // 服务器的端口号
public void connect() throws Exception {
Socket client = new Socket(InetAddress.getLocalHost(), PORT);
client.setSoTimeout(10000); // 设置超时
// 使用"带资源的try"构造, 可对try块参数表中的所有AutoCloseable对象自动调用close()
try (InputStream is = client.getInputStream()) {
byte[] buf = new byte[1024];
int len = is.read(buf);
System.out.println(new String(buf, 0, len));
}
}
}
运行结果
- Demo_01.java
- Demo_02.java
总结
为了验证服务器端程序(Demo_01.java)是否实现了多线程,首先运行服务器端程序(Demo_01.java),之后运行三个客户端程序(Demo_02.java),当运行第一个客户端程序时,服务器端马上就进行数据处理,打印出“开始与客户端交互数据…”,再运行第二个和第三个客户端程序,会发现服务器端也立刻作出回应,两个客户端会话结束后分别打印各自结束信息。这说明通过多线程的方式,可以实现多个用户对同一个服务器端程序的访问。