Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/370.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/multithreading/4.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/1/angularjs/22.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_Sockets_Server_Chat - Fatal编程技术网

Java 聊天室:向服务器上的所有客户端发送消息

Java 聊天室:向服务器上的所有客户端发送消息,java,multithreading,sockets,server,chat,Java,Multithreading,Sockets,Server,Chat,我有一个服务器客户端应用程序集。(家庭作业) 到目前为止,我已经了解了如何让多个客户端连接到服务器,让服务器聚合客户端发送的消息,以及让服务器将客户端的消息发送回客户端并在聊天窗格中显示 我的问题是尝试向多个客户端发送消息我只允许使用ServerSocket和Socket库。 假设我有两个客户端连接到服务器。一个客户端发送一条消息,该消息将显示在客户端的聊天室中。第二个客户端发送消息,第一个客户端没有接收到消息,第二个客户端的聊天窗口显示第一个客户端的消息 从本质上讲,服务器正在发送相应客户端未

我有一个服务器客户端应用程序集。(家庭作业)

到目前为止,我已经了解了如何让多个客户端连接到服务器,让服务器聚合客户端发送的消息,以及让服务器将客户端的消息发送回客户端并在聊天窗格中显示

我的问题是尝试向多个客户端发送消息我只允许使用ServerSocket和Socket库。

假设我有两个客户端连接到服务器。一个客户端发送一条消息,该消息将显示在客户端的聊天室中。第二个客户端发送消息,第一个客户端没有接收到消息,第二个客户端的聊天窗口显示第一个客户端的消息

从本质上讲,服务器正在发送相应客户端未在聊天框中显示的最新消息,我不知道为什么或如何发送

服务器到客户端通信的代码:

Class CommunicationThread extends Thread {

  //Vector containing all client sockets currently connected
  //Held offsite, here for clarity
  public Vector<Socket> socketVector;

  public CommunicationThread (Socket clientSoc, Server ec3, Vector<Socket>socketVectorg)
  {
    //add new socket to vector, start thread
    clientSocket = clientSoc;
    socketVectorg.add(clientSocket);
    this.socketVector = socketVectorg;
    gui = ec3;
  }

  public void run()
  {
    System.out.println ("New Communication Thread Started");

    try {
        //Client's chat box (output)
        PrintWriter out = new PrintWriter(clientSocket.getOutputStream(),
                true);

        //Input line from client
        BufferedReader in = new BufferedReader(
                new InputStreamReader(clientSocket.getInputStream()));

        String inputLine;

        while ((inputLine = in.readLine()) != null) {
            System.out.println("Server: " + inputLine);
            gui.history.insert(inputLine + "\n", 0);

            //*************HERE IS MY ISSUE*******************
            for(Socket s : socketVector){
                out = new PrintWriter(s.getOutputStream(),
                        true);
                out.println(inputLine);
            }

            if (inputLine.equals("Bye."))
                break;

            if (inputLine.equals("End Server."))
                gui.serverContinue = false;

        }

        out.close();
        in.close();
        clientSocket.close();
    } 
    catch (IOException e) 
    {
     System.err.println("Problem with Communication Server");
     //System.exit(1); 
    } 
  }
} 
类通信读取扩展线程{
//包含当前连接的所有客户端套接字的向量
//为了清晰起见,在场外举行
公共向量机;
公共通信读取(Socket客户端soc、服务器ec3、VectorsocketVectorg)
{
//将新套接字添加到vector,开始线程
clientSocket=clientSoc;
socketVectorg.add(clientSocket);
this.socketVector=socketVectorg;
gui=ec3;
}
公开募捐
{
System.out.println(“新通信线程已启动”);
试一试{
//客户端聊天框(输出)
PrintWriter out=新的PrintWriter(clientSocket.getOutputStream(),
正确的);
//来自客户端的输入行
BufferedReader in=新的BufferedReader(
新的InputStreamReader(clientSocket.getInputStream());
字符串输入线;
而((inputLine=in.readLine())!=null){
System.out.println(“服务器:“+inputLine”);
gui.history.insert(inputLine+“\n”,0);
//*************这是我的问题*******************
用于(套接字s:socketVector){
out=新的PrintWriter(s.getOutputStream(),
正确的);
out.println(inputLine);
}
if(inputLine.equals(“Bye”))
打破
if(inputLine.equals(“终端服务器”))
gui.serverContinue=false;
}
out.close();
in.close();
clientSocket.close();
} 
捕获(IOE异常)
{
System.err.println(“通信服务器问题”);
//系统出口(1);
} 
}
} 
我知道我正在覆盖“out”,但我不认为这是我的问题,所以在我测试时,它就在我的代码中

我的问题在上面的代码中标记。该向量准确地存储套接字ID,由于我正在基于该向量创建一个新的PrinterWriter,因此我只假设它将获得相应客户机的输出字段,但它不会

我的直觉是线程或关闭输出有问题,但我真的不知道


非常感谢您的建议。

我觉得您的问题是,您希望在同一个位置对客户端套接字执行输入和输出工作,而不需要这样做。客户端套接字的输出流可以在GUI线程中写入,并且都可以在一个地方写入。如果需要,您可以保留一个输出流的集合,并且当您想要回复所有时,可以迭代该集合(可能是一个
HashMap
,其中字符串是一些客户端标识符)并发送消息。

哦,上帝,请不要在构造函数中的线程上调用
start()
。对象尚未完全构造。构造函数返回后调用
start()
;如果需要强制执行此行为,请使用静态方法(工厂方法)。修复并注意,谢谢,部分问题可能是您为每行输入创建了一个新的
PrintWriter
。这似乎是“错的”。另外,我在这个类中看到GUI代码。通常GUI在客户端而不是服务器上运行。所以我只想确认上面的代码是服务器代码。正确吗?是的,这是服务器代码。每次客户端按下send按钮时,似乎都会执行while((inputLine=in.readLine())!=null)封装的代码。PrintWriter用于输出的每一行,因此它从某个客户端获取消息(inputLine),并将其输出到客户端的聊天窗格。客户机的套接字信息存储在向量中,因此“out”应该是该向量中每个客户机的输出流vector@markspace你说得对,但下周,有人会发帖说“你绝对不能使用两阶段结构——这是一种代码气味和反模式!”我不太明白你的前两句话。如何在GUI线程中写入客户端?这不是我现在正在做的吗?如果我是的话,很抱歉误会了。我很清楚,您建议存储“out”而不是实际的套接字?我会在早上尝试,并会确保最好的答案,如果它的工作,好的建议。也肯定会使用HashMap,谢谢。@mrybak3:是的,OutputStreams或更可能的实用程序类的对象,该实用程序类包含封装在PrintStream中的OutputStream。