java - Java 中的多线程 Web 服务器

标签 java multithreading sockets server java-server

我正在尝试用 Java 构建一个服务器。 我的问题是:如果我同时有多个用户怎么办?答案是:多线程。但我不知道该怎么办。

例如,如果有两个客户端同时连接,还有一个服务器(执行 2*number):如果客户端 1 对服务器说“50”,而客户端 2 对服务器说“10”,则认为服务器将“100”返回给第一个客户端,将“20”返回给第二个客户端。但我不确定我的代码是否有效。

服务器端:

public class Server {
public static void main(String[] args){
    ServerSocket socket;
    try {
    socket = new ServerSocket(4444);
    Thread t = new Thread(new Accept(socket));
    t.start();
    } catch (IOException e) {
        e.printStackTrace();
    }
}

class Accept implements Runnable {
   private ServerSocket socketserver;
   private Socket socket;
   private int nbrclient = 1;
    public Accept(ServerSocket s){
        socketserver = s;
    }
    public void run() {
        try {
          socket = socketserver.accept();
          in = new BufferedReader (new InputStreamReader (socket.getInputStream()));
            String message = in.readLine();
            System.out.println(message);

            out = new PrintWriter(socket.getOutputStream());
            out.println("Pong");
            out.flush();
            socket.close();
        } catch (IOException e) {
            e.printStackTrace();
        }
    }
}

客户端:

 public class Client {
    public static void main(String[] zero) {    
        Socket socket;
        BufferedReader in;
        PrintWriter out;
        try {
            socket = new Socket(InetAddress.getLocalHost(),4444);   
            out = new PrintWriter(socket.getOutputStream());
            out.println("Ping");
            out.flush();
            in = new BufferedReader (new InputStreamReader (socket.getInputStream()));
            String message = in.readLine();
            System.out.println(message);
            socket.close();
        }catch (UnknownHostException e) {
            e.printStackTrace();
        }catch (IOException e) {
            e.printStackTrace();
        }
    }

}

如果您有任何想法(如何进行多线程以及如何验证我的代码是否有效,例如运行两个 Clients.java 并检查多线程是否有效)

最佳答案

服务器端需要一个while循环:

public class Server {
public static void main(String[] args){
    ServerSocket socket;
    try {
        while(true){
            socket = new ServerSocket(4444);
            Socket socketInstance = socket.accept();
            Thread t = new Thread(new Accept(socketInstance));
            t.start();
        }
    } catch (IOException e) {
        e.printStackTrace();
    }
}

class Accept implements Runnable {
   private Socket socket;
   private int nbrclient = 1;
    public Accept(Socket s){
        socket = s;
    }
    public void run() {
        try {

            in = new BufferedReader (new InputStreamReader (socket.getInputStream()));
            String message = in.readLine();
            System.out.println(message);//this message should be your number
            Double number = Double.parseString(message);

            out = new PrintWriter(socket.getOutputStream());
            //out.println("Pong");
            out.println(2*number +"");
            out.flush();
            socket.close();
        } catch (IOException e) {
            e.printStackTrace();
        }
    }
}

客户端看起来不错。只需将 out.println("Ping"); 替换为 out.println("50"); 或您想要的任何内容。

您首先启动服务器,然后可以启动多个客户端应用程序。如果您有任何错误,可以将其发布到此处并查看确切的场景。

关于java - Java 中的多线程 Web 服务器,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38129204/

相关文章:

python - 非阻塞套接字可以从读取器/写入器引发 BlockingIOError 吗?

c - 需要声明不相关的字符数组以避免程序卡住

node.js - golang tcp socket - 处理多条消息

java - RecyclerView 没有出现在我的应用程序中

c++ - 线程之间通过共享 vector 进行通信

java - Guava的 `Files#write`没有写最后一个空行?

c++ - 2个 future 之间的依赖

multithreading - 乔布斯共享 EntityManagers - 玩!框架

java - 有没有办法通过 Java 发送 ARP 请求?

java - 关于jdk中cast的方法