Java 网络 UDP 一个局域网下的聊天小程序

这个程序要达到目的,就是我们可以和指定IP下的人进行聊天代码如下:

package awt.udp; import java.awt.BorderLayout; import java.awt.Frame; import java.awt.List; import java.awt.Panel; import java.awt.TextField; import java.awt.event.ActionEvent; import java.awt.event.ActionListener; import java.awt.event.WindowAdapter; import java.awt.event.WindowEvent; import java.io.IOException; import java.net.DatagramPacket; import java.net.DatagramSocket; import java.net.InetAddress; import java.net.UnknownHostException; /** * @author tianzhw * 我对这个UDP网络聊天室的理解,全部在注释里面了,UDP可以理解为一个不安全的网络传输协议。 * 它只是负责传输,至于在接收端是否可以接受的得到,它并不做判断 */ public class Chat extends Frame { List list = new List(6);//这个用的不是java.util.List包,而是窗体java.awt.List TextField fieldIP = new TextField(15); TextField fieldData = new TextField(20); //上面两个大家都明白,就是定义了两个文本输入框 并同时定义了其名字 DatagramSocket socket = null; //因为Socket这个变量要在全局下使用,所以定义在这里。 public Chat() { this.add(list, "Center"); Panel panel = new Panel(); this.add(panel, "South"); panel.setLayout(new BorderLayout()); panel.add(fieldIP, "West"); panel.add(fieldData, "East"); //Panel放在窗体内,同时将我们副本框还有我们装聊天消息放到panel里面 try { socket = new DatagramSocket(3000); //这个是构造一个对象,其中参数的意思。我个人理解为在3000端口创建一个监听,随时准备接受来之3000端口的信息 } catch (Exception e1) { // TODO Auto-generated catch block e1.printStackTrace(); } /* * 因为在Socket中 receive方法,是接受一个UDP的信息。如果,没有一个条消息,这个方法会阻塞在那里。一等到有信息来。 * 所以如果我们写在一个进程中,程序在运行到这个位置的时候就会阻塞在这里没有办法进行下去,所以我们,有启动了另一个线程 */ new Thread(new Runnable() { public void run() { // TODO Auto-generated method stub byte[] b = new byte[1024]; DatagramPacket pack = new DatagramPacket(b, b.length); while (true) { try { socket.receive(pack); list.add(new String(b, 0, pack.getLength()) + "~~~~~~~~~~~来至于" + pack.getAddress() + "的" + pack.getPort() + "端口", 0); //其中要特别理解的是,getLength方法,则个方法会返回,我们在3000端口中接受的字节数组的长度。 } catch (IOException e) { if (socket.isClosed()) { } else e.printStackTrace(); }}}}).start(); fieldData.addActionListener(new ActionListener() { public void actionPerformed(ActionEvent e) { try { byte[] by; by = fieldData.getText().getBytes(); socket.send(new DatagramPacket(fieldData.getText() .getBytes(), fieldData.getText().getBytes().length, InetAddress.getByName(fieldIP.getText()), 3000)); //send方法的四个参数,第一个是要传送的字节数组,这里面就是我们要输入文本框里面的数据, // 第二个输出的长度,后面一个要发送的ip地址,最后就是要发送的端口 } catch (UnknownHostException e1) { e1.printStackTrace(); } catch (IOException e1) { e1.printStackTrace(); } fieldData.setText("");}}); addWindowListener(new WindowAdapter() { public void windowClosing(WindowEvent e) { socket.close();//在关闭程序的时候 结束Socket dispose(); System.exit(0); }}); } }

下面是测试类:

package awt.udp; public class test { /** * @param args */ public static void main(String[] args) { // TODO Auto-generated method stub Chat chat=new Chat(); chat.setSize(300,400); chat.setTitle("tianzhw"); chat.setVisible(true); chat.setResizable(false); } }

代码中注释比较全,这里就不做更多的解释了。

 

你可能感兴趣的:(java)