我是一个才学JAVA不久的新手,现在在学做一个类似QQ的聊天程序,遇到个消息发送问题,我在客户端用UDP接收和发送信息,发送消息没问题,可是接收消息时有点问题,就是我在单机上调试,登陆两个号码,当登陆第二个号码是提示。ADDRESS IS USERD,好像是这个,就是说地址在使用中,我想是在创建接收消息数据报时用了同一个端口造成的,我的代码如下://以下创建数据报
        public void CreatUDP()
        {
                 try
                 {
                  sendSocket=new DatagramSocket();
                        receiveSocket=new DatagramSocket(8899);
                        // System.out.println("udp ok");
                 }catch(SocketException se)
                 {
                  se.printStackTrace();
                  System.out.println("false udp");
                 }
        }
        public void run()
        {
         while(true)//无限监听好友消息
         {
         try
         {
         for(int i=0;i<512;i++)
         {
         array1[i]=' ';
         }
         receivePacket=new DatagramPacket(array1,array1.length);
         receiveSocket.receive(receivePacket);
         byte[] data=receivePacket.getData();
         String infofromip=receivePacket.getAddress().getHostAddress().toString().trim();
         received=new String(data,0,data.length);
         received.trim();
         int temp_qqno;
         int temp_int;
         index2=0;
         if(received.substring(0,6).equals("online")) ///如果是通知上线
         {
         temp_qqno=Integer.parseInt(received.substring(6).trim());
         do
         {
         temp_int=Integer.parseInt(f_qqno.get(index2).toString());
         if(temp_qqno==temp_int)
         {
         break;
         }
         index2++;
         }while(index2<f_qqno.size());
         f_userip.setElementAt(infofromip,index2);
         DefaultListModel mm3=(DefaultListModel)list1.getModel();
         int temp_picid=Integer.parseInt(f_userpic.get(index2).toString());
         mm3.setElementAt(new Object[]{f_qqname.get(index2),new ImageIcon(picOnline[temp_picid+1])},index2);
         }
         else if(received.substring(0,7).equals("offline")) ///如果是通知下线
         {
         temp_qqno=Integer.parseInt(received.substring(7).trim());
         do
         {
         temp_int=Integer.parseInt(f_qqno.get(index2).toString());
         if(temp_qqno==temp_int)
         {
         break;
         }
         index2++;
         }while(index2<f_qqno.size());
         infofromip="null";
         f_userip.setElementAt(infofromip,index2);
         DefaultListModel mm3=(DefaultListModel)list1.getModel();
         int temp_picid=Integer.parseInt(f_userpic.get(index2).toString());
         mm3.setElementAt(new Object[]{f_qqname.get(index2),new ImageIcon(picOffline[temp_picid+1])},index2);
         }
         else if(received.substring(0,8).equals("oneaddme")) //如果是有人发消息过来要加我
         {
        
         }
         else //最后就是收到消息
         {
         index4=0;
         do
         {
         String temp_ip=f_userip.get(index4).toString().trim();
         if(infofromip.equals(temp_ip))
         {
         String temp_name=f_qqname.get(index4).toString().trim();
         JOptionPane.showMessageDialog(this,"收到"+temp_name+"的消息","ok",JOptionPane.INFORMATION_MESSAGE);
         fromunknow=false;
         break;
         }
         }while(index4<f_qqname.size());
         if(index4>f_qqname.size())
         {
         JOptionPane.showMessageDialog(this,"收到陌生人的消息","ok",JOptionPane.INFORMATION_MESSAGE);
         fromunknow=true;
         }
         }
         }catch(IOException e4)
         {
         e4.printStackTrace();
         }
                }
        }//发送消息按扭监听
        void send_mouseClicked(MouseEvent e)
        {
         try
         {
         String s_text=send_text.getText();
         if(s_text.length()==0)
                        {
                         JOptionPane.showMessageDialog(this,"消息不能为空","ok",JOptionPane.INFORMATION_MESSAGE);
                        }
                        else
                        {
         byte[] data=s_text.getBytes();
         System.out.println(theip);
         theip.trim();
         if(theip.equals("null")||theip.equals(" ")||theip.equals("0"))
         {
         JOptionPane.showMessageDialog(this,"对不起,对方不在线,现在还不支持离线留言功能","ok",JOptionPane.INFORMATION_MESSAGE);
                        }
                        else
                        {
                         sendPacket=new DatagramPacket(data,s_text.length(),InetAddress.getByName(theip),sendPort);
                         sendSocket.send(sendPacket);
                         senddata.dispose();
                         JOptionPane.showMessageDialog(this,"消息发送成功","ok",JOptionPane.INFORMATION_MESSAGE);
                        
                        }
                        }
         }catch(IOException e2)
         {
         send_text.append(send_text.getText());
         e2.printStackTrace();
         senddata.dispose();
         }
        }高手们,这个问题怎么解决啊 ???

解决方案 »

  1.   

    还有我就是想我问下QQ的发送信息有没有经过UDP服务器啊,是直接发给好友的吗?还是通过UDP服务器中转的啊?
      

  2.   

    在本机调试登陆第二个号码,因为使用的是同一个端口,所以会抛address in used的错误.
    解决的思路是:
    判断当前使用的端口是否已经被占用,如果是,则在错误处理内,给当前的端口号加1.
    类似这样:
        public void init() {
            try {
                server = new ServerSocket(currentPort);
                System.out.println("开始监听,端口号为:" + currentPort);
            } catch (IOException ex) {
                currentPort++;
                if (currentPort <= CommonUtil.MAXPORT) {
                    init();
                } else {
                    System.out.println("无可用端口提供!");
                }
    //            ex.printStackTrace();
            }
        }另,QQ发送信息应该是经过服务器的,使用的是非UDP协议吧.