java - 通过套接字发送数据后字符串到字节数组,反之亦然

标签 java string sockets bytearray

我有一个客户端和一个服务器,它们都在同一台计算机(使用 Windows 7 操作系统)上运行。编程语言是java。

发送消息我使用:

public static void sendMessage(Socket socket,String message) throws IOException{
    byte[] mBytes = message.getBytes();
    output.write(mBytes, 0, mBytes.length);
    output.flush();
}

为了接收我使用:

 byte read = (byte) input.read();

多次(该方法很长,但我认为细节并不重要)并将结果存储在 byte[] messageBytes 中。保留我使用的消息

String message = new String(messageBytes);

这对我来说效果很好。但我想知道这里使用的编码。在一台主机上使用 getBytes() 并在另一台主机上使用 new String(byte[] bytes) 是否可以?这样的行为是好的作风吗?

最佳答案

不,在从字节和到字节的转换中不指定相同的编码是不行的。这是因为 Java 将使用默认编码,并且这些编码在不同的服务器上可能会有所不同。

因此,假设在发件人端您有默认的 cp1252(即 Windows 主机),但在服务器站点上您有 UTF-8 (Linux)。一旦你有非 ASCII 字符,你就会得到垃圾。

这可能很难检测到。其一,您的所有服务器都可以具有相同的默认编码(例如,如果您在同一台主机上运行客户端和服务器)。其次,确保您的测试数据包含一些非 ASCII 字符,例如 € 符号、变音符号甚至汉字。

请记住,即使目前客户端/服务器确实在同一台主机上运行:从一开始就确保其健壮和正确,以消除只有当客户端和服务器位于相似平台上时您的软件才能正确运行的限制。

关于java - 通过套接字发送数据后字符串到字节数组,反之亦然,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21119050/

相关文章:

java - Java 请求中的 HTTPS SSL GET 失败

c++ - 字符串缓冲区如何导致恶意代码运行?

Java:仅获取用户输入字符串的第一个单词

python套接字对象接受超时

java - Android 应用程序启动套接字不工作

sockets - 数据包和套接字有什么区别?

java - 在 Java 中呈现 Excel 工作表报告的最佳实践是什么?

java - 在 teamcity 构建和部署后运行 spring boot 应用程序

java - 带可选右括号的年份正则表达式

python - 值错误 : invalid literal for int() with base 10: 'stop'