2012-11-02 62 views
3

我在通过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”变量转移和它被在客户端已损坏。

你能帮忙解决这个问题吗? 谢谢!

+0

损坏怎么办?此外,您是否尝试并设置代理来转储在客户端和服务器之间传输的数据,以确定哪一端正在破坏数据? – millimoose

+0

另外,你**绝对**需要使用原始套接字?在各种抽象层次上有很多中间件来帮助编写服务器。如果您不需要Web服务/远程处理机制,ZeroMQ,RabbitMQ,QuickServer都是不错的选择。 – millimoose

+0

isUserName是一个布尔变量,用于确定用户名是否存在于数据库中,并且在socketWriter.println(isUserName)之前具有正确的形式:true或false。但是当它通过套接字传输时,结果变成“[] [] [] false”或“[] [] [] true”,其中“[] [] []”是某些不可读的数据。 –

回答

1

isUserNameboolean。也许你的意思是socketWriter.println(userName);

请使用下面的代码向我们展示损坏的字符串的样子!

System.out.println(userNameResultParameter); 
System.out.print("Chars:"); 
for (char c : userNameResultParameter.toCharArray()) 
    System.out.print(" 0x" + Integer.toHexString((int)c)); 
+0

不,我想调用isUserName。据我所知,println()方法将所有东西都转换为字符串,所以它应该将“真”或“假”作为字符串传递,但是当我在客户端接收它们时会损坏。结果就像“[] [] [] false”,其中“[] [] []”是一些不可读的数据。我不明白是什么问题。 –

+0

两个问题:是[] [] []每次都一样吗?其次,你可以使用我编辑过的代码将我们可以看到的字节数组转换为字符串吗? – durron597

+0

是的,每次不可读的数据都是一样的。当我把你的代码的结果是: 0xfffd 0xfffd 0x0 0x5 0x74 0x72 0x75 0x65 当我第二次运行程序时,结果是一样的。 –

0

这个问题,我认为是与InputStreamReader的建设。默认情况下,读者假定传入字符数据的编码是您平台的默认编码,但Writer(在服务器端)正在发送UTF-8数据。

尝试构建InputStreamReader这样的:

new InputStreamReader(socket.getInputStream(), "UTF-8")

+0

我试着修改InputStreamReader的构造函数,但结果是一样的。 –