我在通過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」,其中「[] [] []」是某些不可讀的數據。 –