我在服务器端使用此线程以便从客户端接收字符串:
int clientNumber = 0;
ServerSocket listener = new ServerSocket(6543);
try {
while (true) {
new Capitalizer(listener.accept(), clientNumber++).start();
}
} finally {
listener.close();
}
...
private static class Capitalizer extends Thread {
private Socket socket;
private int clientNumber;
public Capitalizer(Socket socket, int clientNumber) {
this.socket = socket;
this.clientNumber = clientNumber;
}
public void run() {
try {
BufferedReader in = new BufferedReader(new InputStreamReader(socket.getInputStream()));
while (true) {
String input = in.readLine();
System.out.println("Am Server: " + input);
out.println(input.toUpperCase());
}
} catch (IOException e) {
e.printStackTrace();
}
客户端看起来像这样:
try {
Socket client = new Socket("localhost", 6543);
OutputStream outToServer = client.getOutputStream();
DataOutputStream out = new DataOutputStream(outToServer);
final BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
while (true) {
System.out.print("Enter something : ");
String input = br.readLine();
out.write(input.getBytes());
out.flush();
}
} catch (IOException e) {
e.printStackTrace();
}
我不清楚在服务器端没有收到字符串。 我在Eclipse控制台中输入一个字符串,在客户端将此字符串发送到服务器,但在服务器端没有任何反应。 有没有人暗示我做错了什么?
答案 0 :(得分:2)
您的服务器希望接收行,因此您的客户端必须发送行。但是你的客户不发送线路。为什么呢?
来自docs:
返回值
包含行内容的String,不包括任何行终止字符;如果已到达流的末尾,则为null。
因此,readline
的返回值不一行,因为同一页说明:
一条线被视为由换行(' \ n'),回车(' \ r')或回车后的任何一个终止通过换行。
为避免将来出现此错误,在使用TCP之前,请准确指定 将准确发送和接收哪些信息。如果您正在使用TCP交换消息,则在字节级别定义精确消息是什么。
对于此应用程序,您应该精确指定消息将包含一系列字符,不包括任何行结尾符,其末尾标记为行结尾。这样就可以清楚地表明客户端是错误的,因为它显然没有按照协议的规定发送消息。