这是一个允许多个客户通信的网络通信,不知道怎么了,服务端总是接收不到来自客户端的信息,求解?
服务器端代码如下:
package Four;import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.io.OutputStream;
import java.io.PrintWriter;
import java.net.ServerSocket;
import java.net.Socket;public class A4Server {
private ServerSocket server;
private int port = 5678; public A4Server() {
System.out.println("服务器已经启动,在" + port + "端口监听多个客户,收到End客户端强制结束");
try {
server = new ServerSocket(port);
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
service();
} public void service() {
while (true) {
try {
new ServerThread(server.accept(), server).start();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
} public static void main(String args[]) { new A4Server();
} class ServerThread extends Thread {
BufferedReader br = null;
PrintWriter pw = null;
Socket socket;
ServerSocket serversocket; public ServerThread(Socket socket, ServerSocket serversocket) {
this.socket = socket;
System.out.println("客户" + socket.getInetAddress() + "请求连接成功");
this.serversocket = serversocket;
} public BufferedReader getReader(Socket socket) throws IOException {
InputStream is = socket.getInputStream();
return new BufferedReader(new InputStreamReader(is));
} public PrintWriter getWriter(Socket socket) throws IOException {
OutputStream is = socket.getOutputStream();
return new PrintWriter(is, true);
} public void run() {
try {
br = getReader(socket);
pw = getWriter(socket);

} catch (IOException e1) {
// TODO Auto-generated catch block
e1.printStackTrace();
} try {
String message = null;
System.out.println("test");     //只能运行到这里,接收不到客户端的信息
while ((message = br.readLine()) != null) {
System.out.println("test");
System.out.println("接收信息:" + message);
pw.write("Receive");
if (message.equals("End")) {
break;
}
}
System.out.println("test"); } catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} finally {
System.out.println("客户" + socket.getInetAddress() + "断开连接");
try {
socket.close();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
} }
}
}客户端代码:
package Four;import java.io.BufferedReader;
import java.io.BufferedWriter;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.io.OutputStream;
import java.io.PrintWriter;
import java.net.Socket;
import java.net.UnknownHostException;public class A4Client { private String host = "localhost";
private int port = 5678;
Socket socket = null; public A4Client() {
try {
socket = new Socket(host, port);
System.out.println("客户端启动,输入End结束通话");
talks();
} catch (UnknownHostException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
} public void talks() throws IOException {
BufferedReader br = getReader(socket);
PrintWriter bw = getWriter(socket);
BufferedReader localin = new BufferedReader(new InputStreamReader(
System.in));
System.out.print("输入数据:");
String message = null;
while ((message = localin.readLine()) != null) {
    bw.write(message);
    System.out.println("test");     //客户端也只能运行这里了?
System.out.println("服务器消息:" + br.readLine());
System.out.println("test");
if (message.equals("End")) {
break;
}
System.out.print("输入数据:");
}
socket.close();
System.out.println("客户端成功关闭"); } public BufferedReader getReader(Socket socket) throws IOException { InputStream is = socket.getInputStream();
return new BufferedReader(new InputStreamReader(is)); } public PrintWriter getWriter(Socket socket) throws IOException {
OutputStream os = socket.getOutputStream();
return new PrintWriter(os, true); }

public static void main(String[]args){
new A4Client();
}
}

解决方案 »

  1.   

    大概看了下你两边都是停在br.readLine(),这个是阻塞模式的读取,也就是说如果没有读到数据,程序就在这个位置一直不动,下面代码不执行。
    你把代码慢慢搭建,先能双发握手成功,然后一方发一点数据,另一方接收到再搞其他代码。
      

  2.   

    存在2个问题
    1、write时没有行结束符,\r\n,\n都可以,导致readline取不到数据
    2、write后没有flush修改如下
    客户端
    bw.write(message+"\r\n");
    bw.flush();
    服务端
    pw.write("Receive\r\n");
    pw.flush();