Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/sockets/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 如何将字节写入服务器套接字_Java_Sockets_Serversocket - Fatal编程技术网

Java 如何将字节写入服务器套接字

Java 如何将字节写入服务器套接字,java,sockets,serversocket,Java,Sockets,Serversocket,我正在写一个java套接字程序来从服务器读取数据,我无法控制服务器,下面是协议约定 2字节:幻数 2字节:数据长度 N字节:ASCII字符串数据有效负载 用于幻数和数据长度的Big-endian 例如:如果我的请求是“command/1/getuserlist”,如何构造与上述协议匹配的请求,并将响应读回列表 我是套接字编程新手,不知道如何构建请求并读回响应 是否有人可以指导我如何构建请求并从中读取响应?根据规范,您必须按照以下方式构建数据包 | 2 | 2 | N ........ |

我正在写一个java套接字程序来从服务器读取数据,我无法控制服务器,下面是协议约定

  • 2字节:幻数
  • 2字节:数据长度
  • N字节:ASCII字符串数据有效负载
  • 用于幻数和数据长度的Big-endian
例如:如果我的请求是“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
。然后您可以使用:

  • writeShort()
    用于幻数
  • writeShort()
    用于长度字
  • 有效负载的
    write()
类似地,您可以使用
DataInputStream
和相应的
readXXX()
方法来读取响应


注意,您正在向此处的套接字而不是服务器套接字写入数据。

请注意大端性

DataxxxStream虽然非常方便,但它不完全支持小端和大端数字以及任意字符串编码


请参阅我在

Check
ByteBuffer
documentation上的帖子,这里有您需要的一切:问题清楚地指定了big-endian字节顺序。EJP,我尊重您的答案。我想知道为什么您忽略了DataXXStream不是解决方案的边缘情况,例如在两个独立的问题中的小端数据和非utf8字符串编码?!