新人看了毕老师的基础教程,写了个局域网聊天工具。倒是能正常运行,估计会有很多没检查出来的错,请老师大神给优化指正。
还存在写问题: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("接收端失败");
- }
- }
- }
复制代码
|