UDP聊天案例

  做一个网络编程相关的案例,想着用利用UDP的快速且不用连接的优点做一个聊天室,我们一个聊天程序需要可以接收消息,也要可以发送消息,所以我们的DatagramSocket对象不但需要调用send函数,还需要调用recieve函数。

  而且由于聊天的特殊性,有可能在你发送的时候有消息需要接收,所以我们需要用到线程,开启两个线程,一个负责接收,一个负责发送,为了清晰起见,我们将收发消息各封装在两个实现了runnable接口的类中,然后重写run方法,内容就是消息的收或者发。

  在实现操作的时候,开启两个这样的程序,即可与自己聊天了(沙雕嗷~~),当然如果将IP最后一段改成广播形式,那这个局域网内的人都可以收到,即群聊。

接收消息的类

//接收任务
class Receive implements Runnable{ private DatagramSocket ds; //私有成员是一个对象,由他调用recieve函数 public Receive(DatagramSocket ds) { //构造器
super();
this.ds = ds;
} @Override
public void run() { System.out.println("udp 接收端 run"); while(true)
{
try {
byte[] buf = new byte[1024];
DatagramPacket dp = new DatagramPacket(buf, buf.length);
ds.receive(dp); String ip = dp.getAddress().getHostAddress();
int port = dp.getPort();
String text = new String(dp.getData(),0,dp.getLength()); System.out.println(ip+":"+port+": "+text);
if(text.equals("886"))
{
System.out.println(ip+"...离开聊天室");
}
} catch (Exception e) { } }
}
}

发送消息的类

//发送任务
class Send implements Runnable{ private DatagramSocket ds; public Send(DatagramSocket ds) {
super();
this.ds = ds;
} @Override
public void run() { System.out.println("udp 发送端 run"); try {
//将数据封装到数据包中。数据包对象是DatagramPacket。数据来自于键盘录入
BufferedReader bufr = new BufferedReader(new InputStreamReader(System.in));
String line = null; while ((line = bufr.readLine()) != null)
{
byte[] buf = line.getBytes(); //将数据转成字节数组
//将字节数组封装到数据包中
//如果IP改为121.255.255.255,最后一位是255,通知所有的主机
DatagramPacket dp = new DatagramPacket(buf, buf.length, InetAddress.getByName("121.255.255.21"), 10003);
ds.send(dp); if("886".equals(line))
break;
} ds.close();
}catch(IOException e) { }
} }

主类

public class UdpChatTest {
/**
* 案例一:通过udp实现群聊程序
*
* 思路:
* 这个程序既有收又有发,需要同时执行,需要多线程技术
* 一个线程复制发,一个线程负责收。需要两个任务
* @throws IOException
*/ public static void main(String[] args) throws IOException { //发送端的socket 接收端的socket
DatagramSocket sendDs = new DatagramSocket();
DatagramSocket ReceDs = new DatagramSocket(10006); //创建两个任务对象
Send send = new Send(sendDs);
Receive rece = new Receive(ReceDs); //创建线程对象,并把任务对象传入
Thread t1 = new Thread(send);
Thread t2 = new Thread(rece); //开启线程
t1.start();
t2.start();
}
}

