java - Java-服务器可同时为多个客户端提供服务

标签 java multithreading sockets client-server

我编写了一个程序,该程序实现了简单的服务器-客户端连接和通信,但仅适用于一个客户端。如果我启动第二个客户端,它什么也不会做,只会给出“Out:0”作为输出。 (服务器未响应)

我在服务器中使用线程,但我不知道为什么此解决方案无法正常工作。

任何的想法?

(我知道空的捕获并不好,但这只是示例代码。)

Server.java:

public class Server implements Runnable {
final int port;

public Server(int port){
    this.port=port;
}

@Override
public void run(){
    while(true){
    try{
        ServerSocket ss = new ServerSocket(port);
        new ClientThread(ss).start();
    }catch(Exception e){}
    }
}

public static void main(String[] args){
   new Server(1995).run();
}

private class ClientThread extends Thread{
    Socket s;
    Scanner sc;
    PrintWriter pw;

    ClientThread(ServerSocket ss){
        try{
            this.s = ss.accept();
        }catch(Exception e){}
    }

    @Override
    public void start(){            
        try{
            String in,out;

            sc = new Scanner(s.getInputStream());
            pw = new PrintWriter(s.getOutputStream(), true);
            int i=0;
            do{
                in = sc.nextLine();
                System.out.println("In: " + in);
                int tmp = Integer.parseInt(in)+1;
                out = Integer.toString(tmp);
                pw.println(out);
                i++;
            }while(i<10);
        }catch(Exception e){}
    }
}
}

Client.java:
public class Client implements Runnable{
String host;
int port; 
Socket s;
Scanner sc;
PrintWriter pw;

public Client(String host, int port){
    this.host=host;
    this.port=port;
}

@Override
public void run(){
    try{
        s = new Socket(host, port);

        sc = new Scanner(s.getInputStream());
        pw = new PrintWriter(s.getOutputStream(), true);

        String in, out;
        out="0";
        int i=0;
        do{
            pw.println(out);
            System.out.println("Out: " + out);
            in = sc.nextLine();
           int  tmp = Integer.parseInt(in)+1;
           out=Integer.toString(tmp);
        }while(i<10);

    }catch(Exception e){}
}

public static void main(String[] args){
    new Client("localhost", 1995).run();
}
}

最佳答案

您不必覆盖start(),而必须覆盖run()

private class ClientThread extends Thread{
    Socket s;
    Scanner sc;
    PrintWriter pw;

    ClientThread(Socket s){
        this.s = s;
    }

    @Override
    public void run() {
        try{
            String in,out;

            sc = new Scanner(s.getInputStream());
            pw = new PrintWriter(s.getOutputStream(), true);
            int i=0;
            do{
                in = sc.nextLine();
                System.out.println("In: " + in);
                int tmp = Integer.parseInt(in)+1;
                out = Integer.toString(tmp);
                pw.println(out);
                i++;
            }while(i<10);
        }catch(Exception e){}
    }
}

服务器线程:
@Override
public void run(){
    try{
        ServerSocket ss = new ServerSocket(port);
        while(true){
            Socket cl = ss.accept();
            new ClientThread(cl).start();
        }
    }catch(Exception e){}
}

关于java - Java-服务器可同时为多个客户端提供服务,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46544760/

相关文章:

c++ - 在 C++Amp 中使用指针

串行队列中的 iOS 网络请求

python - 当客户端愉快地发送它们时,为什么 TCP 数据包总是无法到达服务器?

java - 在 JSF 中显示通过 SQL 填充的 ArrayList

java - 如何像 Java 文档一样用 Java 记录我的方法?

java - 如何禁用 SWT SelectionListener,直到单独的线程完成

C++ I/O 多路复用服务器过早关闭连接

c - socket 。设置 sockaddr_in 结构的 s_addr 字段

java - 无需合成器即可控制 Java MIDI 音量

Java 将图像从文件读取到 ArrayList 并显示到 JPanel 上