我在通过Java中的套接字传输字符串时遇到了问题。当我尝试从服务器接收数据时,数据成功传输,但已损坏。我无法找出发生了什么问题。通过java中的套接字损坏的字符串
这里是客户端的代码:
public String getUserNameServerResult(String userNameParameter) {
Socket socket;
BufferedReader socketReader;
PrintWriter socketWriter;
String userNameResultParameter = null;
try {
socket = new Socket(HOST_NAME, PORT_NUMBER);
socket.setSoTimeout(SERVER_REQUEST_TIMEOUT);
socketReader = new BufferedReader(new InputStreamReader(socket.getInputStream()));
socketWriter = new PrintWriter(socket.getOutputStream());
socketWriter.println(numberRequest);
socketWriter.flush();
socketWriter.println(userNameParameter);
socketWriter.flush();
userNameResultParameter = socketReader.readLine();
socketReader.close();
socketWriter.close();
socket.close();
System.out.println(userNameResultParameter);
} catch(IOException ioEx) {
ioEx.printStackTrace();
}
return userNameResultParameter;
}
的readLine从读线()方法传输已损坏的字符串。
这里是服务器的代码:
public synchronized void run(){
System.out.println(new Date().toString()+" :\nAccepted client: "
+socket.getInetAddress()+":"+socket.getPort()+"\n");
try {
while(!isInterrupted()) {
String numberRequest = socketReader.readLine();
if(numberRequest == null) {
break;
}
switch(numberRequest) {
case "1": // Determines if the user name exists in the Database.
String userName = socketReader.readLine();
boolean isUserName = ServerRequest.isUserNameExists(userName);
socketWriter.println(isUserName);
socketWriter.flush();
break;
default: break;
}
}
} catch(IOException ex) {
System.err.println(ex.getMessage());
}
}
的“isUserName”变量转移和它被在客户端已损坏。
你能帮忙解决这个问题吗? 谢谢!
损坏怎么办?此外,您是否尝试并设置代理来转储在客户端和服务器之间传输的数据,以确定哪一端正在破坏数据? – millimoose
另外,你**绝对**需要使用原始套接字?在各种抽象层次上有很多中间件来帮助编写服务器。如果您不需要Web服务/远程处理机制,ZeroMQ,RabbitMQ,QuickServer都是不错的选择。 – millimoose
isUserName是一个布尔变量,用于确定用户名是否存在于数据库中,并且在socketWriter.println(isUserName)之前具有正确的形式:true或false。但是当它通过套接字传输时,结果变成“[] [] [] false”或“[] [] [] true”,其中“[] [] []”是某些不可读的数据。 –