public class Server { public static void main(String[] args) throws IOException { ServerSocket ss = new ServerSocket(8080); // 监听指定端口 System.out.println("server is running..."); for (;;) { Socket sock = ss.accept(); System.out.println("connected from " + sock.getRemoteSocketAddress()); Thread t = new Handler(sock); t.start(); } } }
时间: 2024-02-14 08:05:59 浏览: 117
这段代码是一个简单的 Java 服务器的实现,它监听指定的端口并接受客户端连接。当有客户端连接时,它将创建一个新的线程处理客户端请求。所以,这段代码实现了一个基于线程的并发服务器。其中,ServerSocket 类用于监听端口,accept() 方法用于接受客户端连接,Handler 类用于处理客户端请求。当有新的客户端连接时,它将创建一个新的 Handler 线程来处理该连接。这样,服务器就可以同时处理多个客户端请求。
相关问题
public static void main(String[] args) throws IOException { // 创建socket,绑定到65000端口 ServerSocket serverSocket = new ServerSocket(65000); // 循环用以监听 while (true) {// 这是多线程的,通过循环创建多个socket来实现 // 监听65000端口,直到有客户端信息发过来 Socket socket = serverSocket.accept(); // 执行相关操作\ TCPServer server = new TCPServer(); server.setupServer(65000); } } public void setupServer(int port) { try { ServerSocket ss = new ServerSocket(port); System.out.println("server have been started!"); while (true) { Socket sc = ss.accept(); System.out.println("have connected " + sc.getRemoteSocketAddress()); // 等待从客户端传过来的消息 // 调用处理连接来处理连接 communicationProcess(sc); } } catch (Exception e) { e.printStackTrace(); } }如何修改
你可以将两个while循环合并成一个,将监听端口和处理连接的操作放在同一个方法中,然后在main方法中直接调用该方法。修改后的代码如下:
```
public static void main(String[] args) throws IOException {
// 创建socket,绑定到65000端口
ServerSocket serverSocket = new ServerSocket(65000);
// 循环用以监听
while (true) {// 这是多线程的,通过循环创建多个socket来实现
// 监听65000端口,直到有客户端信息发过来
Socket socket = serverSocket.accept();
// 执行相关操作
setupServer(socket);
}
}
public static void setupServer(Socket socket) {
try {
System.out.println("server have been started!");
System.out.println("have connected " + socket.getRemoteSocketAddress());
// 等待从客户端传过来的消息
// 调用处理连接来处理连接
communicationProcess(socket);
} catch (Exception e) {
e.printStackTrace();
}
}
public static void communicationProcess(Socket socket) throws IOException {
// 处理连接的代码
}
```
这样就可以通过一个方法来实现监听端口和处理连接的操作,并且可以直接将socket作为参数传递给该方法。
class ServerThread implements Runnable { Socket socket; char[] cbuf; public ServerThread(Socket socket) { super(); this.socket = socket; } @Override public void run() { try { BufferedReader netIn2 = new BufferedReader(new InputStreamReader( socket.getInputStream())); System.out.println(netIn2.readLine()); // 从网络套接字获取输出流,建立打印输出流 PrintWriter netOut2 = new PrintWriter(socket.getOutputStream()); netOut2.write("你好\n"); netOut2.flush(); } catch (IOException e) { // TODO Auto-generated catch block e.printStackTrace(); } } } public class ServerTest { public static void main(String[] args) throws Exception { int PORT = 8888; // 侦听端口 // 创建ServerSocket ServerSocket serverSocket = new ServerSocket(PORT); // 开始循环 while (true) { // 等待连接 Socket socket = (1) ; // 处理链接的线程类 ServerThread st = new ServerThread(socket); // 启动线程处理 new Thread(st).start(); } } }
这段Java代码是一个简单的Socket服务器程序,其中ServerTest类是服务器程序的主类,ServerThread类是处理连接请求的线程类。
在主类ServerTest的main方法中,通过创建ServerSocket对象并指定端口号来创建一个TCP服务器,在while循环中不断等待客户端的连接,当有客户端连接进来后,创建一个Socket对象来处理连接请求。然后将新创建的Socket对象作为参数传入ServerThread的构造函数中,创建一个ServerThread线程对象,最后通过启动线程来处理客户端的请求。
在ServerThread的run方法中,通过socket.getInputStream()方法获取到输入流,然后通过BufferedReader的readLine()方法来读取客户端发送过来的信息。接着通过socket.getOutputStream()方法获取到输出流,然后通过PrintWriter的write()方法向客户端发送信息。最后通过调用flush()方法将输出流缓冲区中的内容发送到客户端。如果出现异常,就通过printStackTrace()方法打印出异常信息。
阅读全文