java UDP 操作 (No.15)

 

java UDP 操作 

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

服务器和客户端的服务器

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

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

DatagramSocket 类的构造函数 

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

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

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

一个简单的UDP 客户端 

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

 UDP服务器

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

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

发送数据:

package datagram.test;

import java.net.*;

import java.io.*;

public class DatagramSender extends Thread {

public DatagramSender(){

start();

}

public void run(){

DatagramSocket dSocket = null;

DatagramPacket dPacket = null;

BufferedReader br = null;

try {

dSocket = new DatagramSocket();

Br = new 

          BufferedReader(new InputStreamReader(System.in));

InetAddress ia = InetAddress.getByName("localhost");

while(true){

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

String info = br.readLine();

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

dPacket = new DatagramPacket(b,b.length,ia,3000);

dSocket.send(dPacket);

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

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

break;

}

}

} catch (SocketException e) {

e.printStackTrace();

}catch(IOException ioe){

ioe.printStackTrace();

}finally{

dPacket = null;

if(br != null){

try {

br.close();

} catch (IOException e) {

e.printStackTrace();

}

}

if(dSocket != null){

dSocket.close();

}

}

}

public static void main(String[] args) {

new DatagramSender();

}

}

接收数据:

package datagram.test;

import java.io.*;

import java.net.*;

public class DatagramReceiver extends Thread {

public DatagramReceiver(){

start();

}

public void run(){

DatagramSocket dSocket = null;

DatagramPacket dPacket = null;

try{

dSocket = new DatagramSocket(3000);

byte buf[] = new byte[2048];

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

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

while(true){

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

byte[] b = dPacket.getData();

String info = new String(b, 0,dPacket.getLength(), "UTF-8");

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

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

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

break;

}

}

}catch (SocketException e) {

e.printStackTrace();

}catch(IOException ioe){

ioe.printStackTrace();

}finally{

dPacket = null;

if(dSocket != null){

dSocket.close();

}

}

}

public static void main(String[] args) {

new DatagramReceiver();

}

}


 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值