gpt4 book ai didi

java - Socket OutputStream 上的 PrintWriter 导致数据损坏/丢失

转载 作者:行者123 更新时间:2023-11-30 08:28:25 24 4
gpt4 key购买 nike

我正在尝试将字符串从默认字符编码为 UTF-8 的服务器发送到默认字符编码为 windows-1252 的客户端> 通过 SocketPrintWriter

当我运行下面的客户端时,即使我尝试使用 CharsetDecoder 转换字符串,我也没有取回原始值 141。

作为控制测试,我尝试在 Eclipse 中运行这两个类,并通过下面的对话强制使用 UTF-8 作为它们的默认编码系统——我观察到当两个客户端都使用 UTF- 8、客户端解释成功。

更新:看起来我能够流式传输字节并恢复初始格式,但为了这样做,我必须知道服务器上使用的编码。在这种情况下是否没有某种有用的库?我宁愿不被迫以字节数组的形式传输数据。

Eclipse Dialog

服务器:

import java.io.OutputStreamWriter;
import java.io.PrintWriter;
import java.net.ServerSocket;
import java.net.Socket;

//Runs on a server with default character encoding of UTF-8
public class TestServer {

public static void main(String[] args) throws Exception {

PrintWriter writer = null;
ServerSocket serverSocket = null;
try {

int x = 141;
String s = "#" + (char)x;

serverSocket = new ServerSocket(5555);
Socket clientSocket = serverSocket.accept();

writer = new PrintWriter(
(new OutputStreamWriter(clientSocket.getOutputStream())), true);

System.out.println((int)s.charAt(1));
writer.write(s);
} catch(Exception e) {

e.printStackTrace();
} finally {

writer.close();
serverSocket.close();
}
}
}

客户:

import java.io.BufferedReader;
import java.io.InputStreamReader;
import java.net.Socket;
import java.nio.ByteBuffer;
import java.nio.CharBuffer;
import java.nio.charset.Charset;
import java.nio.charset.CharsetDecoder;

//Runs on a server with default character encoding of windows-1252
public class TestClient {

public static void main(String[] args) throws Exception {

Socket s = new Socket("localhost", 5555);
BufferedReader reader = new BufferedReader(new InputStreamReader(s.getInputStream()));

String string = reader.readLine();
System.out.println((int)string.charAt(1)); //prints 194 when it was 141 on the other end

//Charset.defaultCharset returns windows-1252
CharsetDecoder decoder = Charset.defaultCharset().newDecoder();
CharBuffer buffer = decoder.decode(ByteBuffer.wrap(string.getBytes()));
String convertedString = buffer.toString();

System.out.println((int)convertedString.charAt(1)); //still prints 194

String convertedString2 = new String(string.getBytes(), "UTF-8");
System.out.println((int)convertedString2.charAt(1)); //prints 65533 ??

s.close();
}
}

最佳答案

我发现有 OutputStreamWriter 和 InputStreamReader 构造函数将字符集作为参数。这是我使用的解决方案:

关于发件人:

out = new PrintWriter(
new BufferedWriter(new OutputStreamWriter(
socket.getOutputStream(), "UTF-8")), true);

在接收器上:

in = new BufferedReader(new InputStreamReader(socket.getInputStream(), "UTF-8"));

关于java - Socket OutputStream 上的 PrintWriter 导致数据损坏/丢失,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20203438/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com