聊天程序服务器类不发送消息

时间:2017-01-14 23:32:23

标签: java chat user-input

我从客户端 - 服务器聊天程序中获取此服务器代码,但我想当我运行它时,我每次只能发送一个单词,例如"将hello发送到1"没问题就发了“你好''对于客户端1,但如果我想写一个句子,我得到"无效的消息"。我现在已经尝试修复它一段时间了,我无法正确地做到这一点,所以我可以得到消息和消息应该发送给客户端的号码。

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 个答案:

答案 0 :(得分: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

您正在检查“to”输入的第三个和第四个单词以及客户编号。但如果你有一个完整的句子,那么这些不会是输入的第三和第四个单词。相反,您可能希望分别检查倒数第二个和最后一个单词,如下所示。

       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();