如何将字节写入服务器套接字
how to write bytes to server socket
我正在编写一个 java 套接字程序来从服务器读取数据,我无法控制服务器,下面是约定的协议,
- 2 字节:幻数
- 2字节:数据长度
- N 字节:ASCII 字符串数据负载
- 幻数和数据长度的大端
例如:如果我的请求是 "command/1/getuserlist" 如何构建符合上述协议的请求并将响应读回列表
我是套接字编程的新手,不知道如何构建我的请求并读回响应。
谁能指导我如何构建请求并阅读来自
的响应
根据规范,您必须按照以下方式构建数据包
| 2 | 2 | N ........ |
现在这可能很容易,而且有多种方法可以做到,我建议你一个:
import java.nio.ByteBuffer;
import java.nio.ByteOrder;
static byte[] buildPacket(int magicNumber, String payload) throws UnsupportedEncodingException
{
// 4 bytes for header + payload
ByteBuffer buffer = ByteBuffer.allocate(2 + 2 + payload.length());
// we set that we want big endian numbers
buffer.order(ByteOrder.BIG_ENDIAN);
buffer.putShort((short)magicNumber);
buffer.putShort((short)payload.length());
buffer.put(payload.getBytes("US-ASCII"));
return buffer.array();
}
public static void main (String[] args) throws java.lang.Exception
{
try
{
byte[] bytes = buildPacket(0xFF10, "foobar");
for (byte b : bytes)
System.out.printf("0x%02X ", b);
}
catch (Exception e)
{
e.printStackTrace();
}
}
请注意,如果您直接声明接受 short
幻数的方法,您将无法传递文字幻数 > 32767
,因为 short
已登录Java.
在 `Socket.getOutputStream() 周围使用 DataOutputStream
围绕 BufferedOutputStream
。然后你可以使用:
writeShort()
为幻数
writeShort()
为字长
write()
用于负载。
同样,您可以使用 DataInputStream
和相应的 readXXX()
方法来读取响应。
注意您正在写入这里的套接字,而不是服务器套接字。
注意大结局!
DataxxxStream - 虽然它非常方便 - 不提供对小端和大端数字以及任意字符串编码的完全支持。
在 How to Read Byte Stream from Socket
查看我的 post
我正在编写一个 java 套接字程序来从服务器读取数据,我无法控制服务器,下面是约定的协议,
- 2 字节:幻数
- 2字节:数据长度
- N 字节:ASCII 字符串数据负载
- 幻数和数据长度的大端
例如:如果我的请求是 "command/1/getuserlist" 如何构建符合上述协议的请求并将响应读回列表
我是套接字编程的新手,不知道如何构建我的请求并读回响应。
谁能指导我如何构建请求并阅读来自
的响应根据规范,您必须按照以下方式构建数据包
| 2 | 2 | N ........ |
现在这可能很容易,而且有多种方法可以做到,我建议你一个:
import java.nio.ByteBuffer;
import java.nio.ByteOrder;
static byte[] buildPacket(int magicNumber, String payload) throws UnsupportedEncodingException
{
// 4 bytes for header + payload
ByteBuffer buffer = ByteBuffer.allocate(2 + 2 + payload.length());
// we set that we want big endian numbers
buffer.order(ByteOrder.BIG_ENDIAN);
buffer.putShort((short)magicNumber);
buffer.putShort((short)payload.length());
buffer.put(payload.getBytes("US-ASCII"));
return buffer.array();
}
public static void main (String[] args) throws java.lang.Exception
{
try
{
byte[] bytes = buildPacket(0xFF10, "foobar");
for (byte b : bytes)
System.out.printf("0x%02X ", b);
}
catch (Exception e)
{
e.printStackTrace();
}
}
请注意,如果您直接声明接受 short
幻数的方法,您将无法传递文字幻数 > 32767
,因为 short
已登录Java.
在 `Socket.getOutputStream() 周围使用 DataOutputStream
围绕 BufferedOutputStream
。然后你可以使用:
writeShort()
为幻数writeShort()
为字长write()
用于负载。
同样,您可以使用 DataInputStream
和相应的 readXXX()
方法来读取响应。
注意您正在写入这里的套接字,而不是服务器套接字。
注意大结局!
DataxxxStream - 虽然它非常方便 - 不提供对小端和大端数字以及任意字符串编码的完全支持。
在 How to Read Byte Stream from Socket
查看我的 post