java - 我是否从来自套接字的 inputStream 获得格式错误的输入?
问题描述
我正在尝试连接到 WebSocket(当前使用 chrome 扩展)。我得到它的工作,我收到数据。当我尝试转换从输入流接收的整数时,我得到了完全其他的值。在下面的示例中,我输入了单词 test 作为输入。那么我做错了什么还是我解释输入错误?
代码:
@Override
public void run() {
while (true) {
try {
if(client.getInputStream().read() != -1) {
int i = client.getInputStream().read();
System.out.println("Integer: " + i);
byte b = (byte) i;
System.out.println("Byte: " + b);
char c = (char) b;
System.out.println("Char: " + c);
System.out.println("-=-=-=-=-=-=-=-=-=-=-=-");
}
} catch (IOException e) {
e.printStackTrace();
}
}
}
输出:
解决方案
java 流返回字节,但 read 返回一个 int,因此您可以获得 -1。因此,如果您的服务器正在发送一个 int,那么您需要读取该 int 的所有字节并创建它。
你有两种方法可以做到这一点。创建一个 byte[] 并将其用作缓冲区,或者如果您正在接收 32 位二进制补码整数,那么您可以使用 DataInputStream。
使用缓冲区的示例。
@Override
public void run() {
while (true) {
try {
byte[] buffer = new byte[4];
if(client.getInputStream().read(buffer) != -1) {
int i = (
( ( buffer[0] & 0xff ) << 24 ) |
( ( buffer[1] & 0xff ) << 16 ) |
( (buffer[2] & 0xff ) << 8) |
(buffer[3] & 0xff)
);
System.out.println("Integer: " + i);
}
} catch (IOException e) {
e.printStackTrace();
}
}
}
或者您可以使用 DataInputStream。
DataInputStream dis = new DataInputStream(client.getInputStream());
try{
int i = dis.readInt();
} catch( EOFException e){
//end of file. This is like getting -1.
} catch( IOException e ){
//do something for an error
}
缓冲区版本使用与 java 的DataInput.readInt相同的转换,我已将其作为示例包含在内。还有一些额外的检查应该做。即使缓冲区有 4 个字节长,您也可以读取 1 到 4 个字节的任何内容。
推荐阅读
- java - 从 Wicket 外部类中的内部 onClick 方法访问变量
- debugging - pyspark 数据框方法(即 show())无法在 vs 代码调试控制台中打印
- sql-server - SQL Server:需要旋转一些列
- python - 即使在 jupyter notebook 中使用 plt.close(),如何防止 matplotlib 显示图形
- node.js - 有没有办法只得到消息作者的名字
- sql - 跨重复 ID 查找查询中的最新项目
- amazon-web-services - 身份验证的 API 速率限制
- flutter - 颤振:下拉项目以编程方式取消选择问题
- java - PIT 测试说 Minion 由于 TIMED_OUT 异常退出
- python - 未找到任何参数的“详细信息”反向。尝试了 1 种模式:['product/(?P
[-a-zA-Z0-9_]+)$']