「java读写报文」java报文格式

博主:adminadmin 2023-03-20 02:15:09 380

今天给各位分享java读写报文的知识,其中也会对java报文格式进行解释,如果能碰巧解决你现在面临的问题,别忘了关注本站,现在开始吧!

本文目录一览:

java解析报文

ByteBuffer bb = ByteBuffer.wrap(data, offset, length);

if (bb.remaining() MIN_HEADER_LENGTH) {

return this;

}

this.opCode = bb.get();

this.transactionId = bb.getInt();

按照这种节奏搞吧,这个很简单的啊,拿到BYTEBUFFER以后,一点一点的处理byte。

Java Socket开发 关于报文传递和接收

看 Oracle 官方教程,同步式的 Socket 就是传统的一问一答方式,它就是你需要的。

客户端先 socket.getOutputStream().write(...); 之后到 socket.getInputStream().read(byte[]) 在循环中读取直到 read 方法返回 -1 或你期望的字节数已经全部收到了就停下来,如果不尝试停下来,后面的 read 将会阻塞等待。

基于性能改进,一般我们需要使用 NIO 异步的 socket,只需要一个线程负责通信,每个线程都有自己的出站消息队列和入站消息队列,以线程为 key 区分开,通信线程只负责把各自的消息从出站队列中发送去并把收到的消息放入入站队列中,应用程序线程就去各自的消息队列中取消息就可以了。因为每个应用线程有各自的消息队列,我们把消息放入出站队列之后就到入站队列上用同步锁等待的方法阻塞到有消息回答时为止。

关于 NIO non-blocking 非阻塞式 socket,下面有一个 NBTimeServer 例子,它讲的是服务端。客户端与此类似,

NIO 通信线程样例。

  public void run()

    {

        int tip = 0;

        try

        {

            selector = Selector.open();

            SelectionKey k = channel.register(selector, getInterestOptions());

            k.attach(thread); // 把当前线程绑定到附件中。

            this.running = true;

            statusChanged(Status.CONNECTED);

            while (this.isRunning())

            {

                // select() is a blocking operation.

                int eventCount = selector.select();

                debug("[MC.Debug] Polling TCP events ... " + eventCount);

                if (eventCount  0  channel.isOpen()  this.isRunning())

                {

                    Set keys = selector.selectedKeys();

                    for (Iterator iter = keys.iterator(); iter.hasNext(); iter.remove())

                    {

                        SelectionKey key = (SelectionKey) iter.next();

                        Thread thread = (Thread) key.attachment();

                        

                        if (!key.isValid())

                        { // channel is closing.

                            break;

                        }

                        process(key); // 处理读取消息并把消息放入 thread 对应的队列。//写出消息类似的,不过在 register 时需要注册写出允许的事件,

                        

                    }

                }

            }

        }

Java按字节读取不定长报文

饿。。。。好吧

http协议里是用\r\n来做断句的,那么你可以用readline来读取 更方便些

在http协议里有个字段,叫Content-length的字段,他给出了下面http协议内容的长度,你可以按这个大小来new一个数组。

当然。。。如果没有Content-length。那搞个arraylistByte?就是Byte包装起来有点麻烦。

或者你发现不够大了 重新开的新的更大的数组 然后把剩下的复制过去 模拟一下arraylist?

如何实现java解析网络协议报文

普通参数:

Content-Type: text/plain; charset=UTF-8

Content-Transfer-Encoding: 8bit

文件参数:

Content-Type: application/octet-stream

Content-Transfer-Encoding: binary

参数实体的最后一行是: --加上boundary加上--,最后换行,这里的 格式即为: --OCqxMF6-JxtxoMDHmoG5W5eY9MGRsTBp--。

模拟文件上传请求

public static void uploadFile(String fileName) {

try {

// 换行符

final String newLine = "\r\n";

final String boundaryPrefix = "--";

// 定义数据分隔线

String BOUNDARY = "========7d4a6d158c9";

// 服务器的域名

URL url = new URL("");

HttpURLConnection conn = (HttpURLConnection) url.openConnection();

// 设置为POST情

conn.setRequestMethod("POST");

// 发送POST请求必须设置如下两行

conn.setDoOutput(true);

conn.setDoInput(true);

conn.setUseCaches(false);

// 设置请求头参数

conn.setRequestProperty("connection", "Keep-Alive");

conn.setRequestProperty("Charsert", "UTF-8");

conn.setRequestProperty("Content-Type", "multipart/form-data; boundary=" + BOUNDARY);

OutputStream out = new DataOutputStream(conn.getOutputStream());

// 上传文件

File file = new File(fileName);

StringBuilder sb = new StringBuilder();

sb.append(boundaryPrefix);

sb.append(BOUNDARY);

sb.append(newLine);

// 文件参数,photo参数名可以随意修改

sb.append("Content-Disposition: form-data;name=\"photo\";filename=\"" + fileName

+ "\"" + newLine);

sb.append("Content-Type:application/octet-stream");

// 参数头设置完以后需要两个换行,然后才是参数内容

sb.append(newLine);

sb.append(newLine);

// 将参数头的数据写入到输出流中

out.write(sb.toString().getBytes());

// 数据输入流,用于读取文件数据

DataInputStream in = new DataInputStream(new FileInputStream(

file));

byte[] bufferOut = new byte[1024];

int bytes = 0;

// 每次读1KB数据,并且将文件数据写入到输出流中

while ((bytes = in.read(bufferOut)) != -1) {

out.write(bufferOut, 0, bytes);

}

// 最后添加换行

out.write(newLine.getBytes());

in.close();

// 定义最后数据分隔线,即--加上BOUNDARY再加上--。

byte[] end_data = (newLine + boundaryPrefix + BOUNDARY + boundaryPrefix + newLine)

.getBytes();

// 写上结尾标识

out.write(end_data);

out.flush();

out.close();

// 定义BufferedReader输入流来读取URL的响应

// BufferedReader reader = new BufferedReader(new InputStreamReader(

// conn.getInputStream()));

// String line = null;

// while ((line = reader.readLine()) != null) {

// System.out.println(line);

// }

} catch (Exception e) {

System.out.println("发送POST请求出现异常!" + e);

e.printStackTrace();

}

}

java中报文啥时候用呢?一直搞不懂

你可以了解一下http协议

报文就是一组客户端和服务端都认可的信息数据。可以是xml形式,json格式。等等

比如有一个android客户端向服务端发送登陆报文

user

usernamebaidu/username

password123456/password

/user

这段由客户端到服务端的xml,就可以视为一个上行报文

服务端收到报文后会返回登陆成功或者失败的信息

比如:200(成功)

404 (失败)

甚至返回更详细的失败信息等等这个由服务端到客户端的返回信息同样可以是多样性,可视为下行报文

java读写报文的介绍就聊到这里吧,感谢你花时间阅读本站内容,更多关于java报文格式、java读写报文的信息别忘了在本站进行查找喔。