- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我正在尝试与 Java 聊天。一切正常,除了特殊字符不起作用。我认为这是一个编码问题,因为在我的 Outputstream
中我用 UTF-8 编码字符串,如下所示:
protected void send(String msg) {
try {
msg+="\r\n";
OutputStream outStream = socket.getOutputStream();
outStream.write(msg.getBytes("UTF-8"));
System.out.println(msg.getBytes("UTF-8"));
outStream.flush();
}
catch(IOException ex) {
ex.printStackTrace();
}
}
但在我的
receive
方法我没有找到这样做的方法:
public String receive() throws IOException {
String line = "";
InputStream inStream = socket.getInputStream();
int read = inStream.read();
while (read!=10 && read > -1) {
line+=String.valueOf((char)read);
read = inStream.read();
}
if (read==-1) return null;
line+=String.valueOf((char)read);
return line;
}
那么有没有一种快速的方法来指定缓冲区读取的字节是用 UTF-8 编码的?
BufferedReader
像这样:
public String receive() throws IOException {
String line = "";
in = new BufferedReader(new InputStreamReader(socket.getInputStream(), "UTF-8"));
String readLine = "";
while ((readLine = in.readLine()) != null) {
line+=readLine;
}
System.out.println("Line:"+line);
return line;
}
但它不起作用。似乎套接字没有收到任何东西。
最佳答案
试图为 future 的访客提供更多的光线。
经验法则: 服务器和客户端必须在编码方案之间同步,因为如果客户端发送使用某种编码方案编码的数据而服务器正在使用其他编码方案读取数据,则永远无法实现预期的结果。
需要注意的重要事项 对于尝试测试这一点的人来说,不要在客户端以 ASCII 编码(或换句话说在客户端使用 ASCII 编码)并在服务器端使用 UTF8 解码(或换句话说使用 UTF8在服务器端编码)因为 UTF8 向后兼容 ASCII,所以可能会觉得“经验法则”是错误的,但不,它不是,所以最好在客户端使用 UTF8,在服务器端使用 UTF16,你就会明白。
使用套接字编码
我想要理解的最重要的事情是: 最后通过您要发送的套接字 BYTES 但这一切都取决于这些字节的编码方式 。
例如,如果我使用 Windows 命令提示符将输入发送到服务器(通过客户端 - 服务器套接字),那么数据将使用某种编码方案进行编码(我真的不知道是哪个),如果我使用另一个客户端将数据发送到服务器代码/程序然后我可以指定我想用于我的客户端套接字的 o/p 流的编码方案,然后所有数据将使用该编码方案转换/编码为 BYTES 并通过套接字发送。
现在,最后我仍然通过线路发送 BYTES,但这些是使用我指定的编码方案进行编码的。如果 假设在服务器端,我在读取套接字的 i/p 流时使用另一种编码方案,则无法达到预期的结果,如果我在服务器上使用相同的编码方案(与客户端的编码方案相同),那么一切都会是完美的 。
回答这个问题
在 Java 中,有特殊的“桥接”流(读取 here )可用于指定流的编码。
请注意:Java 中的 InputStream
和 OutputStream
是 BYTE 流,因此使用这些流读取和写入的所有内容都将是 BYTES,您不能使用 0x10455667104 类和 Java67x914 类的对象指定编码,因此可以使用桥接类。
下面是客户端和服务器的代码片段,我试图向 展示如何在客户端的输出流和服务器的输入流 上指定编码。
只要我在两端指定相同的编码,一切都会很完美。
客户端:
Socket clientSocket = new Socket("abc.com", 25050);
OutputStreamWriter clientSocketWriter = (new OutputStreamWriter(clientSocket.getOutputStream(), "UTF8"));
ServerSocket serverSocket = new ServerSocket(8001);
Socket clientSocket = serverSocket.accept();
// PLEASE NOTE: important thing below is I am specifying the encoding over my socket's input stream, and since Java's <<InputStream>> is a BYTE stream,
// so in order to specify the encoding I am using Java I/O's bridge class <<InputStreamReader>> and specifying my UTF8 encoding.
// So, with this all my data (BYTES really) will be read from client socket as bytes "BUT" those will be read as UTF8 encoded bytes.
// Suppose if I specify different encoding here, than what client is specifying in its o/p stream than data cannot read properly and may be all "?"
InputStreamReader clientSocketReader = (new InputStreamReader(clientSocket.getInputStream(), "UTF8"));
关于java - 套接字 InputStream 和 UTF-8,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24393112/
我使用下拉菜单提供一些不同的链接,但我希望这些链接在同一选项卡中打开,而不是在新选项卡中打开。这是我找到的代码,但我对 Javascript 非常缺乏知识 var urlmenu = docume
我对 javascript 不太了解。但我需要一个垂直菜单上的下拉菜单,它是纯 JavaScript,所以我从 W3 复制/粘贴脚本:https://www.w3schools.com/howto/t
我已经坐了 4 个小时,试图让我的导航显示下 zipper 接垂直,但它继续水平显示它们。我无法弄清楚为什么会发生这种情况或如何解决它。 如果有人能告诉我我做错了什么,我将不胜感激。我有一个潜移默化的
我正在尝试创建选项卡式 Accordion 样式下拉菜单。我使用 jQuery 有一段时间了,但无法使事件状态达到 100%。 我很确定这是我搞砸的 JS。 $('.service-button').
对于那些从未访问过 Dropbox 的人,这里是链接 https://www.dropbox.com/ 查看“登录”的下拉菜单链接。我如何创建这样的下 zipper 接? 最佳答案 这是 fiddle
我正在制作一个 Liferay 主题,但我在尝试设计导航菜单的样式时遇到了很多麻烦。我已经为那些没有像这样下拉的人改变了导航链接上的经典主题悬停功能: .aui #navigation .nav li
如果您将鼠标悬停在 li 上,则会出现一个下拉菜单。如果您将指针向下移至悬停时出现的 ul,我希望链接仍然带有下划线,直到您将箭头从 ul 或链接移开。这样你就知道当菜单下拉时你悬停在哪个菜单上。 知
我有一个带有多个下拉菜单的导航栏。因此,当我单击第一个链接时,它会打开下拉菜单,但是当我单击第二个链接时,第一个下拉菜单不会关闭。 (所以如果用户点击第二个链接我想关闭下拉菜单) // main.js
我正在尝试制作一个导航下拉菜单(使用 Bootstrap 3),其中链接文本在同一行上有多个不同的对齐方式。 在下面的代码中,下拉列表 A 中的链接在 HTML 中有空格字符来对齐它们,但是空白被忽略
我希望有人能帮我解决这个 Bootstrap 问题,因为我很困惑。 有人要求我在底部垂直对齐图像和其中包含图像的链接。 我面临的问题是他们还希望链接在链接/图像组合上具有 pull-right,这会杀
我正在构建一个 Rails 应用程序,并希望指向我的类的每个实例的“显示”页面的链接显示在“索引”页面的下拉列表中。我目前正在使用带有 options_from_collection_for_sele
我有以下 Bootstrap3 导航菜单 ( fiddle here )。我想设置“突出显示”项及其子链接与下拉列表 1 和 2 链接不同的链接文本(和悬停)的样式。我还希望能够以不同于 Highli
我对导航栏中的下拉菜单有疑问。对于普通的导航链接(无下拉菜单),我将菜单文本放在 H3 中,但是当我尝试对下 zipper 接执行相同操作时,箭头不在标题旁边,而是在标题下方。我决定用 span 替换
我是一名优秀的程序员,十分优秀!