/**

基于Udp通讯的Java局域网群聊小程序
*/

package com.UdpDemo; import java.net.*;
import java.awt.*;
import java.awt.event.*;
public class UdpDemo { private Frame f;
private TextField tf;
private Button but;
private Button but1;
private TextArea ta; DatagramSocket ds1; //1.创建udpSocket服务建立端点,监听10000端口,接受的ds
DatagramSocket dss; //创建一个线程用来接收10000端口并打印到文本框中
Thread t1=new Thread(new Runnable(){
public void run(){
while(true){
try{
//1.创建udpSocket服务建立端点,监听10000端口,接受的ds1
dss=new DatagramSocket(10000);
//2.定义数据包,用于存储数据
byte[] buf=new byte[1024];
DatagramPacket dp=new DatagramPacket(buf,buf.length);
//3.通过服务的receive方法将收到的数据存入数据包中
dss.receive(dp);
//4.通过数据包的方法获取其中的数据
String ip=dp.getAddress().getHostAddress();
String data=new String(dp.getData(),0,dp.getLength());
//获取发送的端口
int port=dp.getPort();
//输出到文本框
ta.append("\n"+ip+":"+port+"\t:--->"+data+"#\r\n\n");
//关闭资源
dss.close();
}
catch(Exception e){
System.out.println("接收数据异常");
}
}
}
}); public void send(){
try{
//1.创建udp服务,通过DatagramSocket对象
ds1=new DatagramSocket();
//确定数据
byte[] bufSend1=tf.getText().getBytes();
// 构造 DatagramPacket,用来将长度为 length 的包发送到指定主机上的指定端口。封装成数据包 DatagramPacket(byte[] buf,int length,InetAddress address,int port)
DatagramPacket dp1=new DatagramPacket(bufSend1,bufSend1.length,InetAddress.getByName("127.0.0.255"),10000);
//send方法发送,Socket服务将已有数据包发送。
ds1.send(dp1);
//关闭发送资源
ds1.close(); }
catch(Exception e){
System.out.println("send异常");
}
}
//定义一个函数,该函数调用时需传入要发送的参数
public void sendGo(String obj){
//到追加文本区,显示本人已发送的
ta.append("My Speak:"+obj+"\r\n"+"#");
//调用send()函数发送数据
send();
//清空输入框
tf.setText("");
} //UDPDemo方法来调用窗体创建和运行接收线程
UdpDemo(){ init(); t1.start(); } public void init(){
f=new Frame("UdpDemo");
//f.setBounds(横坐标,纵坐标,长度,宽度);
f.setBounds(200,200,600,600);
f.setLayout(new FlowLayout());
//输入框长度
tf=new TextField(60);
//按钮文字
but=new Button("发送");
//按钮文字
but1=new Button("清屏");
// 文本框位置
ta=new TextArea(30,80);
//将以上组件添加到窗体中
f.add(ta);
f.add(tf);
f.add(but);
f.add(but1);
//文本框设置为不可编辑
ta.setEditable(false);
//文本框为指定的颜色
tf.setBackground(new Color(244, 244, 244));
//创建可显示的窗体
myEvent();
f.setVisible(true);
} private void myEvent(){
f.addWindowListener(new WindowAdapter(){
public void windowClosing(WindowEvent e){
//向大家发送我下了的提示
sendGo("我下了!");
//关闭资源
ds1.close();
//关闭窗体
System.exit(0);
}
});
but.addActionListener(new ActionListener(){
public void actionPerformed(ActionEvent e){
sendGo(tf.getText());
}
});
but1.addActionListener(new ActionListener(){
public void actionPerformed(ActionEvent e){
//清空文本框
ta.setText("");
//清空输入框
tf.setText(" ");
}
});
tf.addKeyListener(new KeyAdapter(){
public void keyPressed(KeyEvent e){
//如果按Enter则调用sendGo方法
if(e.getKeyCode()==KeyEvent.VK_ENTER){
sendGo(tf.getText());
}
}
});
} public static void main(String [] arguments) {
try{
//创建UdpDemo()对象
new UdpDemo();
}
catch(Exception e){
//有异常时打印到对话框
System.out.println("main异常");
}
}

      
//采用127.0.0.255的回环地址来测试,若使用仅需更改为局域网ip网段即可。(例:网段为192.168.0.1改为192.168.1.255即可)

最新文章

  1. android listview item取消按点击效果
  2. GitLab使用
  3. IOS OC声明变量在@interface括号中与使用@property的区别
  4. 异或的精彩应用 FIX_BTMAP_END
  5. 嵌入式Linux驱动开发日记
  6. [bzoj1984]月下“毛景树”
  7. C语言 文件操作8--fputs()和fgets()
  8. Netbeans连接数据库
  9. Java源码初学_ArrayList
  10. [Java 8] (5) 使用Lambda表达式进行设计
  11. Linux 所有命令都用不了,只有cd exit能用
  12. Android总结的基本机制监控事件
  13. struts2 使用filter解决中文乱码问题
  14. PHP处理上传文件
  15. PHP中的排序函数sort、asort、rsort、krsort、ksort区别分析
  16. Android studio 3.0以上版本无法引入,找不到v4,v7包方案解决
  17. 运用kNN算法识别潜在续费商家
  18. MySQL中数据的基本查询方式
  19. 采集java性能指标数据
  20. poj1564-Sum It Up(经典DFS)

热门文章

  1. 齐博x2自建流媒体RTMP直播服务器
  2. 什么是齐博/齐博CMS之X1?
  3. 构建LNP镜像
  4. Springboot数据库的配置问题
  5. Day2.1
  6. Java 超新星开源项目 Solon v1.10.10 发布
  7. 记一次多个Java Agent同时使用的类增强冲突问题及分析
  8. 2022春每日一题:Day 23
  9. Kubernetes基础_Service暴露的两种方式
  10. AR手势识别交互,让应用更加“得心应手”