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

时间:2016-03-12 00:22:08

标签: java sockets serversocket

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

  • 2字节:幻数
  • 2字节:数据长度
  • N字节:ASCII字符串数据有效负载
  • 神奇数字和数据长度的大端

例如:如果我的请求是"命令/ 1 / getuserlist"如何构造上述协议的请求匹配并将响应读回List

我是套接字编程的新手,不知道如何构建我的请求并阅读回复。

有人可以指导我如何构建请求并从

中读取响应

3 个答案:

答案 0 :(得分:1)

根据规范,您必须构建一个以下列方式形成的数据包

| 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签名的。

答案 1 :(得分:0)

在`Socket.getOutputStream()周围的DataOutputStream周围使用BufferedOutputStream。然后你可以使用:

  • writeShort()表示幻数
  • writeShort()的长度字
  • write()表示有效负载。

同样,您可以使用DataInputStream和相应的readXXX()方法来阅读回复。

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

答案 2 :(得分:-1)

注意大的内涵!

DataxxxStream - 尽管它非常方便 - 不能完全支持小端和大端数字以及任意字符串编码。

请参阅How to Read Byte Stream from Socket

上的帖子