java - 服务器多线程一次仅应答一个客户端

标签 java multithreading

我想创建一个多线程服务器,它同时与多个客户端通信。 这就是问题所在:

  • 服务器一次只能应答一个客户端。如果第一个客户端尚未收到服务器的响应,我无法从第二个客户端发送任何内容。

这是我的服务器的代码:

import java.io.*;
import java.net.*;



public class Serveur extends Thread{


    private MyFrame mf;
    @SuppressWarnings("unused")
    private FileAttente file;
    private ServerSocket serveur ;



    public Serveur(int port,MyFrame f,FileAttente file) throws IOException{

         serveur = new ServerSocket(port);
         this.mf = f;
         this.file=file;
    }



    @Override
    public void run() {
        // TODO Auto-generated method stub
        mf.console.append("\nServeur en écoute ... ");
        while(true){
            try { 

                SoClient threadClient = new SoClient(this.serveur.accept());
                threadClient.start();
                mf.console.append("\nUn nouveau client s'est connecté");

            } catch (IOException e) {e.printStackTrace();}



        }
        }






}

我还有这一行: mf.console.append("\nUn nouveau client s'est connecté"); 在收到来自客户端的每条消息后执行。通常,只有当有新客户端到来时才应执行。

这是我在客户端和服务器之间放置所有操作的套接字代码:

import java.io.DataInputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import java.net.Socket;


public class SoClient extends Thread {

        static MyFrame mf;
        FileAttente file;
        public static Socket client;
        public SoClient(Socket client){
            this.client=client;
        }



        public void run(){

            MyFrame.console.append("\nConnexion établi : "+client.getInetAddress());
            //Envoie et reception
            try {
                InputStream in = this.client.getInputStream();
                OutputStream out = client.getOutputStream();

                sleep(2);

                DataInputStream is = new DataInputStream(in);
                @SuppressWarnings("deprecation")
                String request = is.readLine();
                MyFrame.console.append("\nMessage d'un Client :"+request);  
                DataInputStream din = new DataInputStream(in);
                sleep(2);
                String chaine_Client=din.readUTF();
                MyFrame.console.append("Client :"+chaine_Client);
                client.close();
            }   catch (IOException | InterruptedException e) {}
        }




    }

所以,我想做的是从服务器向所有连接的客户端发送广播消息,或者发送回显消息。 对于客户,我创建了一个类,并根据需要多次实例化它。 Client 类和服务器类位于 Eclipse 中的两个不同项目中。

最佳答案

您已在 SoClient 中将类变量客户端定义为静态:

public static Socket client;

并在构造函数中设置它。

如果您有多个 SoClient 实例,它们都在同一个客户端套接字上工作。
这可能会导致更多奇怪的错误。

删除 static 关键字,希望它能起作用。

关于java - 服务器多线程一次仅应答一个客户端,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27157090/

相关文章:

java - 使用 Java 定期更新数据库

java - 如何用更少的代码行来初始化和使用许多类似的Jbutton?

java - URLEncoder 西里尔文编码 UTF-8 错误结果

c# - 如何从 .Net 中的超线程中获得最大 yield

python - 如果/我应该使用线程来更新全局变量怎么办。[Pythonic 方式]

Java:找不到命令

java - 将流列表转换为列表

.net - 我可以(安全地)在 ADO.NET 数据服务中使用 ThreadStatic 属性吗?

multithreading - 多线程线程控制

java - Swing JPanel - 绘制的图形复制而不是移动