日期:2014-05-20  浏览次数:20725 次

java聊天程序中的问题
我写了一个局域网的java聊天程序,有点类似飞秋。在程序中定义了一些端口如"3333"是用来监听好友上线消息更新好友列表用的,"2121"是用来接收好友聊天消息的,还有其他的一些端口。问题是 当双方都上线后端口3333能监测到对方并添加对方为好友,可是2121怎么都监听不到对方发来的聊天消息。当时我用了另外一种监听方法,就是只用3333端口监听各种消息,只是消息的头不一样如:好友上线发送的更新好友列表的包头有个“fri”标志,聊天消息的头部有个“news”标志当接受消息的一方在端口3333收到数据包后就先判断包头的标志如果是“fri”就执行好友添加动作,如果是“news”就弹出聊天对话框执行聊天操作,可这样好像也不行一旦执行了好友添加操作后好像就不会再执行聊天操作就好像3333端口被堵塞了。而当我把这些消息的接收都分开了用不同的端口的时候还是只能执行好友添加的功能,不知道是什么原因这部分(包括第一种方法和第二种方法)的代码如下:
主窗体中的线程run()方法用来监听各个端口的消息
public void run(){
DatagramPacket pack=null;
DatagramPacket pack1=null;
DatagramSocket mail_data=null;
DatagramSocket mail_data1=null;
byte[] data=new byte[8192];
byte[] data1=new byte[8192];
DatagramPacket pack2=null;
DatagramSocket mail_data2=null;
byte[] data2=new byte[8192];
DatagramPacket pack3=null;
DatagramSocket mail_data3=null;
byte[] data3=new byte[8192];
int h=0,z=0,m=0,i=0;
String[] news=new String[4];
try{
pack=new DatagramPacket(data,data.length);
mail_data=new DatagramSocket(3333);//接收视频聊天室搜寻好友上线包监听端口
pack1=new DatagramPacket(data1, data1.length);
mail_data1=new DatagramSocket(8889);//好友上线回传监听端口
pack2=new DatagramPacket(data2, data2.length);
mail_data2=new DatagramSocket(4848);//邀请好友监听端口
pack3=new DatagramPacket(data3, data3.length);
mail_data3=new DatagramSocket(2121);//收到好友消息后弹出对话框

}
catch(Exception e){

}
while(true){
if(mail_data==null&&mail_data1==null&&mail_data2==null&&mail_data3==null) break;
else{
if(mail_data!=null){
try{
mail_data.receive(pack);
int length=pack.getLength();  
String homeName=new String(pack.getData(),0,length);
StringTokenizer fenxi=new StringTokenizer(homeName, "//");
while(fenxi.hasMoreTokens()){
home[h]=fenxi.nextToken(); h++;
//home[1]房间号,home[0]房间名
}
if(home[0].equals("fri")){//好友上线添加
}
else if(home[0].equals("yaoqin")){//好友邀请

  }

else if(home[0].equals("news")){//好友聊天消息
 
  }

}//end try
  catch(Exception e){}
 
 
}//end if
//从这里开始就是另外一种端口监听方法(一个端口监听一种消息)----------------------------------------------------
else if(mail_data1!=null){//好友上线添加
try{
  }
catch(Exception e){

}

}
else if(mail_data2!=null){//好友邀请
try{
}
catch(Exception e){

}

}
else if(mail_data3!=null){//好友聊天消息 try{
}
catch(Exception e){

}

}

}//end 最外层else

}


}

然后在聊天的发送按钮事件为:
try{
//byte[] buffer=("news"+"//"+inputText_area.getText()+"//"+InetAddress.getLocalHost().getHostName()).getBytes();
byte[] buffer=(inputText_area.getText()+"//"+InetAddress.getLocalHost().getHostName()).getBytes();
InetAddress address=InetAddress.getByName(FeiM_Frame.friIp);
DatagramPacket pack=new DatagramPacket(buffer, buffer.length, address, 2121);
//DatagramPacket pack=new DatagramPacket(buffer, buffer.length, address, 3333);
DatagramSocket mail_data=new DatagramSocket();
mail_data.send(pack);