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;

}

}

}

}

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

相关阅读更多精彩内容

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

友情链接更多精彩内容