您的位置:首页 > 职场人生

黑马程序员:udpsocket介绍:DatagramSocket、DatagramPacket

2013-11-15 15:10 555 查看
----------------------
ASP.Net+Android+IOS开发、.Net培训、期待与您交流! ----------------------

Socket

Socket就是为网络服务提供的一种机制

通信的两端都是Socket

网络通信其实就是Socket间的通信

数据在两个Socket间通过IO传输

DatagramSocket 类 建立udpsocket服务

DatagramPacket 类 定义数据包

方法:

InetAddress getAddress()

DatagramPacket(byte[] buf, int length, InetAddress address, int port)

构造数据报包,用来将长度为 length 的包发送到指定主机上的指定端口号。

示例:

byte[] buf = "abc".getBytes();

DatagramPacket dp = DatagramPacket(buf,buf.length,InetAddress.getByName("192.168.1.1"),10000);

若地址为192.168.1.255 这会在这个局域网中发广播,只要有客户端监听这10000端口号就能收到发出广播的信息

DatagramPacket(byte[] buf, int length)

构造 DatagramPacket,用来接收长度为 length 的数据包。

DatagramSocket方法:

发送方法 void send(DatagramPacket p)

接收方法 void receive(DatagramPacket p) 此方法是阻塞式

需求:通过UDP传输方式,将一段文字数据发送出去。

思路:

1,建立updsocket服务

2,提供数据,并将数据封装到数据包中

3,通过socket服务的发送功能,将数据包发出去。

4,关闭资源

代码演示:

class UdpSent
{
public static void main(String[] args) throws Exception
{
DatagramSocket ds = new DatagramSocket(8888); //指定端口8888,可以不写
byte[] buf = "i am data".getBytes();
DatagramPacket dp = new DatagramPacket(buf,buf.length,InetAddress.getByName("192.168.2.100"),10000);//把buf中的数据发送到IP为192.168.2.100主机的10000端口号上去
ds.send(dp);
ds.close();
}
}


需求:

定义一个应用程序,用于接收UDP协议传输的数据并处理

UDP协议接收端

思路:

1.定义udpsocket服务

2.定义一个数据包,用于存储接收到的数据包,并通过数据包对象对其进行操作

3.通过socket服务的receive方法将接收到的数据存入到已定义好的数据包中

4.通过数据包对象的特有功能,将这写不同的数据取出,并打印在控制台上。

5.关闭资源

代码演示:

class UdpReceive
{
public static void main(String[] args) throws Exception
{
DatagramSocket ds = new DatagramSocket(10000); //接收端的端口为10000,当发送端发送到该主机且端口是10000的时候这个程序就会接收
//UDP的一个数据包最大为64K字节,若byte[]为1024,而数据包超过1024的时,超过部分会被截断
byte[] buf = new byte[1024*64];
DatagramPacket dp = new DatagramPacket(buf,buf.length);
ds.reveice(dp);
//获取发送端IP
String ip = dp.getAddress().getHostAddress();
//获取接收到的数据
String data = new String(dp.getData(),0,dp.getLength()); //getData()返回的是byte[],取数组中接收到的数据转换为字符串,dp.getLength()为接收到数据的长度
//获取端口号
int port = dp.getPort();
System.out.println(ip+"~~"+data+"~~"+port);
ds.close();
}
}


练习:

通过多线程、键盘录入、Socket建立一个Chat程序

/*
* 练习:
* 通过多线程、键盘录入、Socket建立一个Chat程序
* 思路:
* 1.通一个进程中同时需要发送和接收信息,所以需要用到多线程
* 2.一个线程负责发送信息,一个线程负责接收信息
*/
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.net.DatagramPacket;
import java.net.DatagramSocket;
import java.net.InetAddress;
import java.net.SocketException;
public class UdpChat {

public static void main(String[] args) {
// TODO Auto-generated method stub
try
{
//DatagramSocket send = new DatagramSocket();
DatagramSocket receive = new DatagramSocket(10002);
new Thread(new Send(receive)).start();
new Thread(new Receive(receive)).start();
}
catch (SocketException se)
{
throw new RuntimeException("建立数据包套接字失败");
}

}

}

//TODO Send
class Send implements Runnable
{
private DatagramSocket ds;
Send(DatagramSocket ds)
{
this.ds = ds;
}
public void run()
{
try
{
BufferedReader bfr = new BufferedReader(new InputStreamReader(System.in));
String line = null;
while ((line=bfr.readLine())!=null)
{
if(line.equals("over"))
break;
byte[] buf = line.getBytes();
DatagramPacket dp = new DatagramPacket(buf,buf.length,
InetAddress.getByName("192.168.2.100"),10001);
ds.send(dp);
//System.out.println(line.toUpperCase());
}
bfr.close();
ds.close();
}
catch (IOException e)
{
throw new RuntimeException("发送失败");
}
}
}

//TODO RECEIVE
class Receive implements Runnable
{
private DatagramSocket ds;
Receive(DatagramSocket ds)
{
this.ds = ds;
}
public void run()
{
try
{
while(true)
{
//System.out.println("jieshou");
byte[] buf = new byte[1024];
DatagramPacket dp = new DatagramPacket(buf,buf.length);
ds.receive(dp);
String ip = dp.getAddress().getHostAddress();
int port = dp.getPort();
String data = new String(dp.getData(),0,dp.getLength());
System.out.println(ip+"-"+port+"土豆:"+data);
}
}
catch(IOException e)
{
throw new RuntimeException("接收失败");
}

}
}


----------------------
ASP.Net+Android+IOS开发、.Net培训、期待与您交流! ----------------------详细请查看:http://edu.csdn.net
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: 
相关文章推荐