Java网络编程之UDP网络通信

1      网络编程----UDPNo25

【Scanner scanner =new Scanner(System.in);

try {

DatagramSockets = newDatagramSocket(8888);

String line =scanner.nextLine();

byte[] bytes =line.getBytes();//把用户输入的字符串拆成字节数组

//把字节数组塞进包里,写上对方的地址和端口

try {

DatagramPacketp = new DatagramPacket(bytes, bytes.length,

InetAddress.getByName("127.0.0.1"),9999);

s.send(p);//发送包裹

s.close();

scanner.close();

DatagramSockets = new DatagramSocket(9999);

byte[] bytes = newbyte[1024];

DatagramPacket p =new DatagramPacket(bytes, bytes.length);//准备空包

s.receive(p);//接收,空包裹被填满

String str = newString(bytes,0,p.getLength()); //用字节数组的有效数据组装回字符串

System.out.println(str);

s.close();

2:bytes

DatagramSocket s =new DatagramSocket(9999);

byte[] bytes = newbyte[128];//用于存放接收数据的数组

//用于存放接收数据的空数据报包,字节数组放置其中

DatagramPacket p =new DatagramPacket(bytes, bytes.length);

s.receive(p);//接收其他收发站发来的数据,阻塞方法,收到才返回

for(int i=0;i

System.out.println(bytes[i]);  //下标为0,1,2,3

}

s.close();//关闭收发站

DatagramSocket s =new DatagramSocket(8888);//在8888上建立收发站

byte[] bytes = { 1,2, 3 };//要发送的数据

//建立一个包,把要发送的数据塞进去,写上对方的地址和端口9999

DatagramPacket p =new DatagramPacket(bytes, bytes.length,

InetAddress.getByName("127.0.0.1"),9999);

s.send(p);

s.close();//关闭收发站

UDP UserDatagram Protocol用户数据报协议

也是传输层的一个协议,信息传输时不需要连接,不可靠,效率较高

1.1    Java进行UDP通信

Java进行UDP通信:

DatagramSocket相当于一个收发站(信息发送站)

构造方法:DatagramSocket(int port)在port端口上建立收发站

send(DatagramPacketp)发送数据报包

receive(DatagramPacketp)接受数据报包,阻塞方法,一旦收到对象发过来的包,这个DatagramPacket中的存放数据的字节数组就会自动填充对方发过来的信息

DatagramPacket数据报包,收发站要进行收发的包(信息接收站)

构造方法:

一、发送的包:

DatagramPacket(byte[]bytes,int len,InetAddress addr,int port)第一个参数表示字节数组形式的发送数据,第二个参数是包的长度,一般是字节数组的长度,第三个参数是接收方的地址,第四个参数接收方的端口)

二、接收的包:

DatagramPacket(byte[]bytes,int len)

第一个参数是存放接收数据的数组,第二个是接收数据的长度

getLength()获取包的有效长度

InetAddress.getByName(Stringaddress)根据字符串生成一个地址对象

getAddress()获得一个InetAddress对象,表示发送方地址,再调用这个对象的getHostAddress()获取字符串形式的地址

int getPort()获取端口号

1.2    网络编程实战UDP

DatagramSocket类:《此类表示用来发送和接收数据报包的套接字;特点:既能发送又能接收》

DatagramPacket类:《此类表示数据报包。数据报包用来实现无连接包投递服务。每条报文仅根据该包中包含的信息从一台机器路由到另一台机器。》

使用步骤:【发送端:《1、创建套接字对象     2、封装数据报包

3、发送数据报包       4、释放资源》

【接收端:《1、创建套接字对象     2、创建数据报包,用于接收数据

1、 通过receive方法接收数据并保存到数据报包中  4、释放资源》

示例代码:

发送端《

publicclass SendDemo {

public static void main(String[] args)throws Exception{

// UDP的发送端

System.out.println("UDP发送端开启.....");

// 创建Socket对象

DatagramSocket socket = newDatagramSocket();

// 创建数据报包

byte[] buf = "来自udp发送端的数据".getBytes();

DatagramPacket packet = newDatagramPacket(buf, 0, buf.length,

InetAddress.getLocalHost(),6666);

//发送数据

socket.send(packet);

//释放资源

socket.close();

System.out.println("UDP发送端关闭.....");

}

}

接收端《

publicclass ReceiveDemo {

public static void main(String[] args)throws Exception {

// udp接收端

System.out.println("UDP接收端开启.....");

//创建Socket对象

DatagramSocket socket = newDatagramSocket(6666);

//创建一个空的字节数组,是真正保存接收数据的容器

byte[] buf = newbyte[65536];//1024*64=65536

//创建一个空的数据报包,用于接收来自发送端的数据

DatagramPacket packet = newDatagramPacket(buf, buf.length);

//阻塞式方法,接收数据,将接收到的数据保存到指定的数据报包中

socket.receive(packet);

//从数据报包中获取数据

String ip =packet.getAddress().getHostAddress();

//               packet.getData()

//接收数据

String data = new String(buf,0, buf.length);

System.out.println("接收到来自"+ip+"的数据"+data);

System.out.println("UDP接收端关闭.....");

//释放资源

socket.close();

}

}

1.3    简易聊天室

练习:使用UDP协议实现一个DOS版的简易聊天室

publicclass UdpExercise {

public static void main(String[] args){

// TODO Auto-generated methodstub

//开启接收消息的线程

new Thread(newReceiveMsg()).start();

//开启一个发送消息的线程

new Thread(newSendMsg()).start();

}

}

//UDP接收器

class ReceiveMsg implements Runnable{

@Override

public void run() {

// TODOAuto-generated method stub

DatagramSocketsocket = null;

try {

socket =new DatagramSocket(8888);

for(;;){

byte[]buf = new byte[1024];

DatagramPacketpacket = new DatagramPacket(buf, buf.length);

socket.receive(packet);

Stringip = packet.getAddress().getHostAddress();

Stringdata = new String(buf, 0, packet.getLength());

System.out.println(ip+":"+data);

}

} catch(SocketException e) {

// TODOAuto-generated catch block

e.printStackTrace();

} catch (IOExceptione) {

// TODOAuto-generated catch block

e.printStackTrace();

}finally{

if(socket!=null){

socket.close();

socket=null;

}

}

}

}

//udp发送器

class SendMsg implements Runnable {

DatagramSocket socket = null;

@Override

public void run() {

// TODOAuto-generated method stub

try {

socket =new DatagramSocket();

BufferedReaderbr = new BufferedReader(new InputStreamReader(

System.in));

String line= null;

while((line = br.readLine()) != null) {

byte[]buf = line.getBytes();

DatagramPacketpacket = new DatagramPacket(buf, 0,

buf.length,InetAddress.getByName("192.168.95.255"),

8888);

socket.send(packet);

}

} catch (Exceptione) {

// TODOAuto-generated catch block

e.printStackTrace();

}finally{

if(socket!= null){

socket.close();

socket= null;

}

}

}

}

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 212,029评论 6 492
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 90,395评论 3 385
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 157,570评论 0 348
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 56,535评论 1 284
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 65,650评论 6 386
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 49,850评论 1 290
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 39,006评论 3 408
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 37,747评论 0 268
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 44,207评论 1 303
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 36,536评论 2 327
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 38,683评论 1 341
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 34,342评论 4 330
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 39,964评论 3 315
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 30,772评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,004评论 1 266
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 46,401评论 2 360
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 43,566评论 2 349

推荐阅读更多精彩内容

  • 引言:网络编程作为开发服务端和客户端必不可少的技术之一,在Java中也实现的十分完备,今天对Java的网络编程方面...
    cp_insist阅读 326评论 0 0
  • 导读目录 UDP协议的基础 使用DatagramSocket发送、接受数据 使用MulticastSocket实现...
    ql2012jz阅读 780评论 0 1
  • Socket 套接字/插座 在网络编程中所有的数据传递都是依赖于Socke来完成的,要求进行通信的两台计算机都要安...
    _98k阅读 469评论 2 6
  • 大家好,我是徐爱卿。博客地址:flutterall.com 引言 Android网络编程一直都是我想记录的一篇文章...
    徐爱卿阅读 45,198评论 52 219
  • 1. 网络编程概述 1.1 计算机网络 是指将地理位置不同的具有独立功能的多台计算机及其外部设备,通过通信线路连接...
    JackChen1024阅读 1,033评论 0 3