我是否从来自套接字的 inputStream 获得格式错误的输入?
Do i get malformed input from inputStream coming off a socket?
我正在尝试连接到 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();
}
}
}
输出:
output
一个java流returns字节,但是读returns一个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 个字节的任何内容。
我正在尝试连接到 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();
}
}
}
输出:
output
一个java流returns字节,但是读returns一个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 个字节的任何内容。