大发体育娱乐在线-大发体育娱乐官方网站-大发体育娱乐登录网址
做最好的网站

Java网络编程之UDP网络通信,网络编程之UDP

来源:http://www.dfwstonefabricators.com 作者:编程应用 人气:162 发布时间:2019-09-27
摘要:一、UDP 1      互联网编制程序----UDPNo25 UDP的齐全部是User Datagram Protocol,是一种无连接的不安全的传导公约, 【Scanner scanner =new Scanner(System.in); 传输数据时发送方和接收方无需创建连接

一、UDP

1      互联网编制程序----UDPNo25

  UDP的齐全部是User Datagram Protocol,是一种无连接的不安全的传导公约,

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

  传输数据时发送方和接收方无需创建连接,所以是不安全的。

try {

  发送时不创立连接间接发送,发送后不关怀接受方能无法接受。UDP只担任发出去,后续的业务与之非亲非故。

DatagramSockets = newDatagramSocket(8888);

  1)、使用UDP发送和收受多少的长河:

String line =scanner.nextLine();

  1接收数据:

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

    1.1创造数量包实例,用于接收数据。(内定接收方IP,端口)

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

    1.2成立接收容器

try {

    1.3将收受容器封装成包

DatagramPacketp = new DatagramPacket(bytes, bytes.length,

    1.4接收包

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

    1.5管理包(能够看做拆包,将包中数量拿出来)

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

    1.6刑满释放资源

s.close();

  2.发送数据

scanner.close();

    2.1创制数量报实例,用于发送数据。(钦赐发送IP,端口)

DatagramSockets = new DatagramSocket(9999);

    2.2创制发送能源

byte[] bytes = newbyte[1024];

    2.3将发送财富封装成包(包增加发送指标地,端口)

DatagramPacket p =new DatagramPacket(bytes, bytes.length);//希图空包

    2.4发送包

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

    2.5保释能源

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

  2)、DatagramSocket & DatagramPacket

System.out.println(str);

    java上将UDP封装成DatagramSocket类,用于发送和摄取数据报。

s.close();

    2.1构造方法:

    DatagramSocket//创制数据报,并绑定到本地主机的钦命端口

2:bytes

    DatagramSocket(int port, InetAddress laddr)//创制数据报,绑定到钦赐地方的钦点端口

*    2.2至关重要格局*

DatagramSocket s =new DatagramSocket(9999);

    void send(DatagramPacket p)//发送数据包
    voidreceive(DatagramPacket p)//接收数据包

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

  

//用于寄放接收数据的空数据报包,字节数组放置在那之中

    数据需求打包后本事发送,而接收数据也是以包的款式接受,java中应用DatagramPacket将数据打包。

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

    构造方法:

s.receive(p);//接收别的收发站发来的数目,阻塞方法,收到才回来

    DatagramPacket(byte[] buf, int length)//构造接收数据包及其长度,

for(int i=0;i

*    DatagramPacket(byte[] buf, int length, InetAddress address, int port)//构造二个数据包,钦点发送主机及端口音讯*

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

*    首要方法:*

}

*    int getLength()//重回要发送的要么要经受的数据长度*

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

*    byte[]getData()//获取发生或收受的多少,也正是拆包,获取包内数据。*

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

Server: 

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

import java.io.IOException;import java.net.DatagramPacket;import java.net.DatagramSocket;import java.net.InetAddress;import java.net.SocketException;public class Server {    public static void main(String[] args) throws IOException {        DatagramSocket server = new DatagramSocket(8888,InetAddress.getByName("localhost"));        byte[] r = new byte[1024];//接收容器        DatagramPacket packet = new DatagramPacket(r,r.length);//打包        server.receive;//接收包        System.out.println(new String(packet.getData(),0,packet.getLength;//拆包并解析包        server.close();            }}

//创设三个包,把要发送的数目塞进去,写上对方的地点和端口9999

Client:   

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

import java.io.IOException;import java.net.DatagramPacket;import java.net.DatagramSocket;import java.net.InetAddress;import java.net.SocketException;import java.net.UnknownHostException;public class Client {    public static void main(String[] args) throws IOException {        // TODO Auto-generated method stub        DatagramSocket client = new DatagramSocket(8887,InetAddress.getByName("localhost"));        String msg = "hello udp";        byte[] b_msg = msg.getBytes();//数据-->字节
     //打包,并加上目的地信息        DatagramPacket packet = new DatagramPacket(b_msg,b_msg.length,InetAddress.getByName("localhost"),8888);        client.send;//发送包        client.close();//释放资源    }}

运行结果:hello udp

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

先运转Server,Server会等待数据,之后运营Client发送数据,Server接收到数量后就能够深入分析。

s.send(p);

图片 1

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

想像成寄快递1.东西企图好,

*      2.转换为固定格式*

UDP UserDatagram Protocol客户数量报合同

*      3.然后卷入,包上贴特快专递单(邮寄的指标地和接收人*

也是传输层的二个商量,新闻传输时无需三番五次,不可相信赖,功用较高

*      4.然后发送,*

1.1    Java进行UDP通信

*      5.接收方接收*

Java进行UDP通信:

*      6.然后拆快递*

DatagramSocket相当于三个收发站(消息发送站)

*      7.然后获得东西。*

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

*  *

send(DatagramPacketp)发送数据报包

  

receive(DatagramPacketp)接受多少报包,阻塞方法,一旦接到对象发过来的包,那一个DatagramPacket中的贮存数据的字节数组就能够活动填写对方发过来的音讯

上边的数目是字符串能够一贯转变为字节,但万一一时传输的数码不能够一向调换为字节那时该如何做吧?

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

那将要用到IO流的学识,首要采纳ByteArrayStream(toByteArray、DataStream(WriteXxxx。

构造方法:

数据-->字节:

一、发送的包:

先将数据及其格式通过DataOutputStream写入ByteArrayOutputStream中,再通过ByteArrayOutputStream中的toByteArray()方法将的字节拿出。

DatagramPacket(byte[]bytes,int len,InetAddress addr,int port)首个参数表示字节数组情势的发送数据,第3个参数是包的长短,日常是字节数组的长度,第多个参数是接收方的地址,第几个参数接收方的端口)

字节-->数据:

二、接收的包:

将字节数组放入ByteArrayInputStream中,然后经过DataInputStream中的readXxx读取ByteArrayInputStream中字节数组,将其更改为相应数据类型。

DatagramPacket(byte[]bytes,int len)

Server:

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

import java.io.ByteArrayInputStream;import java.io.DataInputStream;import java.io.IOException;import java.net.DatagramPacket;import java.net.DatagramSocket;import java.net.InetAddress;public class Server {    public static void main(String[] args) throws IOException {        DatagramSocket server = new DatagramSocket(8888,InetAddress.getByName("localhost"));        byte[] r = new byte[1024];        DatagramPacket packet = new DatagramPacket(r,r.length);        server.receive;        System.out.println(byteToDouble(packet.getData;//字节转换为数组        server.close();            }        public static double byteToDouble(byte[] b) throws IOException{        ByteArrayInputStream bis = new ByteArrayInputStream;//将字节放入ByteArratInputStream中        DataInputStream dis = new DataInputStream;//通过dis读取bis中字节        double data = dis.readDouble();//通过dis.readXxxx读取bis中的字节数组。        return data;    }}

getLength()获取包的可行长度

Client:

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

import java.io.ByteArrayOutputStream;import java.io.DataOutputStream;import java.io.IOException;import java.net.DatagramPacket;import java.net.DatagramSocket;import java.net.InetAddress;public class Client {    public static void main(String[] args) throws IOException {        // TODO Auto-generated method stub        DatagramSocket client = new DatagramSocket(8887,InetAddress.getByName("localhost"));    //    String msg = "hello udp";        Double data = 9.1;        byte[] b_data = doubleToByte;//数据转换为字节        DatagramPacket packet = new DatagramPacket(b_data,b_data.length,InetAddress.getByName("localhost"),8888);        client.send;        client.close();    }        public static byte[] doubleToByte(double dou) throws IOException{        ByteArrayOutputStream bos = new ByteArrayOutputStream();//创建字节数组输入流        DataOutputStream dos = new DataOutputStream;//通过dos想bos中写入        dos.writeDouble;//通过dos中的write.Xxxx将dou写入bos中        dos.flush();        dos.close();        byte[] data = bos.toByteArray();//将bos中字节取出。        return data;    }}

运行结果:9.1

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;

}

}

}

}

本文由大发体育娱乐在线发布于编程应用,转载请注明出处:Java网络编程之UDP网络通信,网络编程之UDP

关键词:

上一篇:没有了

下一篇:最小花费

最火资讯