`
cuizhenfu#gmail.com
  • 浏览: 67502 次
  • 性别: Icon_minigender_1
  • 来自: 北京
文章分类
社区版块
存档分类
最新评论

JxtaMulticastSocket接收数据不要循环使用buffer

阅读更多
注意第一行和第二行,每次for循环,都使用同一个buffer,这样当接收数据时,会抛出异常。可以将buffer的声明放在for循环的里面。另外注意在开发的时候,最好将所有异常的堆栈打出,这样便于及早发现问题。
java 代码
 
  1. public void run() { 
  2.     byte[] buffer = new byte[16384];  
  3.     DatagramPacket packet = new DatagramPacket(buffer, buffer.length); 
  4.     try {  
  5.         for (;;) {  
  6.               
  7.             // pool正在关闭(shutdown)时不在接收数据  
  8.             if(!pool.isShutdown() && !pool.isTerminated()) {  
  9.                 mcastSocket.receive(packet);  
  10.                 pool.execute(new Handler(packet));  
  11.             } else {  
  12.                 LOG.info("JxtaMulticastSocketService is now shutdown.");  
  13.             }  
  14.                   
  15.         }  
  16.     } catch (IOException ex) {  
  17.         ex.printStackTrace();  
  18.         pool.shutdown();  
  19.     }  
  20. }  
java 代码
 
  1. java.io.IOException: Datagram can not accomodate message of size :247  
  2.     at net.jxta.socket.JxtaMulticastSocket.receive(JxtaMulticastSocket.java:432)  
  3.     at jxtamessenger.background.JxtaMulticastSocketService.run(JxtaMulticastSocketService.java:85)  
  4.     at java.util.concurrent.ThreadPoolExecutor$Worker.runTask(ThreadPoolExecutor.java:885)  
  5.     at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:907)  
  6.     at java.lang.Thread.run(Thread.java:619)  
分享到:
评论

相关推荐

    关于recv函数在不知道接收数据大小时如何申请buffer

    ### 关于recv函数在不知道接收数据大小时如何申请buffer #### 概述 在进行网络编程时,我们经常需要处理不确定长度的数据包。在这种情况下,如何合理地为接收到的数据分配内存空间,就成为了实现可靠通信的关键...

    c语言实现循环buffer

    循环缓冲区(Circular Buffer)是一种在计算机编程中广泛使用的数据结构,特别是在处理实时系统和多线程通信中。它是一个固定大小的内存区域,当...理解并正确使用循环缓冲区,对于提升软件性能和稳定性具有重要意义。

    多线程读写问题循环buffer

    本示例中的“多线程读写问题循环buffer”着重探讨了如何在多个线程之间安全地共享一个循环缓冲区,以实现高效的数据交换。 首先,我们需要理解“循环buffer”的概念。循环缓冲区是一种内存管理策略,它利用数组或...

    循环buffer

    循环缓冲区(Ring Buffer或Circular Buffer)是一种在内存中实现的数据结构,用于高效地存储和检索数据,尤其在处理实时数据流或者需要并发读写的场景中。它利用数组或链表的一环形特性,使得数据的插入和删除操作...

    c++接收本机UDP数据

    在C++中,接收本机UDP(用户数据报协议)数据涉及网络编程的基本概念和库的使用。UDP是一种无连接的、不可靠的传输层协议,适用于需要快速传输且对数据完整性要求不高的应用场景。本篇文章将深入探讨如何在C++环境中...

    22. USART_CircleBuffer 串口接收环形缓冲区

    本文将深入探讨如何使用环形缓冲区(Circle Buffer)技术优化STM32的串口接收功能。 串口通信,全称通用异步收发传输器(Universal Asynchronous Receiver/Transmitter,UART),是一种简单但实用的串行通信协议,...

    STC单片机串口中断接收不定长数据

    以上代码中,`UART_Init()` 初始化串口并开启中断,`UART_IntrHandler()` 是中断服务函数,用于接收数据并处理,而 `main()` 函数中的主循环则等待中断的发生,处理其他非中断任务。 5. **注意事项** - 为防止堆栈...

    不知道recv大小时如何设置buffer大小接收图像

    关于recv函数buffer大小的设置,当不知道数据长度时如何设置buffer长度,以及buffer长度对实际接收长度的影响。

    C#服务器接收数据程序

    本主题聚焦于"C#服务器接收数据程序",这通常涉及到网络编程、数据处理和存储等多个方面。以下是对这个主题的详细阐述: 一、C#网络编程基础 C#中的网络编程主要依赖于.NET Framework或.NET Core提供的System.Net...

    RingBuffer 循环缓存 亲测可用 V2 修改一处

    4.当写入数据的长度大于ringbuffer的可写入长度时,多余的数据将会丢弃。所以写入数据前,先判断ringbuffer的可写入长度。另外程序包含示例。 支持windows平台的vs与linux平台的clion,语言级别实现,与平台无关。 ...

    这是 FPGA 中使用的循环缓冲控制器 Verilog Hardware Circular Buffer Controller

    根据wiki:循环缓冲区、循环队列、循环缓冲区或环形缓冲区是一种使用单个固定大小缓冲区的数据结构,就好像它是端到端连接的一样。这种结构很容易缓冲数据流。 68747470733a2f2f75706c6f61642e77696b696d656469612...

    Rt-thead studio软件下使用ringbuffer

    在RT-Thread Studio中,ringbuffer(循环缓冲区)是一种重要的数据结构,常用于实现高效的数据传输和存储。本文将深入探讨在RT-Thread Studio中如何使用ringbuffer,并分享相关的编程技巧和注意事项。 1. **什么是...

    buffer应用缓冲区

    接收数据时,Socket将接收到的数据存入Buffer,供应用程序读取。 具体来说,当一个Socket接收到数据时,操作系统会将其放入内核缓冲区,待应用程序准备就绪时,再从内核缓冲区读取到应用缓冲区。这样可以避免频繁的...

    MFC串口接收数据并实时显示

    在本文中,我们将深入探讨如何使用Microsoft Foundation Class (MFC) 库来实现串口通信,从而接收数据并实时显示波形。MFC 是一个 C++ 类库,它为 Windows API 提供了一种面向对象的封装,使得开发 Windows 应用程序...

    MFC实现串口数据的发送与接收

    接收数据通常需要配合消息循环,因为串口数据通常是异步到达的。可以注册一个消息映射函数,当有数据到达时,MFC会自动调用这个函数。使用`Read()`函数读取接收到的数据。例如: ```cpp void CMyClass::OnReceive...

    17串口接收试验_51单片机串口接收数据实验_

    在中断处理程序中,首先需要清零RI标志位,然后从SBUF(Serial Buffer,串口缓冲区)读取接收到的数据,并进行相应的处理。需要注意的是,由于串口接收是逐字节进行的,因此需要一个循环结构或者队列来保存接收到的...

    变长数据接收

    - **接收数据**:调用`recv`函数从套接字接收数据。由于数据长度可能不确定,`recv`函数允许我们指定缓冲区的大小,并返回实际接收到的字节数。如果一次无法接收完整个数据包,我们需要循环调用`recv`,直到接收到...

    定长数据接收

    3. **接收数据**:使用`recv`函数接收数据。由于我们处理的是定长数据,可以预先设定好接收缓冲区的大小,等于每个数据包的预期长度。例如,如果每个数据包是100字节,我们可以声明一个100字节的缓冲区,然后调用`...

    C#使用UDP协议socket编程收发数据

    总结来说,C#中使用UDP协议进行socket编程涉及到创建和操作Socket对象,设置目标地址,发送和接收数据。为了优化性能和稳定性,可以考虑使用像SharpSocket这样的第三方库,它们通常提供了更高级别的抽象和对高效I/O...

    C# 使用Tcp发送大量数据

    // 循环接收数据 int bytesRead; while ((bytesRead = stream.Read(buffer, 0, buffer.Length)) > 0) { receivedData.Add(new byte[bytesRead]); Array.Copy(buffer, 0, receivedData[^1], 0, bytesRead); } // ...

Global site tag (gtag.js) - Google Analytics