java UDP 操作 (No.15)

javaUDP操作

DatagramSocket类
要收发DatagramPacket必须打开一个数据报socket,当服务器构造DatagramSocket时。

服务器和客户端的服务器

两者使用的socket都是一样的,区别仅仅在于服务器端的端口是已知端口,而客户端的端口是系统分配的。

TCP端口和UDP端口之间没有关联,所以两者可以共同绑定在同一个端口上,而不会有相互影响。

DatagramSocket类的构造函数

DatagramSocket创建一个在指定端口监听的入站数据报的socket,使用此构造函数可以编写出在指导的端口监听的服务器。

如果服务器在匿名端口监听,客户端就无法与之联系。

DatagramSocket中的receive方法,是阻塞方法,只有当接收到数据的时候,才会进行下面的代码,否则只会阻塞当前的进程。

一个简单的UDP客户端

客户端接收用户在控制台上的输入,然后调用DatagramSocket中的send方法,将数据传递出去。

UDP服务器

每当接收到一个数据报的时候,packet需要设置成最大的可能的值,否则当接收多个数据报以后,packet的值会变成已经接收到的最小的值。

一个在能够在控制台发送和接收的小程序:

发送数据:

packagedatagram.test;

importjava.net.*;

importjava.io.*;

publicclassDatagramSenderextendsThread{

publicDatagramSender(){

start();

}

publicvoidrun(){

DatagramSocketdSocket=null;

DatagramPacketdPacket=null;

BufferedReaderbr=null;

try{

dSocket=newDatagramSocket();

Br=new

BufferedReader(newInputStreamReader(System.in));

InetAddressia=InetAddress.getByName("localhost");

while(true){

System.out.println("我是Sender,请输入要发送的信息:");

Stringinfo=br.readLine();

byte[]b=info.getBytes("UTF-8");

dPacket=newDatagramPacket(b,b.length,ia,3000);

dSocket.send(dPacket);

if(info.equals("goodbye")){

System.out.println("我是Sender,我走了,真的");

break;

}

}

}catch(SocketExceptione){

e.printStackTrace();

}catch(IOExceptionioe){

ioe.printStackTrace();

}finally{

dPacket=null;

if(br!=null){

try{

br.close();

}catch(IOExceptione){

e.printStackTrace();

}

}

if(dSocket!=null){

dSocket.close();

}

}

}

publicstaticvoidmain(String[]args){

newDatagramSender();

}

}

接收数据:

packagedatagram.test;

importjava.io.*;

importjava.net.*;

publicclassDatagramReceiverextendsThread{

publicDatagramReceiver(){

start();

}

publicvoidrun(){

DatagramSocketdSocket=null;

DatagramPacketdPacket=null;

try{

dSocket=newDatagramSocket(3000);

bytebuf[]=newbyte[2048];

dPacket=newDatagramPacket(buf,buf.length);

System.out.println("我是Receiver,我已经准备好接收啦。");

while(true){

dSocket.receive(dPacket);//阻塞语句

byte[]b=dPacket.getData();

Stringinfo=newString(b,0,dPacket.getLength(),"UTF-8");

System.out.println("我是Receiver:"+info);

if(info.equals("goodbye")){

System.out.println("你跟我goodbye,我就跟你也goodbye");

break;

}

}

}catch(SocketExceptione){

e.printStackTrace();

}catch(IOExceptionioe){

ioe.printStackTrace();

}finally{

dPacket=null;

if(dSocket!=null){

dSocket.close();

}

}

}

publicstaticvoidmain(String[]args){

newDatagramReceiver();

}

}


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值