实现,通过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. 常用算法1 - 快速排序 & 二分查找

    1. 二分查找法: 二分查找法是对一组有序的数字中进行查找,传递相应的数据,进行比较查找到与原数据相同的数据,查找到了返回对应的数组下标,没有找到返回-1. 二分查找法要求数据为一组有序的序列(大到小 ...

  2. 基于Ionic的移动框架搭建

  3. C#基础知识回顾--BackgroundWorker介绍

    简介 BackgroundWorker是.net里用来执行多线程任务的控件,它允许编程者在一个单独的线程上执行一些操作.耗时的操作(如下载和数据库事务)在长时间运行时可能会导致用户界面 (UI) 始终 ...

  4. JS原型与原型链终极讲解

    function Person () { this.name = 'John'; } var person = new Person(); Person.prototype.say = functio ...

  5. Head First Python学习笔记2——文件与异常

    文件处理 1.用open()就可以打开文件,但是请注意:文件里有中文请设置编码,如 :open("filepath","r",encoding="ut ...

  6. 【解决】 无法打开包括文件:“windows.h”: No such file or directory

    vs编译时错误: 无法打开包括文件:“windows.h”: No such file or directory 出现这种错误什么都不用配置(环境变量),最好办法是将VS安装在C盘,让开发工具自动包含 ...

  7. 采用DTO和DAO对JDBC程序进行进一步优化

    采用DTO和DAO对JDBC程序进行进一步优化 DTO:数据传输对象,主要用于远程调用等需要远程调用对象的地方DAO:数据访问对象,主要实现封装数据库的访问,通过它可以把数据库中的表转换成DTO类 引 ...

  8. centos7下安装sublime text3并配置环境变量

    注意:我解压完把sublime_text全改成了sublime,如果未改就是sublime_text 1.官网下载sublime,保存到指定目录,例如/home 2.解压 tar xjf sublim ...

  9. python中函数重载和重写

    python 中的重载  在python中,具有重载的思想却没有重载的概念.所以有的人说python这么语言并不支持函数重载,有的人说python具有重载功能.实际上python编程中具有重载的目的缺 ...

  10. css/jq--弹窗写法介绍,jq插件介绍

    //html文件 <!DOCTYPE html> <html lang="en"> <head> <meta charset=" ...