package UDPChat; import java.io.*; import java.net.*; import java.awt.event.*; import java.awt.*; import javax.swing.*; import org.omg.CORBA.portable.UnknownException; public class UDPChat implements Runnable , ActionListener{ JTextArea showArea; //聊天内容显示文本框 JLabel lbl1,lbl2,lbl3; //接受端口、发送端口、IP的标签 JTextField msgText,sendPortText,receivePortText,IPAddressText; //聊天内容输入框、发送端口输入框、接受端口输入框、IP输入端口输入框 JFrame mainJframe;//创建窗口对象 JButton sendBtn,startBtn;//开始聊天和发送信息按钮 JScrollPane JSPane; JPanel pane1,pane2;//创建面板容器对象 Container con; Thread thread=null; DatagramPacket sendPack,receivePack; //DatagramPacketde的使用方法: //1.创建:public DatagramPacket(byte []buf, int length) //其中,buf存放数据的字节数组,length接收数据的最大长度 //2.发送数据报:public DatagramPacket(byte []buf,int length,InetAddress Address, int port) //buf、length同上,addres、port分别为目的地址和端口号 DatagramSocket sendSocket,receiveSocket; //DatagramSocket的使用方法 //1.创建public DatagramSocket(int port) throws SocketException //其中,port为接受时的端口号 //2.发送数据报:public DatagramSocket()throws SocketException //所有的端口、目的地址和数据,需要由DatagramPacket来指定 //接收数据可以使用Receive(DatagramPack data)方法,得到的数据存放在data //发送数据可以使用send(DatagramPacket data)方法,发送的端口、目的地址和数据都在data中 private InetAddress sendIP;//存储目的的IP地址 private int sendPort,receivePort;//存储发送端口和接受端口 private byte inBuf[],outBuf[];//存放数据流 public static final int BUFSIZE=1024;//(每次)发送和接收数据的最大量 //UDPChat的构造函数 public UDPChat(){ //对界面进行布局 mainJframe = new JFrame("UDPChat");//创建名为UDPChat的窗体 con = mainJframe.getContentPane();//获得JFrame的内容面板 showArea = new JTextArea();//创建文本域组件 showArea.setEditable(false);//控制文本区的内容不可被用户改变 showArea.setLineWrap(true);//换行 lbl1 = new JLabel("Receive Port:");//创建标签 lbl2 = new JLabel("Send Port: "); lbl3 = new JLabel("IPAddress: "); sendPortText = new JTextField();//端口(接受和发送)、IP地址输入框 sendPortText.setColumns(5); receivePortText = new JTextField(); receivePortText.setColumns(5); IPAddressText = new JTextField(); IPAddressText.setColumns(8); startBtn = new JButton("Start");//开始按钮 startBtn.addActionListener(this); pane1 = new JPanel();//创建面板容器 pane1.setLayout(new FlowLayout()); pane1.add(lbl1); pane1.add(receivePortText); pane1.add(lbl2); pane1.add(sendPortText); pane1.add(lbl3); pane1.add(IPAddressText); pane1.add(startBtn); JSPane = new JScrollPane(showArea);//设置聊天文本内容显示框(内容满时)可滑动显示 msgText = new JTextField(); msgText.setColumns(40); msgText.setEditable(false); msgText.addActionListener(this); sendBtn = new JButton("Send"); sendBtn.setEnabled(false); sendBtn.addActionListener(this); pane2 = new JPanel(); pane2.setLayout(new FlowLayout()); pane2.add(msgText); pane2.add(sendBtn); con.add(pane1,BorderLayout.NORTH); con.add(JSPane,BorderLayout.CENTER); con.add(pane2,BorderLayout.SOUTH); mainJframe.setSize(600,400); mainJframe.setVisible(true); mainJframe.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); } @Override public void run() {//在线程中接收数据 // TODO Auto-generated method stub String msgstr; while(true){ try{ receiveSocket.receive(receivePack);//通过DatagramSocket的对象使用Receive方法接收数据 msgstr = new String(receivePack.getData(),0,receivePack.getLength()); showArea.append("the_other_side_Answer : " + msgstr + "/n"); }catch(IOException e){ showArea.append("ERROR/n"); } } } @Override public void actionPerformed(ActionEvent e) {//发送数据 try{ if(e.getSource()==startBtn){//按下开始按钮(即输入的IP,接受和发送端口都正确) inBuf = new byte[BUFSIZE];//创建大小为1024byte的数据存储 sendPort = Integer.parseInt(sendPortText.getText());//获取发送端口号 sendIP=InetAddress.getByName(IPAddressText.getText());//获取目的地址 sendSocket = new DatagramSocket(); receivePort = Integer.parseInt(receivePortText.getText());//获取接受端口号 receivePack = new DatagramPacket(inBuf,BUFSIZE);//创建接收数据包 receiveSocket = new DatagramSocket(receivePort);//指定接收数据的端口号 //创建线程准备接受对方的数据 thread = new Thread(this); thread.setPriority(Thread.MIN_PRIORITY);//设置程序进程执行优先权 thread.start(); startBtn.setEnabled(false); sendBtn.setEnabled(true); msgText.setEditable(true); }else{//按下发送按钮或者Enter键 outBuf = msgText.getText().getBytes(); sendPack = new DatagramPacket(outBuf,outBuf.length,sendIP,sendPort);//组装要发送的数据包 sendSocket.send(sendPack);//发送数据 showArea.append("I_Answer :" + msgText.getText() + "/n"); msgText.setText(null);//清除当前msgText的数据,以免下次发送数据时又将此次数据在发一遍 } }catch(IOException e1){ showArea.append("ERROR/n"); }catch(UnknownException e1){ showArea.append("ERROR/n"); // }catch(SocketException e1){ // showArea.append("ERROR/n"); // } } /** * @param args */ public static void main(String[] args) { // TODO Auto-generated method stub new UDPChat(); } }