/* * 本程序实现了基于UDP协议的局域网网络聊天工具。 * 参考网上的源码,发现一个calss就可以搞定。 * ChatFrame类创建窗口,包含JTextField和TextArea。 * 前者负责获取并发送消息,后者负责显示消息。 * 在ChatFrame的构造函数中加入UDP接收函数,作为一个单独的线程 * UDP的发送函数放在监听器的处理方法中。源事件可以是按钮的点击,或JTextField点回车 * * 程序本身没有多大难度,但由于之前的思路错了,导致撸了两天才撸出来。 * 写代码之前要对程序功能抽象,层层分离,我正在培养这种思维。 */import .*;import java.util.Date;import java.io.*;import java.awt.*;import java.awt.event.ActionEvent;import java.awt.event.ActionListener;import javax.swing.*;public class Chat {/* * 测试 * 一台机器只能运行一个窗口,不然会应为端口已占用报错 */public static void main(String[] args) throws Exception {new ChatFrame();}}class ChatFrame extends JFrame implements ActionListener{public TextArea t;public JTextField f;public DatagramSocket ds;public ChatFrame(){t = new TextArea();t.setEditable(false);add(t,BorderLayout.NORTH);f = new JTextField();add(f,BorderLayout.CENTER);f.setFocusable(true);f.addActionListener(this);JButton send = new JButton("Send");send.addActionListener(this);server();add(send,BorderLayout.SOUTH);setSize(250,270);setVisible(true);setLocationRelativeTo(null);}public void printText(String s) {t.append(new Date()+"\n"+s+"\n");}public void server() {/* * 负责 */try {ds = new DatagramSocket(10003);byte[] buf = new byte[1024];final DatagramPacket p = new DatagramPacket(buf,buf.length);Runnable runnable=new Runnable() {@Overridepublic void run() {// TODO 自动生成的方法存根while(true) {try {ds.receive(p);String data = new String(p.getData(),0,p.getLength());printText(data);}catch(Exception e) {}}}};new Thread(runnable).start();} catch (IOException e) {// TODO 自动生成的 catch 块e.printStackTrace();}}public void actionPerformed(ActionEvent arg0) {// TODO 自动生成的方法存根try {byte[] buf = f.getText().getBytes();DatagramPacket p = new DatagramPacket(buf,buf.length,InetAddress.getByName("192.168.1.255"),10003);try {ds.send(p);}catch(Exception e) {}} catch (Exception e) {// TODO 自动生成的 catch 块e.printStackTrace();}t.selectAll();t.setCaretPosition(f.getDocument().getLength());//清空TextField内已编辑的文本f.setText("");}}
600字范文,内容丰富有趣,生活中的好帮手!