2017-01-14 2 views
-1

У меня есть этот код сервера из чат-программы клиент-сервер, но я понял, что когда я его запускаю, я могу отправлять только одно слово, например, «отправка приветствия на 1» - это нормально и он отправляет «привет» клиенту 1, но если я хочу написать предложение, я получаю сообщение «Invalid Message». Я пытаюсь исправить это какое-то время, и я не могу найти правильный способ сделать это, чтобы я мог получить сообщение и номер клиента, к которому должно идти сообщение.Класс сервера чата не отправляет сообщения

public class Serverr implements Runnable {//server implements threading by implementing runnable interface 
Socket csocket; 
static HashMap<Integer,Socket>hm=new HashMap <Integer,Socket>(); //here we store each client socket in hashmap 
static int k=1; 
Serverr(Socket csocket){ 
    this.csocket=csocket;//Server ser=new Server(sock); comes here and assigns it to csocket 
} 

public static void main(String args[]) 
throws Exception{ 
    ServerSocket ssock=new ServerSocket(5000);//Socket on port 5000(same as mentioned inclient class) 
    System.out.println("Listening");//when connected on port 5000 we print listening 
    while(true){ 
     Socket sock=ssock.accept();//accept client socket 
     Serverr ser=new Serverr(sock);//pass socket to constructor of server class 
     new Thread(ser).start();//start thread here 
     hm.put(k,sock);//add the socket into hashmap 
     System.out.println("Connected to client"+k);//print the number of connected client 
     k++; 
    } 


} 

@Override 
public void run() { 
    try{ 
     //once the thread is started we initialize necessary input & output streams here 
     PrintWriter out; 
     BufferedReader in=new BufferedReader(new InputStreamReader(csocket.getInputStream()));//used to read input from the socket 
     String inputLine; 
     String j="sending"; //follow a pattern for sending messages 
     String l="to"; 
     String t="sendtoall";//used to sent message to all clients 
     while((inputLine=in.readLine())!=null)//if the message from connected client !=null 
     { 
      String a[]=inputLine.split(" ");//split the input line using space if a[0] is sendmsg and a[2] is to 
      if(a[0].equals(j) && a[2].equals(l))//we started the server 
      { 
       int id=Integer.parseInt(a[3]);//we will get the number of client here 
       if(hm.containsKey(id)){// we will check hashmap if it contains id 
        Socket ser1=hm.get(id);//here we will get that clients socket from hashmap 

        out=new PrintWriter(ser1.getOutputStream(),true);// we will write to that socket using output stream 
        out.println(a[1]);//we will get that specific message part 
        out.flush();// a[1] is... 
       } 
       else 
       { 
        out=new PrintWriter(csocket.getOutputStream(),true); 
        out.println("user offline");//we print it if hashmap doesnt contain the key value 
        out.flush(); 
       } 
      } 
      else if(a[0].equals(t))//if we want to sent message to all clients at once 
      { 
       for(int h=1;h<hm.size();h++)//loop through hashmap & get those socket value 
       { 
        Socket ser1=hm.get(h); 

        out=new PrintWriter(ser1.getOutputStream(),true);//we will write to that socket here using outputstream 
        out.println(a[1]); 
        out.flush(); 
       } 
      } 
      else{ 
       out=new PrintWriter(csocket.getOutputStream(),true); 
       out.println("Invalid Message");//if the message format doesnt match 
       out.flush(); 
      } 
     } 
    }catch(IOException e){ 
     System.out.println(e); 
    } 
} 
} 
+1

[Почему я могу помочь мне? », А не вопрос?] (Http://meta.stackoverflow.com/q/284236/18157). Пожалуйста, посетите [помощь] и прочитайте [ask]. –

+0

@JimGarrison - Лиана описала точно, что происходит не так. Я не знаю, как вопрос может быть более ясным. –

ответ

1

Ваши проблемы следующие две линии.

 if(a[0].equals(j) && a[2].equals(l))//we started the server 
     { 
      int id=Integer.parseInt(a[3]);//we will get the number of client here 

Вы проверяете третье и четвертое слова ввода для «на» и номер клиента. Но если у вас есть целое предложение, то это не будет третьим и четвертым словами ввода. Вместо этого вы, вероятно, захотите проверить соответственно второе и последнее и последнее слова.

 if(a[0].equals(j) && a[a.length - 2].equals(l))//we started the server 
     { 
      int id=Integer.parseInt(a[a.length - 1]);//we will get the number of client here 

, который позволит вам иметь вход, такую ​​как

sending Hello my friend to 12345 

и определить поля правильно.

Вы также должны изменить линии

out.println(a[1]); 

так, что она посылает больше, чем просто одним словом. Возможно, вы могли бы использовать цикл для этого, например.

for (int word = 1; word < a.length - 2; word++) { 
    out.print(a[word]); 
} 
out.println(); 
Смежные вопросы