案例——UDP聊天的更多相关文章

  1. 026.2 网络编程 UDP聊天

    实现,通过socket对象 ##############################################################需求建立UDP发送端:###思路:1.建立可以实 ...

  2. JAVA之旅(三十二)——JAVA网络请求,IP地址,TCP/UDP通讯协议概述,Socket,UDP传输,多线程UDP聊天应用

    JAVA之旅(三十二)--JAVA网络请求,IP地址,TCP/UDP通讯协议概述,Socket,UDP传输,多线程UDP聊天应用 GUI写到一半电脑系统挂了,也就算了,最多GUI还有一个提示框和实例, ...

  3. python—多任务版udp聊天机器人

    将多任务(多线程)引入到udp聊天机器人,可以实现同时发送消息和接收消息 import socket import threading def udp_send(udp_socket,ip,port) ...

  4. Python--网络编程学习笔记系列01 附实战:udp聊天器

    Python--网络编程学习系列笔记01 网络编程基本目标: 不同的电脑上的软件能够实现数据传输 网络编程基础知识: IP地址: 用来在网络中标记一台电脑  网络号+主机号(按网络号和主机号占位分类A ...

  5. Java网络编程——UDP聊天程序

    UDP简介 UDP协议的全称是用户数据报,在网络中它与TCP协议一样用于处理数据报.在OSI模型中,UDP位于第四层--传输层,处于IP协议额上一层.UDP有不提供数据报分组.组装以及不能对数据报排序 ...

  6. QT UDP聊天小程序

    利用QT的UDP技术,实现两个QT程序之间的聊天程序. #ifndef WIDGET_H #define WIDGET_H #include <QWidget> #include < ...

  7. java Socket Udp聊天

    import java.io.BufferedReader;import java.io.IOException;import java.io.InputStreamReader;import jav ...

  8. Java使用UDP聊天程序

    主要想测试Java UDP通信.Java UDP使用DatagramSocket和DatagramPacket完成UDP通信 主要思路: 1.本机通信,ip地址为:127.0.0.1 2.开一个线程监 ...

  9. QT开发之旅-Udp聊天室编程

    一.概要设计 登录对话框(继承自QDialog类)进行用户登录查询数据库用户是否存在,注册插入数据到用户表.用户表字段: (chatid int primary key, passwd varchar ...

随机推荐

  1. SpringBoot整合freemarker模板

    一.目录展示 二.导入依赖 三.application.properties配置文件 四.在src/main/resource/templates文件夹中创建HelloFreeMarker.ftl文件 ...

  2. [UWP]在应用退出时弹出确认提示框

    1. 需求 在应用退出时(点击右上角的关闭按钮)弹出一个确认按钮可以说是一个最常见的操作了,例如记事本的"你是否保存": 但这个功能在UWP上居然有点小复杂.这篇文章将解释如何实现 ...

  3. 大数据之Linux基础

    回顾这一个多月以来闭关学大数据的一些相关重要知识,就当复习,顺便以备以后查看 Linux学习第一步自然是安装Linux. 关于Linux 首先介绍下Linux,Linux系统很多程序员开发者其实都耳熟 ...

  4. Java修炼——冒泡排序

    核心思想: 1)如有一个数列有 N(5)个元素,则至多需要 N-1(4)趟循环 才能保证数列有序 2) 每一趟循环都从数列的第一个元素开始比较,依次比较 相邻的两个元素,比较到数列的最后 3) 如果前 ...

  5. Java中的等待唤醒机制—至少50%的工程师还没掌握!

    这是一篇走心的填坑笔记,自学Java的几年总是在不断学习新的技术,一路走来发现自己踩坑无数,而填上的坑却屈指可数.突然发现,有时候真的不是几年工作经验的问题,有些东西即使工作十年,没有用心去学习过也不 ...

  6. CF 1136A 1136B 1136C 1136D 1136E(Round546ABCDE)题解

    题目地址:https://codeforces.com/contest/1136 A: Nastya Is Reading a Book 题解:挨个判断即可,水题. 参考代码: #include< ...

  7. 【重温基础】16.JSON对象介绍

    本文是 重温基础 系列文章的第十六篇. 今日感受:静. 系列目录: [复习资料]ES6/ES7/ES8/ES9资料整理(个人整理) [重温基础]1-14篇 [重温基础]15.JS对象介绍 本章节复习的 ...

  8. K3cloud、erp系统实时滚动展示未处理数据,监控投诉处理进度

     痛点:企业内部erp人工记录产品投诉销售单,是否跟踪处理完客户投诉,结果不能实时透明,当天还有多少未解决的投诉单,也不能实时查看到,除非手工去系统单据查询,很不方便,跟踪也不顺畅!   解决方案:利 ...

  9. 《吊打面试官》系列-ConcurrentHashMap & HashTable

    你知道的越多,你不知道的越多 点赞再看,养成习惯 本文 GitHub https://github.com/JavaFamily 已收录,有一线大厂面试点思维导图,也整理了很多我的文档,欢迎Star和 ...

  10. 索引与Order By

    Order By 将对结果进行排序,这里的排序最大的特点是资源密集型,尽管多数时候它同时也是CPU密集型的.数据库在进行排序时,必须缓冲临时结果,读取到所有输入,并在完整的排序操作后才能产生第一个输出 ...