2016-03-04 110 views
1

我正在使用套接字在Java中制作聊天应用程序。我遇到了一些我从未遇到的奇怪问题。首先,服务器类: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.客户端发送到服务器的第一条消息不会显示在聊天记录中。从第二条消息开始,一切运行正常,直到其他客户端连接。

请帮助和提前致谢。这个问题一直在困扰着我很长一段时间,我无法调试它,尽管许多尝试。

有什么建议吗?

回答

0
private static Socket socketClient; 

问题在这里。这个数据项不应该是静态的,它不应该在Server类中。它应该在另一个类中,通常是Runnable,它被每个接受的客户端实例化并用作相应线程的基础。

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

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

+0

我会试试看,并让你知道。 –

相关问题