Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/397.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 - Fatal编程技术网

Java中的应用层协议头字段

Java中的应用层协议头字段,java,Java,我希望这个问题适合这里。我设计了一个应用层协议,比如说类似于HTTP。如何在Java中定义和设置标题字段?总的来说,我只想编写一个简单的客户机-服务器程序来传输“helloworld”字符串,但使用我自己的协议 假设标题字段类似于以下内容。因此,“Hello World!”数据位于该标题之后 有很多方法。这种规范附带xsd是很常见的。如果是这种情况,您可以使用JAXB2对其进行解析并创建一组Java类 如果不是这样的话,那么您可能有这样的规范:您可以使用grep、sed,执行文本处理并提取属性和

我希望这个问题适合这里。我设计了一个应用层协议,比如说类似于HTTP。如何在Java中定义和设置标题字段?总的来说,我只想编写一个简单的客户机-服务器程序来传输“helloworld”字符串,但使用我自己的协议

假设标题字段类似于以下内容。因此,“Hello World!”数据位于该标题之后


有很多方法。这种规范附带
xsd
是很常见的。如果是这种情况,您可以使用JAXB2对其进行解析并创建一组Java类

如果不是这样的话,那么您可能有这样的规范:您可以使用
grep
sed
,执行文本处理并提取属性和类型,以自动化Java类构造

如果最终您必须自己构建Java类,我将执行以下操作:

package my.package.ams;

public class ASMHeader {
    private Integer version = null;
    private Integer msgType = null;
    private Integer priority = null;
    ...

    public String getVersionString (){
        return String.format("%02d", (version != null)?version:0);
    }

    public Integer getVersion(){
        return version;
    }

    public void setVersion(Integer version){
        if(version >= 0 and version < 100){
            this.version = version;
        }
    }

    public Integer getMsgType(){
        return msgType;
    }

    public void setMsgType(Integer MsgType){
        if(msgType >= 0 and msgType < 5){
            this.msgType = msgType;
        }
    }

    //And so on

