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 ...
随机推荐
- Iframe内联框架
iframe:内联框架标签,用于在网页中任意的位置嵌入另一个网页 <iframe src="url地址"> </iframe> iframe标签的常用属性 ...
- asp查找</td>标记时遇到以外的文件结尾
正确的<td></td> 错误的<td> 没有写完整
- git 查看暂存区
一.简介 git ls-files 命令是用来查看暂存区中文件信息 二.常用参数 参数说明(括号里是简写) --cached(-c)显示暂存区中的文件,git ls-files命令默认的参数 --de ...
- Java虚拟机_运行时数据区
Java虚拟机在执行Java程序的过程中会把它所管理的内存划分为若干个不同的数据区域. 这些区域都有各自的用途.各自的创建和销毁的时间,有的区域随着虚拟机进程的启动而存在,有些区域则是依赖用户线程启动 ...
- php 多次导入文件导致 Cannot redeclare class
定义了类A b.php中导入了A c.php中导入了b.php c.php中导入A会报错:
- Spring boot 入门三:SpringBoot用JdbcTemplates访问Mysql 实现增删改查
建表脚本 -- create table `account`DROP TABLE `account` IF EXISTSCREATE TABLE `account` ( `id` int(11) NO ...
- php excel原理
- thinkPHP的几个系统常量
echo "当前请求:" . __SELF__ . '<br>'; echo "当前分组:" . __MODULE__ . '<br>' ...
- 大数据量报表APPLET打印分页传输方案
1 . 问题概述 当报表运算完成时,客户端经常需要调用润乾自带的runqianReport4Applet.jar来完成打印操作, 然而数据量比较大的时候,会导致无法加载完成,直至applet内存 ...
- sql 脚本 oracle scott 用户的四张表导入 mysql 中
/* 要先删除emp表,不能先删除dept表,因为dept有一个外键关联emp表*/drop TABLE emp;drop TABLE dept; drop TABLE salgrade;drop T ...