展开全部
// 在服务器上部署的程序
package wang.socket.Server;
// java 提供的网络功能包
import java.net.*;
// java 提供的输入输出的32313133353236313431303231363533e58685e5aeb931333264636333功能包
import java.io.*;
// 使用线程来处理Socket请求
public class ThreadServer {
public static void main(String[] args) throws Exception {
// 监听服务
ServerSocket server;
// 启动一个监听服务器
server = new ServerSocket(9999);
System.out.println("---------> 一个Socket监听服务器启动:" + server.toString());
while (true) {//循环地响应客户端的请求
//获得客户端连接,也就是要建立一个Socket套接字,由于没有使用线程,多个客户端连接会排队
// ServerSocket的接收套接字的方法是采用队列并等待的方式,如果没有呼入连接,则程序在等待,不向下执行.
Socket client = server.accept();
// 创建线程,让线程去应答客户的请求
new ServerThread(client).start();
}
}
}
// 以线程处理客户的请求
class ServerThread extends Thread {
//主程序的main函数会把创建的Socket作为参数传递给线程执行.
private Socket sk;
public ServerThread(Socket s) {
this.sk = s;
}
@Override
public void run() {
System.out.println("(一个客户请求:)" + this.sk.toString());
// 缓冲区读取器
BufferedReader in;
// 响应器
PrintWriter out;
// 取得客户端的计算机的IP地址
String remoteIP = this.sk.getInetAddress().getHostAddress();
// 取得客户端用于通讯的端口号
int remotePort = this.sk.getLocalPort();
// 在服务器的监控台上显示客户端接入的信息
System.out.println("一个客户端正在连入, IP:" + remoteIP + ", 端口: " + remotePort);
//获得 client 端的输入输出流,为进行交互做准备
try {
in = new BufferedReader(new InputStreamReader(this.sk.getInputStream()));
//获得输出
out = new PrintWriter(this.sk.getOutputStream(), true);
//获得 client 端发送的数据