我正在制作一个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();
}
答案 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变量执行任何操作