Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/337.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/130.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 服务器没有';无法使用多个连接_Java_Multithreading_Client Server - Fatal编程技术网

Java 服务器没有';无法使用多个连接

Java 服务器没有';无法使用多个连接,java,multithreading,client-server,Java,Multithreading,Client Server,我有一个简单的客户端-服务器应用程序。问题是,它只适用于一个启动的客户机,而不适用于两个或更多的客户机。它可以建立连接,但当您尝试在第一个或第二个字段中输入文本时,服务器会中断。我认为问题可能出在Server.java中的函数broadcast() java.lang.IndexOutOfBoundsException: end at java.util.regex.Matcher.region(Matcher.java:1038) at java.util.Scanner.

我有一个简单的客户端-服务器应用程序。问题是,它只适用于一个启动的客户机,而不适用于两个或更多的客户机。它可以建立连接,但当您尝试在第一个或第二个字段中输入文本时,服务器会中断。我认为问题可能出在
Server.java
中的函数
broadcast()

java.lang.IndexOutOfBoundsException: end
     at java.util.regex.Matcher.region(Matcher.java:1038)
     at java.util.Scanner.findPatternInBuffer(Scanner.java:1010)
Client said: sds
    at java.util.Scanner.findWithinHorizon(Scanner.java:1679)
    at java.util.Scanner.nextLine(Scanner.java:1538)
    at Server$NewClient.run(Server.java:66)
    at java.lang.Thread.run(Thread.java:745)
Server.java

public class Server {
    final int PORT = 5000;
    private ArrayList<NewClient> al = new ArrayList<NewClient>();
    private Scanner in;
    private PrintWriter out;
    private SimpleDateFormat sdf;
    private int uniqueID = 0;

    private void go(){

        try{
            ServerSocket serverSocket = new ServerSocket(PORT);
            System.out.println("Waiting for clients...");

            while(true) {
                Socket s = serverSocket.accept();
                NewClient chat = new NewClient(s);
                System.out.println("Client number " + chat.getId() + " connected from: " + s.getLocalAddress().getHostName());
                al.add(chat);
                Thread t = new Thread(chat);
                t.start();

            }
        }catch (Exception e) {
            System.out.println("Problem with establishing network connection: ");
            e.printStackTrace();
        }

    }

    public static void main(String[] args) {
        Server server = new Server();
        server.go();
    }

    class NewClient implements Runnable{
        private Socket socket;
        private int id;

        public NewClient(Socket s) {
            this.socket = s;
            this.id = ++uniqueID;
        }
        public int getId() {
            return this.id;
        }

        @Override
        public void run() {
            try{
                in = new Scanner(socket.getInputStream());
                out = new PrintWriter(socket.getOutputStream());
                sdf = new SimpleDateFormat("HH:mm:ss");

                while(true) {
                    String input = in.nextLine();
                    System.out.println("Client said: " + input);
                    broadcast(input);
                }
            }catch (Exception e) {
                e.printStackTrace();
            }

        }
        private void writeMsg(String input) {
            String msg = input + " on " + sdf.format(new Date());
            out.println("You said: " + msg);
            out.flush();
        }

        private void broadcast(String input) {
            for (int i = 0; i < al.size(); i++) {
                NewClient t = al.get(i);
                t.writeMsg(input);
            }

        }
    }

}
java.lang.IndexOutOfBoundsException: end
     at java.util.regex.Matcher.region(Matcher.java:1038)
     at java.util.Scanner.findPatternInBuffer(Scanner.java:1010)
Client said: sds
    at java.util.Scanner.findWithinHorizon(Scanner.java:1679)
    at java.util.Scanner.nextLine(Scanner.java:1538)
    at Server$NewClient.run(Server.java:66)
    at java.lang.Thread.run(Thread.java:745)

打开两个Client.java并将其连接到server.java时,一切正常。但当我尝试从这两个打开的客户端发送消息时,服务器返回以下错误:

java.lang.IndexOutOfBoundsException: end
     at java.util.regex.Matcher.region(Matcher.java:1038)
     at java.util.Scanner.findPatternInBuffer(Scanner.java:1010)
Client said: sds
    at java.util.Scanner.findWithinHorizon(Scanner.java:1679)
    at java.util.Scanner.nextLine(Scanner.java:1538)
    at Server$NewClient.run(Server.java:66)
    at java.lang.Thread.run(Thread.java:745)

发生的情况是,您的代码扫描来自客户端的第一行(“sds”,它被打印到标准输出),然后它返回并立即尝试扫描来自客户端的下一行。由于客户端还没有发送任何内容,输入流扫描程序会抛出一个异常。

NewClient类是一个内部类。该类的所有实例都是使用外部类的相同实例创建的。更改代码将解决此问题:

java.lang.IndexOutOfBoundsException: end
     at java.util.regex.Matcher.region(Matcher.java:1038)
     at java.util.Scanner.findPatternInBuffer(Scanner.java:1010)
Client said: sds
    at java.util.Scanner.findWithinHorizon(Scanner.java:1679)
    at java.util.Scanner.nextLine(Scanner.java:1538)
    at Server$NewClient.run(Server.java:66)
    at java.lang.Thread.run(Thread.java:745)
public NewClient(Socket s) {
            this.socket = s;
            this.id = ++uniqueID;
            try{
                in = new Scanner(socket.getInputStream());
                out = new PrintWriter(socket.getOutputStream());
                sdf = new SimpleDateFormat("HH:mm:ss");
            }catch(Exception e) {
                System.out.println("Exception while creating input/output streams: " + e);
            }
        }

关于“服务器刹车”的含义,您能给出更多的细节吗?当打开两个Client.java并将其连接到server.java时,一切都正常。但当我试图从这两个打开的客户机发送一些消息时,服务器返回以下错误:java.lang.IndexOutOfBoundsException:end at java.util.regex.Matcher.region(Matcher.java:1038)at java.util.Scanner.FindPatterInBuffer(Scanner.java:1010)客户端说:sds位于java.util.Scanner.findWithinHorizon(Scanner.java:1679)位于java.util.Scanner.nextLine(Scanner.java:1538)位于服务器$NewClient.run(Server.java:66)位于java.lang.Thread.run(Thread.java:745)您丢弃了所有偶数行的客户端输入,而且你永远不会在任何地方检查流的结尾。这不行。我认为问题出在其他地方,因为它发生在节目进入广播消息时,而不广播任何内容。这可能与您的建议有关吗?堆栈跟踪表明错误发生在Scanner.nextLine()中,从run()调用时,而不是从broadcast()方法中调用。broadcast()中可能还有一个单独的bug,但它不是抛出此堆栈跟踪的bug。