    ....
} 
package my.package.ams;
公共类标题{
私有整数版本=null;
私有整数msgType=null;
私有整数优先级=null;
...
公共字符串getVersionString(){
返回字符串.format(“%02d”,(版本!=null)?版本:0;
}
公共整数getVersion(){
返回版本;
}
公共void setVersion(整数版本){
如果(版本>=0且版本<100){
this.version=版本;
}
}
公共整数getMsgType(){
返回msgType;
}
公共void setMsgType(整数MsgType){
如果(msgType>=0且msgType<5){
this.msgType=msgType;
}
}
//等等
....
} 
最后,您的NPIC中没有显示处理规则,但您必须理解并实施这些规则

考虑在
version
msgType
和其他变量不符合文档中表达的规则时引发异常的可能性


希望有帮助

当您写入套接字时,您正在写入字节流。在您的问题中包含的表格中,通常以一系列标准字节开始该流,这些字节提供理解剩余流所需的信息

例如,如果您只想发送一个字符串,则需要添加的最小字符串长度如下:

|message length|data|
String data = "Hello, world!";

ByteBuffer buffer = ByteBuffer.allocate(data.length + Integer.BYTES);
buffer.putInt(data.length);    
buffer.put(data.getBytes("UTF-8"));
buffer.flip();

channel.write(buffer);
Map<Integer, String> headers = ...
String data = "Hello, world - look at my headers!";

int headerBuffersLength = 0;
List<ByteBuffer> headerBuffers = new ArrayList<>();

for(Integer headerType : headers.keySet())
{
  String headerData = headers.get(headerType);

  ByteBuffer headerBuffer = ByteBuffer.allocation(headerData.size + Integer.BYTES + Integer.BYTES);
  headerBuffer.putInt(headerData.length);
  headerBuffer.putInt(headerType);
  headerBuffer.put(headerData.getBytes("UTF-8"));
  headerBuffer.flip();

  headerBuffers.add(headerBuffer);

  headerBuffersLength += headerBuffer.limit();
}

ByteBuffer buffer = ByteBuffer.allocate(data.length + headerBuffersLength + Integer.BYTES + Integer.BYTES);
buffer.putInt(data.length + headerBuffersLength);    
buffer.putInt(headerBuffers.size());

for (ByteBuffer headerBuffer : headerBuffers)
{
  buffer.put(headerBuffer);
}

buffer.put(data.getBytes("UTF-8"));
buffer.flip();

channel.write(buffer);
可以这样写:

|message length|data|
String data = "Hello, world!";

ByteBuffer buffer = ByteBuffer.allocate(data.length + Integer.BYTES);
buffer.putInt(data.length);    
buffer.put(data.getBytes("UTF-8"));
buffer.flip();

channel.write(buffer);
Map<Integer, String> headers = ...
String data = "Hello, world - look at my headers!";

int headerBuffersLength = 0;
List<ByteBuffer> headerBuffers = new ArrayList<>();

for(Integer headerType : headers.keySet())
{
  String headerData = headers.get(headerType);

  ByteBuffer headerBuffer = ByteBuffer.allocation(headerData.size + Integer.BYTES + Integer.BYTES);
  headerBuffer.putInt(headerData.length);
  headerBuffer.putInt(headerType);
  headerBuffer.put(headerData.getBytes("UTF-8"));
  headerBuffer.flip();

  headerBuffers.add(headerBuffer);

  headerBuffersLength += headerBuffer.limit();
}

ByteBuffer buffer = ByteBuffer.allocate(data.length + headerBuffersLength + Integer.BYTES + Integer.BYTES);
buffer.putInt(data.length + headerBuffersLength);    
buffer.putInt(headerBuffers.size());

for (ByteBuffer headerBuffer : headerBuffers)
{
  buffer.put(headerBuffer);
}

buffer.put(data.getBytes("UTF-8"));
buffer.flip();

channel.write(buffer);
添加额外的头信息也没什么不同,您只需要在流中为它定义一种格式

例如,您可以使用如下格式

|message length|header count|header size|header type|header data|data|
可以这样写:

|message length|data|
String data = "Hello, world!";

ByteBuffer buffer = ByteBuffer.allocate(data.length + Integer.BYTES);
buffer.putInt(data.length);    
buffer.put(data.getBytes("UTF-8"));
buffer.flip();

channel.write(buffer);
Map<Integer, String> headers = ...
String data = "Hello, world - look at my headers!";

int headerBuffersLength = 0;
List<ByteBuffer> headerBuffers = new ArrayList<>();

for(Integer headerType : headers.keySet())
{
  String headerData = headers.get(headerType);

  ByteBuffer headerBuffer = ByteBuffer.allocation(headerData.size + Integer.BYTES + Integer.BYTES);
  headerBuffer.putInt(headerData.length);
  headerBuffer.putInt(headerType);
  headerBuffer.put(headerData.getBytes("UTF-8"));
  headerBuffer.flip();

  headerBuffers.add(headerBuffer);

  headerBuffersLength += headerBuffer.limit();
}

ByteBuffer buffer = ByteBuffer.allocate(data.length + headerBuffersLength + Integer.BYTES + Integer.BYTES);
buffer.putInt(data.length + headerBuffersLength);    
buffer.putInt(headerBuffers.size());

for (ByteBuffer headerBuffer : headerBuffers)
{
  buffer.put(headerBuffer);
}

buffer.put(data.getBytes("UTF-8"));
buffer.flip();

channel.write(buffer);
映射头=。。。
String data=“你好,世界-看看我的标题!”;
int headerBuffersLength=0;
List headerBuffers=new ArrayList();
for(整数头类型:headers.keySet())
{
字符串headerData=headers.get(headerType);
ByteBuffer headerBuffer=ByteBuffer.allocation(headerData.size+Integer.BYTES+Integer.BYTES);
headerBuffer.putInt(headerData.length);
headerBuffer.putInt(headerType);
headerBuffer.put(headerData.getBytes(“UTF-8”);
headerBuffer.flip();
headerBuffers.add(headerBuffer);
headerBuffersLength+=headerBuffer.limit();
}
ByteBuffer buffer=ByteBuffer.allocate(data.length+headerBuffersLength+Integer.BYTES+Integer.BYTES);
buffer.putInt(data.length+headerBuffersLength);
buffer.putInt(headerBuffers.size());
用于(ByteBuffer headerBuffer:headerBuffers)
{
缓冲器。put(头部缓冲器);
}
buffer.put(data.getBytes(“UTF-8”);
flip();
通道写入(缓冲区);

这是基础,代码编写起来非常简单,但是如果要做更复杂的事情,您可能需要看看。

我只有一段简单的客户机-服务器代码。我不知道如何设置/更改标题字段。这是我的问题。您使用的是哪台web服务器?如果您自己定义了该协议,您应该能够相应地设置标题,例如,首先将它们收集到一些扩展字段(例如枚举、字符串、整数等)中,然后在发送标题时将这些字段打包到标题格式中。@Thomas谢谢。但我的问题是标题本身。我甚至应该如何设置头,或者用当前的头替换我的头?我不明白:您能够设计协议,但不知道如何将头写入流(创建和填充头对象不应该是任何问题)?“用当前的替换我的”是什么意思?你的标题不是你想用的吗?谢谢尼克。因此,基本上应该在数据本身之前手动添加标题。这可以看作是一个标题!我认为Java头是预定义的,并且是自动添加的,除非我们使用API来修改它们!确切的格式取决于您,如果您正在向套接字写入,那么它只是字节,没有标题的概念,除非您定义它。