社区首页 >问答首页 >UDP数据包:如何在一个数据包中发送不同的数据类型?

UDP数据包:如何在一个数据包中发送不同的数据类型?
EN

Stack Overflow用户
提问于 2017-01-14 00:34:38
回答 2查看 246关注 0票数 0

我正在编写一个多人游戏,我有一个udp数据包的大小的困难时期。我想通过udp数据包发送多个敌人的统计信息(hp,position,id)。以下是重要的代码部分:

代码语言:javascript
代码运行次数:0
复制
Byte[] datagramPacketData = ("11" + String.valueOf(entityAmount) + "," + gamename + "," + username + entitiesToBeSent).getBytes();

如您所见,我将所有数据合并到一个字符串中,然后在发送之前将其转换为byte[]。但是,与小int( id和position)和long(Hp)相比,chars消耗更多的字节。例如:一个暴徒有2.000.000马力。这个数字将占用7个字符(=7个字节),但它只需要4个字节。如何在不使用对象流的情况下,使用更少的字节来发送所有这些数据?

如果有一些建议,我会很高兴的!非常提前感谢您。

EN

回答 2

Stack Overflow用户

发布于 2017-01-14 00:50:57

首先,如果您的数据足够小,可以放入一个数据包中,那么UDP消息长度不太可能产生太大的差异。我建议你不要在这个问题上出汗,除非你有确凿的证据证明数据包大小是一个关键问题;即,硬基准测试结果表明,你将无法维持游戏所需的最低传输速率超过一定的数据包大小。(针对实际不存在的问题进行优化是浪费精力。)

如果你关心消息长度,那么你应该使用字符串编码(如上所述)和二进制编码进行比较;例如,就像使用DataInputStreamDataOutputStream一样。

  • a byte将编码为单个八位字节
  • a short or char将编码为两个八位字节

有关详细信息,请参阅DataOutputStream javadocs

不要使用对象流。它们使用与DataOutputStream相同的二进制编码,但编码类型信息和对象标识的额外开销很大。

票数 0
EN

Stack Overflow用户

发布于 2017-01-14 01:40:05

我现在已经尝试过了,它对String有效,但不是long或long。我自己找不出这个错误,你们谁能找出错误吗?这就是它:

在发送方:

代码语言:javascript
代码运行次数:0
复制
byte[] data = new byte[1024];
        int i = 0;

        String packetNumber = "25";

        ByteBuffer buffer0 = ByteBuffer.allocate(2);
        buffer0.put(packetNumber.getBytes());
        byte[] numberInByte = buffer0.array();

        int x = 0;
        for (int k = i; k < numberInByte.length; k++) {
            data[k] = numberInByte[x];
            x++;
            i++;
        }

        long life = 2000000;

        ByteBuffer buffer = ByteBuffer.allocate(Long.BYTES);
        buffer.putLong(life);
        byte[] lifeInByte = buffer.array();

        x = 0;
        for (int k = i; k < lifeInByte.length; k++) {
            data[k] = lifeInByte[x];
            x++;
            i++;
        }

在接收方:

代码语言:javascript
代码运行次数:0
复制
ByteBuffer byteBuffer = ByteBuffer.wrap(data);

        byte[] packetNumber = new byte[2];
        byteBuffer.get(packetNumber);
        System.out.println(new String(packetNumber));

        long life = byteBuffer.getLong();
        System.out.println(life);

输出是: 25 (这是正确的) 1966080 (不完全是2000000,但为什么呢?)

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/41645508

