案例——UDP聊天
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聊天的更多相关文章
- 026.2 网络编程 UDP聊天
实现,通过socket对象 ##############################################################需求建立UDP发送端:###思路:1.建立可以实 ...
- JAVA之旅(三十二)——JAVA网络请求,IP地址,TCP/UDP通讯协议概述,Socket,UDP传输,多线程UDP聊天应用
JAVA之旅(三十二)--JAVA网络请求,IP地址,TCP/UDP通讯协议概述,Socket,UDP传输,多线程UDP聊天应用 GUI写到一半电脑系统挂了,也就算了,最多GUI还有一个提示框和实例, ...
- python—多任务版udp聊天机器人
将多任务(多线程)引入到udp聊天机器人,可以实现同时发送消息和接收消息 import socket import threading def udp_send(udp_socket,ip,port) ...
- Python--网络编程学习笔记系列01 附实战:udp聊天器
Python--网络编程学习系列笔记01 网络编程基本目标: 不同的电脑上的软件能够实现数据传输 网络编程基础知识: IP地址: 用来在网络中标记一台电脑 网络号+主机号(按网络号和主机号占位分类A ...
- Java网络编程——UDP聊天程序
UDP简介 UDP协议的全称是用户数据报,在网络中它与TCP协议一样用于处理数据报.在OSI模型中,UDP位于第四层--传输层,处于IP协议额上一层.UDP有不提供数据报分组.组装以及不能对数据报排序 ...
- QT UDP聊天小程序
利用QT的UDP技术,实现两个QT程序之间的聊天程序. #ifndef WIDGET_H #define WIDGET_H #include <QWidget> #include < ...
- java Socket Udp聊天
import java.io.BufferedReader;import java.io.IOException;import java.io.InputStreamReader;import jav ...
- Java使用UDP聊天程序
主要想测试Java UDP通信.Java UDP使用DatagramSocket和DatagramPacket完成UDP通信 主要思路: 1.本机通信,ip地址为:127.0.0.1 2.开一个线程监 ...
- QT开发之旅-Udp聊天室编程
一.概要设计 登录对话框(继承自QDialog类)进行用户登录查询数据库用户是否存在,注册插入数据到用户表.用户表字段: (chatid int primary key, passwd varchar ...
随机推荐
- 图解leetcode —— 395. 至少有K个重复字符的最长子串
前言: 每道题附带动态示意图,提供java.python两种语言答案,力求提供leetcode最优解. 描述: 找到给定字符串(由小写字符组成)中的最长子串 T , 要求 T 中的每一字符出现次数都不 ...
- [UWP]在应用退出时弹出确认提示框
1. 需求 在应用退出时(点击右上角的关闭按钮)弹出一个确认按钮可以说是一个最常见的操作了,例如记事本的"你是否保存": 但这个功能在UWP上居然有点小复杂.这篇文章将解释如何实现 ...
- 使用SSH服务远程管理主机(使用密钥)
使用ssh服务远程管理主机 SSH是建立在应用层和传输层基础上的安全协议,目的是要在非安全网络上提供安全的远程登录和其他安全网络服务. 通过SSH连接可以远程管理Linux等设备,默认linuxssh ...
- MySQL必知必会(Create, Alter)
CREATE DATABASE mysql_crash_course_db; USE mysql_crash_course_db; CREATE TABLE customers ( cust_id i ...
- luogu P1191 矩形 |dp
题目描述 给出一个n×nn \times nn×n的矩阵,矩阵中,有些格子被染成白色,有些格子被染成黑色,现要求矩阵中白色矩形的数量 输入格式 第一行,一个整数nnn,表示矩形的大小. 接下来nnn行 ...
- Apache Maven从入门到升天
喜欢就点个赞呗! GitHub项目JavaHouse同步收录 1 引入 在日常 Java 开发中,Maven 应该是必不可少的一个工具了,当然也有人使用 Gradle 的.那么 Maven 究竟是个啥 ...
- 创建自己的github仓库
作者: wangzz 原文地址:http://blog.csdn.net/wzzvictory/article/details/20067595 一.创建自己的github仓库 CocoaPods都托 ...
- docker-compose部署
一.部署compose docker compose可以方便我们快捷高效地管理容器的启动.停止.重启等操作,它类似于linux下的shell脚本,基于yaml语法,在该文件里我们可以描述应用的架构,比 ...
- JS基础-事件队列
为什么JavaScript是单线程? JavaScript语言的一大特点就是单线程,也就是说,同一个时间只能做一件事.那么,为什么JavaScript不能有多个线程呢?这样能提高效率啊. JavaSc ...
- Vue ---- vue的基本使用 文本/事件/属性指令 补充: js面向对象 js函数
目录 日考题(知识点)