Java客户端-服务器聊天应用程序: Weird problems with communication

标签 java sockets client-server chat

我正在使用套接字在 Java 中制作聊天应用程序。我遇到了一些以前从未遇到过的奇怪问题。首先是服务器类:

这是我的服务器类。如果我提供了不需要的代码,请原谅我,但鉴于我的问题的本质,我想向你们提供完整的信息。

服务器类别:

public class Server implements Runnable
{   
    private final static int port=8000;
    private static Set<Socket> socs=new HashSet<>();
    private static Thread t1;
    private static BufferedReader br;
    private static PrintWriter ps;
    private static Socket socketClient;
    private static String message;
    private static HashSet<String> users=new HashSet<>();
    private static HashMap<Socket,String> socket_id=new HashMap<>();
    private static HashMap<String,String> id_name=new HashMap<>();

public Server()
{
    try {

        ServerSocket socket=new ServerSocket(port);
        while(true)
        {System.out.println("Waiting for connections...");
        socketClient=socket.accept();
        System.out.println("Connected to user at: "+socketClient.getInetAddress());
        socs.add(socketClient);
        t1=new Thread(this);
        t1.start();     //to receive data

        }
    } catch (IOException e) {

        e.printStackTrace();
    }
}
//registration for the client
public void registration(String name,String id) throws IOException
{   
if(users.contains(name))
    {
        ps=new PrintWriter(socketClient.getOutputStream());
         ps.println("duplicate"+"\n");
         ps.flush();
    }
    else
     {
    users.add(name);
    socket_id.put(socketClient,id);
    id_name.put(id,name);
    }
}

    public void run() {
    int count=0;
    try {
        br=new BufferedReader(new InputStreamReader(socketClient.getInputStream()));
        do
        {
        message=br.readLine();
        if(count==0)
        {
            UUID id=UUID.randomUUID();
            String id_client=id.toString();
            registration(message.substring(0,message.indexOf(':')),id_client);
            count++;
        }
        for(Socket s:socs)
            {
            ps=new PrintWriter(s.getOutputStream());
            ps.println(message+"\n");
            ps.flush();
            }
        }while(br.readLine()!=null);
    }
    catch(SocketException e)
    {   
        System.out.println("A user left");


    }
    catch (IOException e) {
        // TODO Auto-generated catch block
        e.printStackTrace();
    }




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


}

以下是我的客户端类的发送和接收函数:

private void send_data()  {

    if(textField.getText().length()!=0)
    {   if(textField.getText().equals("!clear")) //command to clear the chat histroy
        {
        textArea.setText("");
        textField.setText("");
        }
        else
        {   
        ps.println(this.name+": "+textField.getText()+"\n");
        ps.flush();
        }
    }


}


public  void receive_data(){
    try {
        br=new BufferedReader(new InputStreamReader(socket.getInputStream()));
        do
        {   String message=br.readLine();
            if(message.length()!=0)
            console(message);
        }while(br.readLine()!=null);

    } catch (IOException e) {
        // TODO Auto-generated catch block
        e.printStackTrace();
    }


}

//此函数检查重复的用户名。

public void check() throws IOException
{
    BufferedReader b=new BufferedReader(new InputStreamReader(socket.getInputStream()));
    if(b.readLine().equals("duplicate"))
    {   JOptionPane.showMessageDialog(null, "Username taken");
        socket.close();
        b.close();
        dispose();
        new Login().setVisible(true);

    }
}

现在,问题是:

1.当第一个客户端连接时,一切正常。消息按预期显示到控制台。

2.当第二个用户加入时,第一个用户无法向服务器发送任何消息。最新的客户端运行顺利,但在它之前连接的所有客户端根本无法向服务器发送任何消息。或者服务器可能没有将消息中继给他们。

3.每当用户被告知用户名已被占用并被发送回登录屏幕时,所有其他客户端的聊天记录开始显示为空。

4.客户端发送到服务器的第一条消息不会显示在聊天记录中。从第二条消息开始,一切运行正常,直到任何其他客户端连接。

请帮助并提前致谢。这个问题已经困扰我很长一段时间了,尽管我尝试了很多次,但我无法调试它。

有什么建议吗?

最佳答案

private static Socket socketClient;

问题就出在这里。该数据项不应该是静态的,并且根本不应该位于 Server 类中。它应该位于另一个类中,通常是一个 Runnable 类,该类根据接受的客户端进行实例化,并用作相应线程的基础。

对于关联的流以及任何其他每个客户端状态也是如此。

实际上没有任何充分的理由让这些非最终数据项保持静态。除非你知道原因,否则不要让事情变得静态。

关于Java客户端-服务器聊天应用程序: Weird problems with communication,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35804771/

相关文章:

java - 如何使用 Proguard 否定类名

java - 对接收端(客户端)Socket进行带宽限制

java - 如何在java中连接到gtalk?

java - 使用 Java 中的套接字编程将数据流从客户端程序(在虚拟机中运行)发送到服务器程序(在主机操作系统上)

.net - TCP Socket 两个节点通话时 "flow of events"是什么

java - 如何处理客户端/服务器应用程序以发送消息和/或文件

java - 捕获 Spring Integration DSL 错误配置异常?

java - 了解电子邮件地址是否由 Google 管理

java - 在netty客户端中运行synchronize方法

c# - 在多个系统上运行图形显示,保持同步