用java做一个1对1聊天,我用Frame做,一直抛出个问题
基本是照抄例题的,烦劳各位大虾看看package network;import java.awt.Button;
import java.awt.FlowLayout;
import java.awt.Frame;
import java.awt.TextArea;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.event.WindowAdapter;
import java.awt.event.WindowEvent;
import java.net.DatagramPacket;
import java.net.DatagramSocket;
import java.net.InetAddress;import javax.swing.Box;class Client2 extends Frame implements ActionListener,Runnable{
private TextArea receive;
private TextArea sendtext;
private Button send;

Client2(){
super("网络聊天2");

send=new Button("发送");
receive=new TextArea(8,35);
sendtext=new TextArea(3,20);
receive.setEditable(false);
send.addActionListener(this);

this.setVisible(true);
this.setBounds(100,100,300,260);
this.setResizable(false);
this.setLayout(new FlowLayout());
this.add(getPanel());
this.addWindowListener(new WindowAdapter(){
public void windowClosing(WindowEvent e){
System.exit(0);
}
});

Thread t=new Thread(this);
t.start();
}

private Box getPanel(){
Box b0,b1;
b1=Box.createHorizontalBox();
b1.add(sendtext);
b1.add(Box.createHorizontalStrut(10));
b1.add(send);
b0=Box.createVerticalBox();
b0.add(receive);
b0.add(Box.createVerticalStrut(8));
b0.add(b1);
return b0;
} @Override
public void actionPerformed(ActionEvent e) {
receive.append(sendtext.getText()+"\n");
// TODO Auto-generated method stub
byte buffer[]=sendtext.getText().trim().getBytes();
try{
InetAddress add=InetAddress.getByName("127.0.0.1");
DatagramPacket data=new DatagramPacket(buffer,buffer.length,add,666);///////目标端口号
DatagramSocket mail=new DatagramSocket();
mail.send(data);
}catch(Exception e1){System.out.println("send");}
}

public void run(){
DatagramPacket pack=null;
DatagramSocket mail=null;
byte data[]=new byte[8192];
try{
pack=new DatagramPacket(data,data.length);
mail=new DatagramSocket(888); ////////本地端口号
}catch(Exception e){System.out.println("run1");}
while(true){
if(mail==null) 
break;
else
try{System.out.println("run20");
mail.receive(pack);System.out.println("run21");////就是这一行一直没执行
String msg=new String(pack.getData(),0,pack.getLength());System.out.println("run22");
receive.append(msg);System.out.println("run23");
}catch(Exception e){System.out.println("run2");break;}
}
}
}

解决方案 »

  1.   


       DatagramPacket data=new DatagramPacket(buffer,buffer.length,add,666);///////目标端口号new DatagramSocket(888)// 两个端口应该一样。如:9999
      

  2.   

    这是用一台模拟两个主机,A主机端口号888,B主机端口号666。代码一样,只是端口号相对应而且我也试过,照样是这样try{System.out.println("run20");
                        mail.receive(pack);System.out.println("run21");////就是这一行一直没执行
                        String msg=new String(pack.getData(),0,pack.getLength());System.out.println("run22");
                        receive.append(msg);System.out.println("run23");
                    }catch(Exception e){System.out.println("run2");break;}
      

  3.   

    试试这样import java.awt.Button;
    import java.awt.FlowLayout;
    import java.awt.Frame;
    import java.awt.TextArea;
    import java.awt.event.ActionEvent;
    import java.awt.event.ActionListener;
    import java.awt.event.WindowAdapter;
    import java.awt.event.WindowEvent;
    import java.net.DatagramPacket;
    import java.net.DatagramSocket;
    import java.net.InetAddress;import javax.swing.Box;class Client2 extends Frame implements ActionListener,Runnable{
        private TextArea receive;
        private TextArea sendtext;
        private Button send;
        
        Client2(){
            super("网络聊天2");
            
            send=new Button("发送");
            receive=new TextArea(8,35);
            sendtext=new TextArea(3,20);
            receive.setEditable(false);
            send.addActionListener(this);
            
            this.setVisible(true);
            this.setBounds(100,100,300,260);
            this.setResizable(false);
            this.setLayout(new FlowLayout());
            this.add(getPanel());
            this.addWindowListener(new WindowAdapter(){
                public void windowClosing(WindowEvent e){
                    System.exit(0);
                }
            });
            
            Thread t=new Thread(this);
            t.start();
        }
        
        private Box getPanel(){
            Box b0,b1;
            b1=Box.createHorizontalBox();
            b1.add(sendtext);
            b1.add(Box.createHorizontalStrut(10));
            b1.add(send);
            b0=Box.createVerticalBox();
            b0.add(receive);
            b0.add(Box.createVerticalStrut(8));
            b0.add(b1);
            return b0;
        }    @Override
        public void actionPerformed(ActionEvent e) {
            receive.append(sendtext.getText()+"\n");
            // TODO Auto-generated method stub
            byte buffer[]=sendtext.getText().trim().getBytes();
            try{
                InetAddress add;
    add = InetAddress.getByName("localhost");
                DatagramPacket data=new DatagramPacket(buffer,buffer.length,add,888);///////目标端口号
                DatagramSocket mail=new DatagramSocket();
                mail.send(data);
            }catch(Exception e1){System.out.println("send");}
        }
        
        public void run(){
            DatagramPacket pack=null;
            DatagramSocket mail=null;
            byte data[]=new byte[8192];
            try{
                pack=new DatagramPacket(data,data.length);
                mail=new DatagramSocket(888); ////////本地端口号
            }catch(Exception e){System.out.println("run1");}
            while(true){
                if(mail==null) 
                    break;
                else
                    try{System.out.println("run20");
                        mail.receive(pack);System.out.println("run21");////就是这一行一直没执行
                        String msg=new String(pack.getData(),0,pack.getLength());System.out.println("run22");
                        receive.append(msg);System.out.println("run23");
                    }catch(Exception e){System.out.println("run2");break;}
            }
        }
    }
    public class ChatRoom {
    public static void main(String [] args) {
    Client2 client = new Client2();
    client.run();
    }
    }端口号都要改为888,主机地址用localhost
      

  4.   

    端口号一定要一致。如果端口号不一致了。程序就无法正常的发送到指定的地址了。
    你客户端的IP一定要是服务器的IP。
      

  5.   

    端口号改成一样的也是同样的问题
    mail.receive(pack);System.out.println("run21");////就是这一行一直没执行