复制
相关文章
Linux内核网络udp数据包发送(一)
本文首先从宏观上概述了数据包发送的流程,接着分析了协议层注册进内核以及被socket的过程,最后介绍了通过 socket 发送网络数据的过程。
Linux阅码场
2021/08/26
4.3K0
Linux内核网络udp数据包发送(二)——UDP协议层分析
本文分享了Linux内核网络数据包发送在UDP协议层的处理,主要分析了udp_sendmsg和udp_send_skb函数,并分享了UDP层的数据统计和监控以及socket发送队列大小的调优。
Linux阅码场
2021/08/26
6K0
python伪造udp数据包
#!/usr/bin/python #coding:utf-8 import socket import struct from random import randint def checksum(data): s = 0 n = len(data) % 2 for i in range(0, len(data) - n, 2): s += ord(data[i]) + (ord(data[i + 1]) << 8) if n: s +
py3study
2020/01/10
2.1K0
【Java 网络编程】UDP 服务器 客户端 通信 ( DatagramSocket | DatagramPacket | UDP 发送数据包 | UDP 接收数据包 | 端口号分配使用机制 )
2. UDP 发送和接收 : 计算机 A 向 计算机 B 的 X 端口发送消息 , B 不一定能接收到 , B 能收到并处理该消息的前提是 , B 当前正在监听 X 端口 ;
韩曙亮
2023/03/27
7K0
【Java 网络编程】UDP 服务器 客户端 通信 ( DatagramSocket  | DatagramPacket | UDP 发送数据包 | UDP 接收数据包 | 端口号分配使用机制 )
【Java 网络编程】UDP 服务器 客户端 通信 ( DatagramSocket | DatagramPacket | UDP 发送数据包 | UDP 接收数据包 | 端口号分配使用机制 )[通俗
2. UDP 发送和接收 : 计算机 A 向 计算机 B 的 X 端口发送消息 , B 不一定能接收到 , B 能收到并处理该消息的前提是 , B 当前正在监听 X 端口 ;
全栈程序员站长
2022/08/31
6.5K0
【Java 网络编程】UDP 服务器 客户端 通信 ( DatagramSocket | DatagramPacket | UDP 发送数据包 | UDP 接收数据包 | 端口号分配使用机制 )[通俗
Linux内核网络UDP数据包发送(四)——Linux netdevice 子系统
在继续分析 dev_queue_xmit 发送数据包之前,我们需要了解以下重要概念。
Linux阅码场
2021/08/26
3.6K0
Linux内核网络UDP数据包发送(三)——IP协议层分析
Linux内核网络 UDP 协议层通过调用 ip_send_skb 将 skb 交给 IP 协议层,本文通过分析内核 IP 协议层的关键函数来分享内核数据包发送在 IP 协议层的处理,并分享了监控IP层的方法。
Linux阅码场
2021/08/26
3.3K0
数据包发送与嗅探
实验过程中采用过libnet与libpcap,最后全部转为Raw Socket发送与嗅探。
公众号guangcity
2019/09/20
2.6K0
数据包发送与嗅探
iOS App的tcp、udp数据包抓取与分析
在对app进行安全分析时,有时需要检查app的网络接口请求是否安全,网络协议交互是否可被恶意利用。因此就需要运行app并捕获其与服务端交互的网络数据进行分析。前面文章已介绍过http、https数据包的捕获,该篇文章主要介绍捕获app的tcp、udp流量数据。我们将使用tcpdump捕获tcp、udp流量,再通过wireshark过滤、分析app的tcp、udp流量。
用户4682003
2022/05/19
2.8K0
iOS App的tcp、udp数据包抓取与分析
Socket网络通信之发送数据包
鉴于我被那些吹牛皮的浪费一下午的时间的惨痛经历,我就明说了,我这篇是基于结构体形式的、客户端请求服务器的、服务器接收并发送应答包的,一篇博客。 如果不是你所需要的,可以换别篇了。
看、未来
2020/08/26
1.6K0
Windows下底层数据包发送实战
  所谓“底层数据包”指的是在“运行”于数据链路层的数据包,简单的说就是“以太网帧”,而我们常用的Socket只能发送“运行”在传输层的TCP、UDP等包,这些传输层数据包已经能满足绝大部分需求,但是有些时候还是需要发送底层数据包的(例如SYN扫描),那么如何发送呢?
战神伽罗
2019/07/24
3.2K0
Windows下底层数据包发送实战
ping 命令 指定特定网卡 发送 ICMP 数据包
-I interface interface is either an address, or an interface name. If interface is an address, it sets source address to specified interface address. If interface in an interface name, it sets source interface to specified interface. For IPv6, when doing ping to a link-local scope address, link specification (by the '%'-notation in destination, or by this option) is required.
西湖醋鱼
2020/12/30
2.6K0
ping 命令 指定特定网卡 发送 ICMP 数据包
详解TCP数据包中SYN,ACK字段与数据发送的关联
在TCP协议中,为了确保数据能稳定发送,协议使用数据包中的syn,ack两个字段来监控数据是否正确发生和接收,本节我们看看这两个字段如何保证数据的平稳传输。
望月从良
2019/09/27
2.5K0
详解TCP数据包中SYN,ACK字段与数据发送的关联
教你动手写UDP协议栈-DHCP数据包解析<2>
DHCP报文属于UDP报文,DHCP协议包含在UDP协议栈的用户数据部分。如下图红框部分:
Rice加饭
2022/05/10
1K1
教你动手写UDP协议栈-DHCP数据包解析<2>
ICMP数据包分析_Wireshark数据包分析实战
1.学习和掌握ICMP协议的基本作用和报文格式 2.理解ICMP协议与IP协议的封装关系 3.学习和掌握ICMP协议的应用和报文格式 4.理解tracertoute工作过程
全栈程序员站长
2022/11/01
1.3K0
数据包扩展
request请求数据包格式 1、请求头:请求类型/请求资源路径、协议的版本和类型 2、请求头:一些键值对,浏览器与web服务器之间都可以发送,特定的某种含义 3、空行:请求头与请求体之间用一个空行隔开 4、请求体:要发送的数据(一般post提交会使用)
用户2616264
2023/05/18
5850
数据包扩展
一个HTTP数据包的奇幻之旅
“还能去哪里,你是一个数据包,当然要出远门,完成你的使命啊,别啰嗦,我要先把你复制到内核空间,一会要发出去,让我来看下你的内容”。
lucifer210
2020/02/26
4150
我是一个Dubbo数据包...
今天给大家带来一篇关于Dubbo IO交互的文章,本文是一位同事写的文章,用有趣的文字把枯燥的知识点写出来,通俗易懂,非常有意思,所以迫不及待找作者授权然后分享给大家:
龟仙老人
2022/06/08
3030
Linux BSP实战课(网络篇):数据包的发送过程
本文将介绍在Linux系统中,以一个UDP包的接收过程作为示例,介绍数据包是如何一步一步从应用程序到网卡并最终发送出去的。
刘盼
2023/09/20
5780
Linux BSP实战课(网络篇):数据包的发送过程
一个DNS数据包的惊险之旅
“小子,快去查一下www.paypal.com的IP地址,我急用,晚了我弄你!”,暴躁老哥一把关上了门,留我一个DNS数据包在冷冰冰的房间。
轩辕之风
2020/03/11
8210

相似问题

udp发送数据包传真

13

Python发送UDP数据包

57

丢失UDP发送数据包

17

到达的UDP数据包不同于已发送的数据包

10

通过udp发送数据包

26
添加站长 进交流群

领取专属 10元无门槛券

AI混元助手 在线答疑

扫码加入开发者社群
关注 腾讯云开发者公众号

洞察 腾讯核心技术

剖析业界实践案例

扫码关注腾讯云开发者公众号
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档