续上贴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());
}
}
}
-----------------------------------------------
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());
}
}
}
解决方案 »
- 怎么写一个打印员工信息的方法
- 字符乱码问题,急,在线等!
- http请求的连接中获取OutputStream出现异常,求高手指点!(急)
- 50分现在帮朋友急求一个同步队列的java实现
- Applet显示问题
- 如何对JTextArea中的文本进行行数,列数控制?
- 可以在applet中使用SSLSocket之类的东西?
- 通过ResultSetMetaData可以获取所查询表的字段信息,那有没有什么方法可以获取所查询表的主键呢?
- 如何在这个File类对象对应的文件尾部追加而不会覆盖以前的内容???
- 正则表达式的问题
- 求助:基于JAVA的网络即时通信软件
- 在java中如何实现从一个文本文件中读取浮点数据(多组),并将其依次放入数组中?
(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());
}
}
}
{
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());
}
}
}