使用线程java错误TCP客户端服务器聊天程序

时间:2013-04-15 18:56:22

标签: multithreading tcp thread-safety tcpclient tcpserver

我正在制作一个tcp客户端服务器聊天程序。我的服务器是由线程制作的,其代码如下:

    System.out.println("Server binded at "+((client.getInetAddress()).getLocalHost()).getHostAddress()+":9867");
    System.out.println("Run the Client");
    //ready to accept client request
    //opening the input stream to read data from client connection
    in= new BufferedReader(new InputStreamReader(client.getInputStream()));
    System.out.println(in.readLine());

                //using output stream responsing data 

                out=new PrintStream(client.getOutputStream());
                out.print("Welcome by server\n");

                System.out.println("1");

                in= new BufferedReader(new InputStreamReader(client.getInputStream()));
    System.out.println(in.readLine());                        


                while(! in.readLine().trim().equals("*")) {

                    //using output stream responsing data 
                    System.out.println("3");
                   BufferedReader bufferRead = new BufferedReader(new InputStreamReader(System.in));
                    str = bufferRead.readLine();                    
                    out.println(str);
                    out.flush();

                    //opening the input stream to read data from client connection
            in= new BufferedReader(new InputStreamReader(client.getInputStream()));
                      System.out.println(in.readLine());

        }

我的客户端文件是:(简单,无线程)

client =new Socket("127.0.0.1", 9867);

                System.out.println("Client connected ");
                //getting the o/p stream of that connection
                out=new PrintStream(client.getOutputStream());
                //sending the message to server
                out.print("Hello from client\n");

                //reading the response using input stream
                in= new BufferedReader(new InputStreamReader(client.getInputStream()));
                System.out.println(in.readLine());

                bufferRead = new BufferedReader(new InputStreamReader(System.in));
                str = bufferRead.readLine();                    
                out=new PrintStream(client.getOutputStream());
                out.print(str);
                out.flush();

                while(! in.readLine().trim().equals("*")) {

                   // opening the input stream to read data from server connection
                   in= new BufferedReader(new InputStreamReader(client.getInputStream()));
                    System.out.println("4");
                    System.out.println(in.readLine());
                    System.out.println("5");

                    out=new PrintStream(client.getOutputStream());
                    bufferRead = new BufferedReader(new InputStreamReader(System.in));
                    str = bufferRead.readLine();                    
                    out.print(str);
                    out.flush();

                }

现在发生了一件奇怪的事情。当我在两个文件上注释掉while循环时,程序运行正常。但是当我在向服务器发送消息后,我在客户端发表评论时,我的服务器继续循环,而我的服务器一直在等待响应。

所以输出是:(客户端)

Client connected 
Welcome by server
l;skc
4

和服务器是:

Server binded at 192.168.1.242:9867
Run the Client
Hello from client
1

我认为这是由于使用了线程/异步进程.Plz帮助

已编辑的代码

服务器端:

System.out.println("Server binded at "+((client.getInetAddress()).getLocalHost()).getHostAddress()+":9867");
            System.out.println("Run the Client");
            //ready to accept client request
            //opening the input stream to read data from client connection
            in= new BufferedReader(new InputStreamReader(client.getInputStream()));
            System.out.println(in.readLine());

                        //using output stream responsing data 

                        out=new PrintStream(client.getOutputStream());
                        out.print("Welcome by server\n");

                        System.out.println("1");

                        str = in.readLine();
            System.out.println(str);                        


                        while(!str.trim().equals("*")) {

                            //using output stream responsing data 
                            System.out.println("3");
                           BufferedReader bufferRead = new BufferedReader(new InputStreamReader(System.in));
                            str = bufferRead.readLine();                    
                            out.println(str);
                            out.flush();

                            //opening the input stream to read data from client connection
                    in= new BufferedReader(new InputStreamReader(client.getInputStream()));
                              System.out.println(in.readLine());

                }

客户方:

client = new Socket(“127.0.0.1”,9867);

            System.out.println("Client connected ");
            //getting the o/p stream of that connection
            out=new PrintStream(client.getOutputStream());
            //sending the message to server
            out.print("Hello from client\n");

            //reading the response using input stream
            in= new BufferedReader(new InputStreamReader(client.getInputStream()));
            System.out.println(in.readLine());

            bufferRead = new BufferedReader(new InputStreamReader(System.in));
            str = bufferRead.readLine();                    
            out=new PrintStream(client.getOutputStream());
            out.print(str);
            out.flush();

            while(! str.trim().equals("*")) {

               // opening the input stream to read data from server connection
                str = in.readLine();
                System.out.println("4");
                System.out.println(str);

                out=new PrintStream(client.getOutputStream());
                str = bufferRead.readLine();                    
                out.print(str);
                out.flush();

            }

2 个答案:

答案 0 :(得分:1)

第一个线索。看看你能用这个做什么:

这一行:

 System.out.println(in.readLine());

将从传入连接读取一行并回显它。当它这样做时,行内容消失了,如果你再次尝试调用“in.readLine()”,它将尝试再次读取另一行,而不是同一行。

此外,这一行:

in= new BufferedReader(new InputStreamReader(client.getInputStream()));

通常只会出现一次。构建阅读器时,只需要使用它。您不必一遍又一遍地重建它。

答案 1 :(得分:1)

对于您的示例,我强烈建议通过以下链接http://docs.oracle.com/javase/tutorial/networking/sockets/clientServer.html

敲敲敲击协议

对我来说,代码中明显的主要错误是

   while(! str.trim().equals("*"))

什么时候应该

while ((str = in.readLine()) != null) {
System.out.println("Server: " + str);

这意味着您的线程将通过输入流持续监听输入,然后您可以在从服务器返回响应后使用str变量执行任何操作