2016-03-04 1 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.При очень первый клиент соединяется, все идет fine.The сообщение выводится на консоль, как ожидается.

2. Когда второй пользователь присоединяется, первый пользователь не может отправлять какие-либо сообщения на сервер. Последний клиент работает плавно, но все клиенты, подключенные к нему, просто не могут отправлять какие-либо сообщения на сервер. Возможно, сервер не передавая им сообщения.

3. Когда пользователю сообщается, что имя пользователя уже принято и отправлено обратно на экран входа в систему, история чата всех других клиентов начинает показывать нуль.

4. Самое первое сообщение, которое клиент отправляет на сервер, не отображается в истории чата. Из второго сообщения далее все работает нормально, пока не подключаются другие клиенты.

Пожалуйста, помогите и спасибо заранее. Эта проблема прослушивала меня в течение довольно долгого времени, и я не могу ее отладить, несмотря на множество попыток.

Любые предложения?

ответ

0
private static Socket socketClient; 

Проблема здесь. Этот элемент данных не должен быть статическим, и он не должен находиться в классе Server. Он должен быть в другом классе, обычно Runnable, который создается экземпляром для каждого принятого клиента и используется в качестве основы для соответствующего потока.

То же самое относится к связанным потокам и любому другому состоянию для каждого клиента.

На самом деле нет никаких веских оснований для статичности любого из этих не конечных элементов данных. Не делайте вещи статичными, если не знаете почему.

+0

Я попробую и дам вам знать. –