簡體   English   中英

Java客戶端-服務器聊天應用程序:通信中的怪異問題

[英]Java client-server chat application: Weird problems with communication

我正在使用套接字在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 ,該類針對每個接受的客戶端實例化,並用作相應線程的基礎。

關聯的流和任何其他每個客戶端狀態也是如此。

實際上,沒有任何理由使這些非最終數據項保持靜態。 除非您知道原因,否則不要將其靜態化。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM