在网上看到 好多UDP的聊天程序,都没有注释所以…… 我只是在写这个程序的时候把我遇到的问题加上了注释。
package hr.csdn.com;
import java.awt.BorderLayout;
import java.awt.Color;
import java.awt.FlowLayout;
import java.awt.GridLayout;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.io.IOException;
import java.net.DatagramPacket;
import java.net.DatagramSocket;
import java.net.InetAddress;
import java.net.SocketException;
import java.net.UnknownHostException;
import java.util.jar.JarFile;
import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JList;
import javax.swing.JPanel;
import javax.swing.JTextArea;
import javax.swing.JTextField;
public class ChartTest extends JFrame implements ActionListener {
/**
* @param args
*
*/
JPanel panel1,panel2;
JTextField text1,text2,text3;
JTextArea ta;
JButton btn;
JList l;
public ChartTest(){
super();
this.setBounds(200,200,400,400);//设置窗体的坐标和大小
panel1=new JPanel();
ta=new JTextArea(15,15);
text1=new JTextField(15);
text3=new JTextField(15);
text2=new JTextField(15);
btn=new JButton("发送");
btn.addActionListener(this);//给BUTTON设置监听器
panel1.setLayout(new BorderLayout());
panel1.add(text3,"North");
panel1.add(ta,"Center");
panel2=new JPanel();
panel2.setLayout(new GridLayout(1,2));
panel2.add(text1);
panel2.add(text2);
panel2.add(btn);
this.setLayout(new BorderLayout());
this.add(panel1,"North");
this.add(panel2,"South");
this.setVisible(true);
}
public static void main(String[] args) {
// TODO Auto-generated method stub
//ChartTest ch=new ChartTest();
try {
DatagramSocket rece=new DatagramSocket();//因为是UDP通信,所以开启程序的时候必须先启动 接收端,开启这个线程
ChatRe c=new ChatRe(rece);
new Thread(c).start();
} catch (SocketException e1) {
// TODO Auto-generated catch block
e1.printStackTrace();
}
}
@Override
public void actionPerformed(ActionEvent e) {//这是BUTTON按钮的监听器,当你点击这个按钮的时候,发送消息
// TODO Auto-generated method stub
DatagramSocket ds;//创建一个DatagramSocket对象
try {
ds = new DatagramSocket();
String str=this.text2.getText();
try {
DatagramPacket dp=new DatagramPacket(str.getBytes(),str.getBytes().length,InetAddress.getByName("127.0.0.1"),50000);
ds.send(dp);
ds.close();
} catch (Exception e1) {
// TODO Auto-generated catch block
e1.printStackTrace();
}
} catch (SocketException e1) {
// TODO Auto-generated catch block
e1.printStackTrace();
}
}
}
class ChatRe implements Runnable{//单独开启一个线程 用来接收 信息
ChartTest ch=new ChartTest();//这里创建一个ChartTest对象 用来调用下文中的ta 也就是把接收到的信息放到ta中
public DatagramSocket ds;
public ChatRe(DatagramSocket ds){
this.ds=ds;
}
@Override
public void run() {
// TODO Auto-generated method stub
try {
ds=new DatagramSocket(50000);
} catch (SocketException e1) {
// TODO Auto-generated catch block
e1.printStackTrace();
}
byte[] buf=new byte[1024];
DatagramPacket dp=new DatagramPacket(buf, buf.length);
try {
while(true){
ds.receive(dp);
String str=new String(dp.getData(),0,dp.getLength());
ch.ta.setText(str);
}
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
ds.close();
}
}