黑马程序员技术交流社区
标题:
新人写了个局域网聊天工具,请大神给指错优化
[打印本页]
作者:
栗新岩
时间:
2015-2-1 11:09
标题:
新人写了个局域网聊天工具,请大神给指错优化
新人看了毕老师的基础教程,写了个局域网聊天工具。倒是能正常运行,估计会有很多没检查出来的错,请老师大神给优化指正。
还存在写问题:1,两个Socket服务该什么时候关闭
2,怎样设置,使软件在运行时,让光标默认在发送端的文本框里
代码如下:
/*
制作局域网聊天工具 思路:
1,创建Frame窗体,设置边界式布局
2,添加两个TextArea,接收端在上,发送端在下
3,给窗体添加监听事件(关闭窗体)
4,在发送端添加键盘监听,当按Enter时,将文本通过UDP Socket服务发送到局域网广播ip
5,在接收端创建Socket服务来接收数据,通过数据包方法解析数据,追加到接收端文本框
6,创建两个线程,运行发送端和接收端
*/
import java.awt.*;
import java.awt.event.*;
import java.io.*;
import java.net.*;
class ChatDemo
{
public static TextArea tas = new TextArea();
public static TextArea tar = new TextArea();//创建两个文本框对象
public static void main(String[] args) throws Exception
{
//创建Frame窗体,设置边界式布局:
Frame f = new Frame("聊天工具");//创建一个窗体
f.setBounds(400,200,500,400);//设置窗体位置和大小
f.setLayout(new BorderLayout());//设置窗体为边界式布局
f.add(tar,BorderLayout.NORTH);
f.add(tas,BorderLayout.SOUTH);//设置发送端文本框在下,接收端文本框在上
tar.setEditable(false);//设置接收端文本框用户不可编辑
f.setVisible(true);//使窗体可见
//添加监听机制,按“叉”退出
f.addWindowListener(new WindowAdapter(){
public void windowClosing(WindowEvent e){
System.exit(0);
}
});
//创建两个线程,启动发送端和接收端
DatagramSocket receSocket = new DatagramSocket(10000);//给接收端设置端口
DatagramSocket sendSocket = new DatagramSocket();//建立udp的socket服务
new Thread(new UdpRece(receSocket)).start();
new Thread(new UdpSend(sendSocket)).start();
}
}
//发送端线程:
class UdpSend implements Runnable
{
private DatagramSocket ds;
public UdpSend(DatagramSocket ds)
{
this.ds = ds;
}
public void run()//覆盖run()方法
{
ChatDemo.tas.addKeyListener(new KeyAdapter()//添加键盘监听
{
public void keyPressed(KeyEvent e)
{
if (e.getKeyCode()==KeyEvent.VK_ENTER)//如果按下Enter键,则执行
{
try
{
String localIp = InetAddress.getLocalHost().getHostAddress();//获取本机ip
String[] ipx = localIp.split("\\.");//将本地ip用“.”切割,不可以使用localIp.split("."),split方法用的是正则表达式,"."会跟所有字符匹配,以至于什么都分割不出来
String line = ChatDemo.tas.getText();//获取发送端文本框的内容
//使用DatagramPacket把要发送的数据封装到该对象包中
byte[] buf =line.getBytes();
DatagramPacket dp = new DatagramPacket(buf,buf.length,InetAddress.getByName(ipx[0]+"."+ipx[1]+"."+ipx[2]+".255"),10000);
ds.send(dp); //通过udp的socket服务将数据包发送出去,使用send方法
}
catch (Exception ex)
{
throw new RuntimeException("发送端失败");
}
}
}
});
}
}
//接收端线程:
class UdpRece implements Runnable
{
private DatagramSocket ds;
public UdpRece(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());
int port = dp.getPort();
ChatDemo.tar.append("来自:"+ip+"--端口为:"+port+"\r\n"+data+"\r\n");//将数据追加到接收端文本框,换行
ChatDemo.tas.setText("");//并将发送端文本框内容清空,以便再次输入
}
}
catch (Exception e)
{
throw new RuntimeException("接收端失败");
}
}
}
复制代码
作者:
栗新岩
时间:
2015-2-1 14:47
哈喽?老师和大神们咧?自顶~~~
作者:
王震阳老师
时间:
2015-2-2 10:03
赞一个!
作者:
栗新岩
时间:
2015-2-2 12:57
王震阳老师 发表于 2015-2-2 10:03
赞一个!
谢谢老师,请问这个代码存在的这两个问题该怎么解决啊??
欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/)
黑马程序员IT技术论坛 X3.2