黑马程序员技术交流社区
标题:
使用GUI与UDP实现图形化界面网络聊天工具
[打印本页]
作者:
展展
时间:
2014-4-20 13:10
标题:
使用GUI与UDP实现图形化界面网络聊天工具
当学到毕老师教的GUI各种组件,心里很开心,因为第一次玩有图形界面的编程,以前都是黑框框DOS命令行,玩图形界面的确很爽。
先给大家看看我的
展展聊天小工具吧
Online.jpg
(84.7 KB, 下载次数: 37)
下载附件
2014-4-20 13:09 上传
怎么样,还不错吧。我曾经上课拿到学校机房和小伙伴一起实验,的确很好玩,相当与局域网的飞秋,就差飞秋可以传作业文件的功能了= =...
所需要 java.io包 java.awt包 java.awt.event包还有 java.net包,还有一个 java.util.concurrent.locks包,控制发送消息用的
具体的思路或者说实现方法是这样的:
先建立图形化界面,调一调大小,设置好了就开始写代码了。
监听Button,就是信息发送的Button,代码是先把发送消息的窗口字符串保存到一个String str 变量里,保存完就可以清空发送窗口了,我们只需要这个String str ----发送的内容。
然后就是写Udp发送端和接受端的部分了,我还是喜欢使用多线程。将String str转成byte[] 为参数作为数据包。
在注意一下,发送端和Button需要一个锁来保持同步性。就是我点一下消息发送,Udp发送端在活一下,走一次代码。
具体还是看代码吧。
/*
展展聊天工具
*/
import java.awt.*;
import java.awt.event.*;
import java.net.*;
import java.io.*;
import java.util.concurrent.locks.*;
class ZZOnline
{
private Frame f;
private TextField setIP;
public static TextArea recewindow;
private TextArea sendwindow;
private Button but;
public static String info;
public static String ip="127.0.0.1";
public static Lock lock=new ReentrantLock();
public static Condition con1=lock.newCondition();
public static Condition con2=lock.newCondition();
public static boolean flag=true;
ZZOnline()
{
init();
}
public void init()
{
f=new Frame("展展聊天工具");
f.setBounds(300,100,300,350);
f.setLayout(new FlowLayout());
setIP=new TextField(10);
f.add(setIP);
recewindow=new TextArea(6,35);
f.add(recewindow);
sendwindow=new TextArea(6,35);
f.add(sendwindow);
but=new Button("信息发送");
f.add(but);
MyEvent();
f.setVisible(true);
}
public void MyEvent()
{
f.addWindowListener(new WindowAdapter()
{
public void windowClosing(WindowEvent e)
{
System.exit(0);
}
});
but.addActionListener(new ActionListener()
{
public void actionPerformed(ActionEvent e)
{
lock.lock();
try
{
info=sendwindow.getText();
if(setIP.getText()!="")
ip=setIP.getText();
recewindow.append("我发送的:"+info+"\r\n");
sendwindow.setText("");
flag=false;
con1.signal();
}
catch (Exception ex)
{
}
finally
{
lock.unlock();
}
}
});
}
public static void main(String[] args)throws Exception
{
new ZZOnline();
DatagramSocket sendds=new DatagramSocket();
DatagramSocket receds=new DatagramSocket(10003);
MySend sendSocket=new MySend(sendds);
MyRece receSocket=new MyRece(receds);
new Thread(sendSocket).start();
new Thread(receSocket).start();
}
}
class MySend implements Runnable//发送端
{
private DatagramSocket ds;
MySend(DatagramSocket ds)
{
this.ds=ds;
}
public void run()
{
ZZOnline.lock.lock();
try
{
while(true)
{
while (ZZOnline.flag)
{
ZZOnline.con1.await();
}
byte[] buf=ZZOnline.info.getBytes();
DatagramPacket dp=
new DatagramPacket(buf,buf.length,InetAddress.getByName(ZZOnline.ip),10003);
ds.send(dp);
ZZOnline.flag=true;
}
}
catch (Exception ex)
{
}
finally
{
ZZOnline.lock.unlock();
}
}
}
class MyRece implements Runnable//接受端
{
private DatagramSocket ds;
MyRece(DatagramSocket ds)
{
this.ds=ds;
}
public void run()
{
try
{
while (true)
{
byte[] buf=new byte[1024];
DatagramPacket dp=new DatagramPacket(buf,buf.length);
ds.receive(dp);
String ip=dp.getAddress().getHostAddress();
String data=new String(dp.getData(),0,dp.getLength());
ZZOnline.recewindow.append(ip+"::"+data+"\r\n");
}
}
catch (Exception ex)
{
}
}
}
复制代码
作者:
许庭洲
时间:
2014-4-24 21:53
值得学习ing!
欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/)
黑马程序员IT技术论坛 X3.2