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)  
在C语言中,实现TCP客户端的无限循环接收数据通常涉及到`recv()`函数,该函数从套接字接收数据。以下是一个简单的例子: ```c #include <stdio.h> #include <stdlib.h> #include <string.h> #include <sys/socket.h> #include <netinet/in.h> #define PORT 8080 // 确保服务端使用的端口一致 #define BUFFER_SIZE 1024 int main() { int client_socket = socket(AF_INET, SOCK_STREAM, 0); // 创建一个新的TCP套接字 struct sockaddr_in server_addr; memset(&server_addr, 0, sizeof(server_addr)); server_addr.sin_family = AF_INET; server_addr.sin_port = htons(PORT); inet_pton(AF_INET, "127.0.0.1", &server_addr.sin_addr); // 假设服务器在同一台机器上 connect(client_socket, (struct sockaddr*)&server_addr, sizeof(server_addr)); // 连接到服务器 printf("Connected to the server.\n"); while (true) { // 循环接收数据 char buffer[BUFFER_SIZE]; size_t bytes_received = recv(client_socket, buffer, BUFFER_SIZE - 1, 0); // 接收数据并避免缓冲区溢出 if (bytes_received > 0) { buffer[bytes_received] = '\0'; // 添加终止符 printf("Received data: %s\n", buffer); } else if (bytes_received == 0) { printf("Server closed the connection.\n"); break; // 服务器关闭连接,退出循环 } else if (errno == EAGAIN || errno == EWOULDBLOCK) { continue; // 如果暂时无数据可用,继续尝试接收 } else { perror("Error receiving data:"); break; // 其他错误,如网络中断,停止接收 } } close(client_socket); // 关闭套接字 return 0; } ``` 这个程序会不断尝试从服务器接收数据,直到服务器主动断开连接或者遇到其他网络错误。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值