026.2 网络编程 UDP聊天
实现,通过socket对象
##############################################################
需求建立UDP发送端:
###思路:
1、建立可以实现UDP传输的socket服务
2、明确具体发送的数据
3、通过socket服务将数据发送出去
4、关闭服务
###步骤:
1、创建DatagramSocket对象
2、创建DatagramPacket对象,注意参数,(数组,数组长度,通过InetAddress.getByName("127.0.0.1")方式输入ip,端口)
3、通过DatagramSocket对象的send发送DatagramPacket对象
4、关闭DatagramSocket对象
//###发送端代码:
System.out.println("UDP发送端启动");
//1、创建UDP服务
DatagramSocket ds = new DatagramSocket();
//2、明确数据
String str = "miss";
//3、发送数据,将数据封装到数据包中
//3.1封装,明确目的和端口
byte[] buf = str.getBytes();
DatagramPacket dp = new DatagramPacket(buf, buf.length, InetAddress.getByName("127.0.0.1"), 10000);
//3.2发送
ds.send(dp);
ds.close();
##################################################################
接收端
###思路:
1、创建socket服务,明确端口
2、收数据
3、将其中需要的数据取出来,ip,端口,data
4、关闭资源
###步骤:
1、创建DatagramSocket对象
2、创建DatagramPacket对象,参数需要一个字节数组及长度
3、通过DatagramSocket对象的receive方法接收发送端发送的信息,参数填DatagramPacket对象
4、使用DatagramPacket对象的dp.getAddress().getHostAddress()方法获取IP,getPort方法获取端口
dp.getData(),dp.getLength(),获取数据和长度
5、关闭DatagramSocket对象
//###接收端代码
System.out.println("UDP接收端启动");
//1、创建socket服务
DatagramSocket ds = new DatagramSocket(10000);
//2、使用socket的接收方法,接收数据,将接收到的数据存储到数据包中,通过数据包的方法解析
//2.1创建数据包
byte[] buf = new byte[1024];
DatagramPacket dp = new DatagramPacket(buf, buf.length);
ds.receive(dp);
//2.2 通过数据包对象对数据解析
String ip = dp.getAddress().getHostAddress();
int port = dp.getPort();
//获取文字数据
String str = new String(dp.getData(),0,dp.getLength());
System.out.println(ip+"-"+port+":"+str);
//关闭资源
ds.close();
以上实现的是单发单收,不符合现实,所以要运用多线程实现多发多收
######################################################################################
以下代码,自己读一下,与多线程和流组合使用
UDP聊天多发多收代码:
#######main.java
public class UDPChatTest {
/**
* @param args
* @throws IOException
*/
public static void main(String[] args) throws IOException {
/*
* 案例一:通过udp实现群聊程序。 思路: 这个程序中既有收又有发,需要同时执行,需要使用多线程技术。
* 一个线程负责发,一个线程负责收。需要两个任务。
*/
//发送端的socket 接收端的socket
DatagramSocket sendSocket = new DatagramSocket(55555);
DatagramSocket receSocket = new DatagramSocket(10002);
//创建任务对象。
Send send = new Send(sendSocket);
Rece rece = new Rece(receSocket);
//创建线程并开启。
Thread t1 = new Thread(send);
Thread t2 = new Thread(rece);
t1.start();
t2.start();
}
}
// 发送任务
class Send implements Runnable {
private DatagramSocket ds;
public Send(DatagramSocket ds) {
super();
this.ds = ds;
}
@Override
public void run() {
try {
BufferedReader bufr = new BufferedReader(new InputStreamReader(
System.in));
String line = null;
while ((line = bufr.readLine()) != null) {
byte[] buf = line.getBytes();// 将数据转成字节数组。
DatagramPacket dp = new DatagramPacket(buf, buf.length,
InetAddress.getByName("192.168.1.223"), 10002); //IP为255表示广播
ds.send(dp);
if ("886".equals(line)) {
break;
}
}
// 4,关闭资源。
ds.close();
} catch (IOException e) {
}
}
}
// 接收任务。
class Rece implements Runnable {
private DatagramSocket ds;
public Rece(DatagramSocket ds) {
super();
this.ds = ds;
}
@Override
public void 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 (IOException e) {
}
}
}
}
026.2 网络编程 UDP聊天的更多相关文章
- Java网络编程——UDP聊天程序
UDP简介 UDP协议的全称是用户数据报,在网络中它与TCP协议一样用于处理数据报.在OSI模型中,UDP位于第四层--传输层,处于IP协议额上一层.UDP有不提供数据报分组.组装以及不能对数据报排序 ...
- 026.3 网络编程 TCP聊天
分为客户端和服务端,分别进行收发操作##########################################################################客户端:###思 ...
- c/c++ 网络编程 UDP 设定MTU
网络编程 UDP 设定MTU MTU(Maximun Transmisson Unit):一次送信的最大size. 在程序里动态改变MTU.注意:程序运行需要root权限. 程序运行的方法: sudo ...
- c/c++ 网络编程 UDP up/down 网卡
网络编程 UDP up/down 网卡 在程序里动态改变网卡的状态.注意:程序运行需要root权限. 程序运行的方法: sudo ./a.out 1,关闭网卡 #include <stdio.h ...
- c/c++ 网络编程 UDP 改变网关和网卡名字
网络编程 UDP 改变网关和网卡名字 在程序里动态改变网关和网卡名字 1,改变网卡名字 #include <stdio.h> #include <string.h> #incl ...
- c/c++ 网络编程 UDP 改变网卡的硬件地址
网络编程 UDP 改变网卡的硬件地址 在程序里动态改变网卡的硬件地址 1,取得网卡的硬件地址 #include <stdio.h> #include <string.h> #i ...
- c/c++ 网络编程 UDP 改变IP地址
网络编程 UDP 改变IP地址 在程序里动态改变主机的IP地址 1,改变ipv4的地址 #include <stdio.h> #include <string.h> #incl ...
- c/c++ 网络编程 UDP 用if_nameindex和ioctl取得主机网络信息
网络编程 UDP 用if_nameindex和ioctl取得主机网络信息 getifaddrs函数取得的东西太多了,如果只想取得网卡名字和网卡编号可以用下面的2个函数. 1,if_nameindex ...
- c/c++ 网络编程 UDP 主机网络信息取得
网络编程 UDP 主机网络信息取得 1,if_nametoindex 通过网卡名字取得网卡编号 2,if_indextoname 通过网卡编号取得网卡名字 #include <stdio.h&g ...
随机推荐
- SQL Server附加数据库拒绝访问解决方法汇总
@本文来自百度 方法一:修改权限法 1 打开要附加的数据库文件所在的文件夹,即扩展名为mdf的文件所在的文件夹,如下图所示: 2 右键单击mdf文件,选择“属性”,如下图所示: 3 单击“安全”选项卡 ...
- mysql中Access denied for user 'root'@'localhost' (using password:YES)错误
此错误主要是由于你的系统曾经装过MYSQL,在重装就会要求输入原来设定的密码 由于输入错误导致 解决办法见 上一篇博客 MYSQL安装时解决要输入current root passwo ...
- c#基础学习(0701)之一些简单的方法练习
一个简单的求数组最大值的方法 //可变参数 int max=GetMaxNumbers(101,30) static int GetMaxNumbers(params int[] pms) { ]; ...
- SDWebImage实现图片展示、缓存、清除缓存
1. /* 图片显示 */ [self.imageView sd_setImageWithURL:[NSURL URLWithString:urlString]]; [s ...
- Spring系列之——spring security
1 搭建springboot 2 配置pom依赖(springboot版本为2.1.3) <dependency> <groupId>org.springframework.b ...
- KATANA Owin 资料收集
https://www.cnblogs.com/xishuai/p/asp-net-5-owin-katana.html http://wiki.jikexueyuan.com/project/thi ...
- python学习之老男孩python全栈第九期_day017作业
1. 三级菜单的代码看一遍 2. 斐波那契数列用递归实现:问第n个斐波那契数是多少 def fbnq(n): if n == 0 or n == 1: return 1 else: return fb ...
- Jupyter notebook 使用多个Conda 环境
conda install nb_conda_kernels
- 1finally与return、exit()
public class TestException { public static void main(String[] args) { String[] str = {"1", ...
- 搭建Kafka开发环境
Kafka版本是:kafka_2.10-0.8.2.1 1.maven工程方式 在pom.xml中配置kafka依赖 1 2 3 4 5 <dependency> <grou ...