实现,通过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聊天的更多相关文章

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

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

  2. 026.3 网络编程 TCP聊天

    分为客户端和服务端,分别进行收发操作##########################################################################客户端:###思 ...

  3. c/c++ 网络编程 UDP 设定MTU

    网络编程 UDP 设定MTU MTU(Maximun Transmisson Unit):一次送信的最大size. 在程序里动态改变MTU.注意:程序运行需要root权限. 程序运行的方法: sudo ...

  4. c/c++ 网络编程 UDP up/down 网卡

    网络编程 UDP up/down 网卡 在程序里动态改变网卡的状态.注意:程序运行需要root权限. 程序运行的方法: sudo ./a.out 1,关闭网卡 #include <stdio.h ...

  5. c/c++ 网络编程 UDP 改变网关和网卡名字

    网络编程 UDP 改变网关和网卡名字 在程序里动态改变网关和网卡名字 1,改变网卡名字 #include <stdio.h> #include <string.h> #incl ...

  6. c/c++ 网络编程 UDP 改变网卡的硬件地址

    网络编程 UDP 改变网卡的硬件地址 在程序里动态改变网卡的硬件地址 1,取得网卡的硬件地址 #include <stdio.h> #include <string.h> #i ...

  7. c/c++ 网络编程 UDP 改变IP地址

    网络编程 UDP 改变IP地址 在程序里动态改变主机的IP地址 1,改变ipv4的地址 #include <stdio.h> #include <string.h> #incl ...

  8. c/c++ 网络编程 UDP 用if_nameindex和ioctl取得主机网络信息

    网络编程 UDP 用if_nameindex和ioctl取得主机网络信息 getifaddrs函数取得的东西太多了,如果只想取得网卡名字和网卡编号可以用下面的2个函数. 1,if_nameindex ...

  9. c/c++ 网络编程 UDP 主机网络信息取得

    网络编程 UDP 主机网络信息取得 1,if_nametoindex 通过网卡名字取得网卡编号 2,if_indextoname 通过网卡编号取得网卡名字 #include <stdio.h&g ...

随机推荐

  1. Iframe内联框架

    iframe:内联框架标签,用于在网页中任意的位置嵌入另一个网页 <iframe src="url地址"> </iframe> iframe标签的常用属性 ...

  2. asp查找</td>标记时遇到以外的文件结尾

    正确的<td></td> 错误的<td> 没有写完整

  3. git 查看暂存区

    一.简介 git ls-files 命令是用来查看暂存区中文件信息 二.常用参数 参数说明(括号里是简写) --cached(-c)显示暂存区中的文件,git ls-files命令默认的参数 --de ...

  4. Java虚拟机_运行时数据区

    Java虚拟机在执行Java程序的过程中会把它所管理的内存划分为若干个不同的数据区域. 这些区域都有各自的用途.各自的创建和销毁的时间,有的区域随着虚拟机进程的启动而存在,有些区域则是依赖用户线程启动 ...

  5. php 多次导入文件导致 Cannot redeclare class

    定义了类A b.php中导入了A c.php中导入了b.php c.php中导入A会报错:

  6. Spring boot 入门三:SpringBoot用JdbcTemplates访问Mysql 实现增删改查

    建表脚本 -- create table `account`DROP TABLE `account` IF EXISTSCREATE TABLE `account` ( `id` int(11) NO ...

  7. php excel原理

  8. thinkPHP的几个系统常量

    echo "当前请求:" . __SELF__ . '<br>'; echo "当前分组:" . __MODULE__ . '<br>' ...

  9. 大数据量报表APPLET打印分页传输方案

     1 . 问题概述 当报表运算完成时,客户端经常需要调用润乾自带的runqianReport4Applet.jar来完成打印操作, 然而数据量比较大的时候,会导致无法加载完成,直至applet内存 ...

  10. sql 脚本 oracle scott 用户的四张表导入 mysql 中

    /* 要先删除emp表,不能先删除dept表,因为dept有一个外键关联emp表*/drop TABLE emp;drop TABLE dept; drop TABLE salgrade;drop T ...