Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/sockets/2.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 ObjectOutputStream需要来自服务器的响应吗?_Java_Sockets - Fatal编程技术网

Java ObjectOutputStream需要来自服务器的响应吗?

Java ObjectOutputStream需要来自服务器的响应吗?,java,sockets,Java,Sockets,我有一个套接字程序。当我有一个客户机时,没有问题。但是当客户机在一秒钟内超过一个,并且稍后的客户机时,程序在第3行等待。它没有错误和异常。有什么问题 Socket Client = new Socket("ip", port); private ObjectOutputStream out; out = new ObjectOutputStream(Client.getOutputStream());//line3 out.flush(); WaitForConnection()是线程中的侦听

我有一个套接字程序。当我有一个客户机时,没有问题。但是当客户机在一秒钟内超过一个,并且稍后的客户机时,程序在第3行等待。它没有错误和异常。有什么问题

Socket Client = new Socket("ip", port);
private ObjectOutputStream out;
out = new ObjectOutputStream(Client.getOutputStream());//line3
out.flush();

WaitForConnection()
是线程中的侦听器,并且
runserver()
发送和接收另一个线程中的消息

据我所知,您在此线程中只等待一次连接:

        TCP = new Thread(new Runnable() {

            @Override
            public void run() {
           if ("TCP".equals(Protocol)) {
            try {
                Thread.sleep(10);
            } catch (InterruptedException ex) {
                Logger.getLogger(Server.class.getName()).log(Level.SEVERE, null, ex);
            }

            RunServer();

        }   
            }
        });
        TCPWait = new Thread(new Runnable() {

            @Override
            public void run() {
                try {
                    WaitForConnection();
                } catch (IOException ex) {
                    Logger.getLogger(Server.class.getName()).log(Level.SEVERE, null, ex);
                }
            }
        });
        TCPWait.start();
        TCP.start();
    public void RunServer() {
        try {

            while (true) {
                {
                    accessLock.lock();
                    if(CanContinue == false)
                        condition.await();
                    try {
//                        WaitForConnection();
                        GetStreams();
                        ProcessConnection();
                    accessLock.unlock();

                    } catch (Exception e) {
                        JOptionPane.showMessageDialog(rootPane, "ارتباط قطع شد" + e.getMessage());


                    }
                }
            }

        } catch (Exception e) {
            JOptionPane.showMessageDialog(rootPane, e.getMessage());
        }
    public void WaitForConnection() throws IOException {
        jTextArea1.append("لطفا تا برقرای ارتباط صبر کنید.../n ");
        accessLock.lock();
        connection = server.accept();
       CanContinue = true;
       condition.signal();
       accessLock.unlock();

        jTextArea1.append("ارتباط از " + connection.getInetAddress().getHostName() + "\n");

    }

    public void GetStreams() {
        try {
            Socket s = new Socket();
            s = connection;
            out = new ObjectOutputStream(s.getOutputStream());
            out.flush();

            in = new ObjectInputStream(s.getInputStream());
            jTextArea1.append("در حال برقرای ارتباط...\n");
        } catch (Exception e) {
            JOptionPane.showMessageDialog(rootPane, "مشکل در برقرای ارتباط!\n");

        }

    }

    public void ProcessConnection() {
        SendData("ارتباط برقرا شد\n");
        try {
            jTextArea1.append((String) in.readObject() + "\n");

        } catch (Exception e) {
        }
        String message = "";

        do {
            try {

                jTextArea1.append((String) in.readObject() + "\n");
            } catch (Exception e) {
            }
        } while (message != "Exit");


    }
不要在主循环中等待多个连接:

    TCPWait = new Thread(new Runnable() {

        @Override
        public void run() {
            try {
                WaitForConnection();
            } catch (IOException ex) {
                Logger.getLogger(Server.class.getName()).log(Level.SEVERE, null, ex);
            }
        }
    });
因此,一个客户端连接,其余的客户端被卡住,因为您再也不会调用accept。您应该取消对
WaitForConnection()调用的注释


出现严重错误。

客户端是不同的java进程?是的,客户端是一个程序,服务器是另一个程序。当出现此问题时,您正在启动多个客户端程序?听起来您的服务器代码不是多线程的。你能给我们看一下那个部分吗?你能把代码发布到服务器端吗?我写了,但不正确。在processConecton()中,我们有一个循环,这个循环只附加了一些文本。问题是您只调用了一次accept,因此只有一个客户端可以连接。在你的
WaitForConnection
方法中放一个计数器,看看它执行了多少次。是的,你的权利接受是执行一次。我把它放在while(true)中,但它执行一次!你能用你现在的代码更新原来的问题吗?问题出在我的线程中,我解决了一个问题,谢谢。:)那不是真正的问题。他只是无缘无故地分配那个套接字,然后给它分配一个从
accept
获得的套接字。真正的问题是他只调用了一次
accept
        while (true) {
            {
                accessLock.lock();
                if(CanContinue == false)
                    condition.await();
                try {
        //            WaitForConnection();
                    GetStreams();
                    ProcessConnection();
                accessLock.unlock();

                } catch (Exception e) {
                    JOptionPane.showMessageDialog(rootPane, "ارتباط قطع شد" + e.getMessage());


                }
            }
        }
Socket s = new Socket();
s = connection;