问题是这样的:我要用DatagramSocket来监听154端口接收其他设备发过来的日志并写到数据库,测试的时候接收的数据和数据库里面的数量能一致,但是接收有问题,在本机模拟的时候是这样的public class SendMessage implements Runnable {
private static SimpleDateFormat sdft = new SimpleDateFormat(
"MMM dd HH:mm:ss yyyy", Locale.ENGLISH);
public static void main(String[] args) { System.out.println(sdft.format(new Date()));
for (int i = 0; i < 100; i++) {
new Thread(new SendMessage()).start();
}
} @Override
public void run() {
try {
DatagramSocket socket = new DatagramSocket();
int i = 0;
while (i < 400000) {
String buff = "<189>"+sdft.format(new Date())+" ZJHZ_MS_WLAN_H3CBAS1-01_ST %%10DHCPSD/5/DHCPS_ALLOCATE_IP(l): -DEV_TYPE=SECPATH-PN=210231A0DGB116000046; DHCP server information: Server IP = 10.173.0.2, DHCP client IP = 10.173.12.186, DHCP client hardware address = 94db-c906-9133, DHCP client lease = 3600.";
DatagramPacket packet = new DatagramPacket(buff.getBytes(), buff.getBytes().length,
InetAddress.getByName("127.0.0.1"), 514);
socket.send(packet);
i++;
try {
Thread.sleep(20);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
} catch (SocketException e) {[code=java]
e.printStackTrace();
} catch (UnknownHostException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
} }}
[/code]
100个线程发,每个线程发40W,这里是总共发4000W.
结果发现丢失了1000多万,按照道理在本机上接收到话应该不会丢失的吧?
各位大侠找下原因啊。

解决方案 »

  1.   

    UDP不可靠,你可以用TCP socket接收试试,是否有丢失。
      

  2.   

    如1楼所说,UDP非可靠传输。所以即便是本机,只要缓冲区满了,接收端稍微接收不及时,数据包立即被丢弃。你还搞100个线程狂发,大批量丢失很正常。
      

  3.   

    每天数据量上亿啊,数据也比较小,就是接收日志,用TCP不合适吧?
      

  4.   


    用TCP为啥不合适啊?你只要长期保持这个连接而不是每次重建就行了,然后用NIO机制,不要阻塞发送过程。实际上对性能要求高的、发送量大的,基本都用TCP长连接。
      

  5.   

    要发送文件的最好用TCP,UDP接收文件这个得自己校验是否丢包,这样做相当于又实现了TCP。
      

  6.   

    楼主这个完全可以用TCP,把你这台接收日志的当做Server端,其它的设备都是Client端,往这个Server端发送文件.用NIO非阻塞的就可以了