Tag: 数据报

Java字节到字符串

所以我想将DatagramPacket的getData()函数返回的字节数组转换为字符串。 我知道将整个字节数组转换为字符串的方法就是: String str = new String(bytes); 但是,这会在最后打印出空字符。 所以如果字节数组是 [114, 101, 113, 117, 101, 115, 116, 0, 0, 0] 0打印出控制台上的空框。 所以我基本上只想打印出来: [114, 101, 113, 117, 101, 115, 116] 所以我做了这个function: public void print(DatagramPacket d) { byte[] data = d.getData(); for(int i=0; i< d.getLength(); i++) { if(data[i] != 0) System.out.println( data[i] ); } } 但不幸的是,这是打印出实际数字而不是字母。 那么如何将每个字节转换为字符串并将其打印出来。 或者,如果有另一种方法来打印字节数组而不是最后的空值那么那也没关系。

打开的sockets和连接的sockets有什么区别?

Java Socket类有两个方法isClosed和isConnected来检查套接字是分别关闭还是连接。 我想知道一个只打开的TCP套接字和一个打开并连接的TCP套接字有什么区别,这与UDP有什么不同。

DatagramSocket.send线程是否安全?

我打算使用DatagramSocket一个实例,并从不同的线程调用它的send方法……将UDP数据包发送到不同的客户端。 方法线程是否安全,即从不同的线程调用此方法不会产生任何麻烦/不一致/竞争条件? 谢谢!

如何在java中通过UDP发送音频流?

我有一个问题,我已将MediaLocator设置为麦克风输入,然后创建了播放器。 我需要从麦克风中获取声音,将其编码为较低质量的流,然后通过UDP将其作为数据报包发送。 这是代码,我在网上找到了大部分代码,并将其改编为我的应用: public class AudioSender extends Thread { private MediaLocator ml = new MediaLocator(“javasound://44100”); private DatagramSocket socket; private boolean transmitting; private Player player; TargetDataLine mic; byte[] buffer; private AudioFormat format; private DatagramSocket datagramSocket(){ try { return new DatagramSocket(); } catch (SocketException ex) { return null; } } private void startMic() { try { format […]

为什么Netty只给我768字节的UDP消息

我已将“receiveBufferSize”选项设置为1024,但由于某种原因,我仍然只在messageReceived中获得768个字节。 数据标题表示正在发送的数据大小为1004。 以下是服务器的初始化代码: public static void main(String[] args) throws Exception { ConnectionlessBootstrap b = new ConnectionlessBootstrap(new NioDatagramChannelFactory()); // Options for a new channel b.setOption(“receiveBufferSize”, 1024); System.out.println(b.getOptions()); b.setPipelineFactory(new ChannelPipelineFactory() { @Override public ChannelPipeline getPipeline() throws Exception { return Channels.pipeline( new MyUDPPacketDecoder(), new StdOutPrintHandler()); } }); b.bind(new InetSocketAddress(myPort)); }

非阻塞UDP I / O与阻止Java中的UDP I / O.

NIO中的非阻塞TCP / IP SocketChannel和Selector帮助我处理许multithreading数量少的TCP / IP连接。 但UDP DatagramChannels怎么样? (我必须承认我对UDP不是很熟悉。) 即使DatagramChannel未在阻塞模式下运行,UDP发送操作似乎也不会阻塞。 是否存在DatagramSocket.send(DatagramPacket)因拥塞或类似情况而阻塞的情况? 如果存在这样的情况以及生产环境中可能出现的情况,我真的很好奇。 如果DatagramSocket.send(DatagramPacket)实际上没有阻塞,并且我不打算使用连接的DatagramSocket并仅绑定到一个端口,那么使用非阻塞模式与DatagramChannel和Selector没有任何优势吗?

UDP数据报中发送的消息未清理?

我的代码如下。 一切都按照我想要的方式工作,但是当收到我的消息时,他们有很多盒子,有点像这样的“消息:你好▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀ ▀▀▀▀▀▀▀“我怎样才能这样做才能收到和打印的只是”消息:你好“? 我非常感谢任何帮助。 import java.io.*; import java.net.*; public class UDPChat { public static void main(String args[]) throws Exception { new UDPChat(); } public UDPChat() { try { runChat(); } catch (Exception e) { }} public void runChat() throws InterruptedException { Sender sender = new Sender(); Receiver receiver = new Receiver(); sender.start(); receiver.start(); sender.join(); receiver.join(); […]

Datagramsocket:接收(…)如何处理数据包的碎片

我从我的教授那里得知,使用UDP套接字发送的数据报包在较低层中被分段,并且可能在接收器端以多个数据包的forms到达。 例如,如果我在数据报包中发送1000字节数据,则在接收端它可能会以2字节,500字节,12字节等forms到达。 因此,他建议多次接收(…)接收发送方发送的整个1000字节的数据包。 后来当我浏览数据报套接字接收(…)的Java文档时,有一行读取如下:“此方法一直阻塞,直到收到数据报。…”是否表示收到整个数据报包当我们使用Java时,不需要进行多次接收(即使理论上是这种情况)? PLS。 澄清。 如果每个数据包的多次接收(…)是解决此问题的唯一选择,请参阅。 提出如何做到这一点的建议。

是否可以在同一端口上仅使用1个UDPSocket进行发送/接收?

我正在尝试发送一个DatagramPacket,然后必须等待来自服务器的Acknowlegment,以便我知道是否必须重新发送相同的数据包或发送下一个数据包。 我在客户端使用相同的套接字,发送数据包并接收确认(ack),在服务器端使用相同的,另一个用于接收数据包的套接字,然后将确认发送给客户.. 第一个问题是客户端正在发送数据包,服务器正在接收它,然后将确认发送到客户端,但客户端在接收确认数据包时阻塞。 我正在制作一些System.out.println以确定问题所在,但我无法找到解决此问题的方法。 第二个问题是服务器仍然总是接收数据,并且不要等待客户端发送内容,我检查了因为我得到了那些行(例如“得到长度为xxx的数据包”“ack与ackNr yyy一起发送”… “虽然客户端在发送第一个数据包后仍在阻塞,但始终打印在服务器端,因为它正在等待未收到的确认! 这是CLIENT的代码: package blatt7; import java.io.File; import java.io.FileInputStream; import java.io.FileNotFoundException; import java.io.IOException; import java.net.DatagramPacket; import java.net.DatagramSocket; import java.net.InetAddress; import java.net.SocketTimeoutException; import java.net.UnknownHostException; import java.nio.ByteBuffer; import java.util.zip.CRC32; public class FileSender { String zielRechner; String filePath; InetAddress host; File file; FileInputStream fis; int readLength; int sequenceNr = 0; int receivedSeqNr = […]

如何摆脱剩余的缓冲区?

我有一个服务器客户端应用程序,它使用数据报套接字来交换消息。 我最初将缓冲区大小设置为1024字节,因为我不知道消息的长度。 当我发送短于1024字节的内容时,我将其余的字符串显示为一些奇怪的字符(空字符或我不确定它们是如何被调用的)。 这是一个屏幕: 客户端代码: byte[] buf = (“This is another packet.\n”).getBytes(); DatagramPacket packet = new DatagramPacket(buf, buf.length, inetAddress, serverport); socket.send(packet) byte[] buf = (“This is another packet.\n”).getBytes(); DatagramPacket packet = new DatagramPacket(buf, buf.length, inetAddress, serverport); socket.send(packet) 服务器代码: byte[] buf = new byte[1024]; DatagramPacket packet = new DatagramPacket(buf, buf.length); socket.receive(packet); byte[] buf = new byte[1024]; […]