簡體   English   中英

通過Java中的套接字損壞字符串

[英]Corrupted string through Sockets in 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”變量被轉移,並在客戶端中被破壞。

你能幫忙解決這個問題嗎? 謝謝!

isUserName是一個boolean 也許你的意思是socketWriter.println(userName);

請使用下面的代碼向我們展示損壞的String的樣子!

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

我認為,問題在於構造InputStreamReader 默認情況下,讀者假設傳入字符數據的編碼是您平台的默認編碼,但Writer (在服務器端)正在發送UTF-8數據。

嘗試構建InputStreamReader如下所示:

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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM