续上贴http://community.csdn.net/Expert/topic/5399/5399597.xml?temp=.2045557
-----------------------------------------------
public class rcvUdpData
{
public static Vector bufsVec=new Vector();

public static void main(String[] args)
{
rcvUdpClient rcvUC;
if(args.length>0)
{
int iPort;
try
{
iPort=Integer.parseInt(args[0]);
rcvUC=new rcvUdpClient(iPort);
    rcvUC.start();
}
catch(NumberFormatException ne)
{
System.out.println("端口参数不正确!");
}
catch(Exception e)
{
System.out.println(e.toString());
}
}
else
{
rcvUC=new rcvUdpClient();
rcvUC.start();
}
dealWithData dwData=new dealWithData();
dwData.start();
}
}class rcvUdpClient extends Thread
{
private DatagramSocket udpSocket=null;
private DatagramPacket udpPacket=null;
private int port=9999;
private byte[] recbuf=new byte[1500];
long totalNum=0;

rcvUdpClient()
{
rcvUdpInit();
}
rcvUdpClient(int iPort)
{
port=iPort;
rcvUdpInit();
}
private void rcvUdpInit()
{
try
{
udpSocket=new DatagramSocket(port);
udpPacket=new DatagramPacket(recbuf,recbuf.length);
}
catch(IOException e)
{
System.out.println(e.toString());
}
}
public void run() //receiveData
{
System.out.println("开始监听"+port+"端口...");
while(true)
{
try
{
udpSocket.receive(udpPacket);
//byte[] databuf=udpPacket.getData();
writeToBufs(udpPacket.getData());
System.out.println(++totalNum);
}
catch(IOException e)
{
System.out.println(e.toString());
}
}
}
public void writeToBufs(byte[] buf)
{
rcvUdpData.bufsVec.add(buf);
}
}class dealWithData extends Thread
{
public void run()
{
System.out.println("准备处理数据...");
while(true)
{
if(rcvUdpData.bufsVec.isEmpty())
{
continue;
}
new dataWriteThread((byte[])rcvUdpData.bufsVec.remove(0)).start();
}
}
}class dataWriteThread extends Thread
{
private byte[] databuf;

dataWriteThread(byte[] buf)
{
databuf=buf;
}
public void run()
{
netFlowInfo nfInfo=new netFlowInfo(databuf);
try
{
                            //...
System.out.println("write ok");
}
catch(Exception e)
{
System.out.println(e.toString());
}
}
}

解决方案 »

  1.   

    非常感谢!!
    (1)"udp本身就又一定的丢包率"
    ----不是针对udp本身的丢包,而是比较发送到客户端的包数量A(防火墙记录)和接收程序获取到的包数量B.如果不开处理数据线程,A==B;如果开启处理数据线程A>B,大概是80%-90%.所以我想,是不是处理线程的影响?
    (2)"按你得程序,处理线程完全不需要,收到数据,然后直接开一个dataWriteThread 写硬盘就可以了"
    ----是不是这个意思?
    ....
    public void run() //receiveData
    {
    System.out.println("开始监听"+port+"端口...");
    while(true)
    {
    try
    {
    udpSocket.receive(udpPacket);
    System.out.println(++totalNum);
                                        new dataWriteThread((byte[])rcvUdpData.bufsVec.remove(0)).start();//这里直接处理??
    }
    catch(IOException e)
    {
    System.out.println(e.toString());
    }
    }
    }
      

  2.   

    public void run() //receiveData
    {
    System.out.println("开始监听"+port+"端口...");
    while(true)
    {
    try
    {
    udpSocket.receive(udpPacket);
    System.out.println(++totalNum);
                                        new dataWriteThread(udpPacket).start();//这里直接处理
    }
    catch(IOException e)
    {
    System.out.println(e.toString());
    }
    }
    }