---------------------- <a href="http://edu.csdn.net"target="blank">ASP.Net+Android+IOS开发</a>、<a href="http://edu.csdn.net"target="blank">.Net培训</a>、期待与您交流! ----------------------
网络编程UDP:
一、UDP服务器端的设计:
定义UDP的接收端
思路:
1、定义UdpSocket服务
2、定义一个数据包,因为要存储接收到的字节数据
因为数据包对象中有更多功能可以提取字节数据中的不同数据信息
3、通过Socket服务的receive方法将收到的字节数据存入已定义好的数据包中
4、通过数据包对象的特有功能,将这些不同的数据取出,打印在控制台上
5、关闭资源
定义一个应用程序,用于接收UDP协议传输的数据并处理
publicclass UdpReceive {
publicstaticvoid main(String[] args) throws Exception
{
//1、建立UDP服务,并指定监听端口
DatagramSocket ds = new DatagramSocket(9999);
while(true)//循环接收数据
{
//2、定义一个用来存储字节数据的数据包
byte[] buf = newbyte[1024];
DatagramPacket dp = new DatagramPacket(buf, buf.length);
//3、将接收到的数据存入定义好的数据包中
ds.receive(dp);
//4、通过数据包对象的功能获得数据包中的数据信息
String ip = dp.getAddress().getHostAddress().toString();
String mes = new String(dp.getData(),0,dp.getLength());
int port = dp.getPort();
System.out.println(ip+"::"+mes+"::"+port);
}
//5、关闭资源
//ds.close();
}
}
二、UDP 发送端的设计
思路:
1、建立UDPSocket服务
2、提供数据,并将数据封装到数据包中
3、通过Socket服务的发送功能,将数据包发送出去
4、关闭资源
通过UDP 传输方法将一段文字数据发送出去
publicclass UdpSend {
publicstaticvoid main(String[] args) throws IOException
{
//1、创建UDP服务,通过DatagramSocket对象
DatagramSocket ds = new DatagramSocket();
//2、确定数据,并封装成数据包
byte[] buf = "lsk is coming!".getBytes();
DatagramPacket dp = new DatagramPacket(buf, buf.length, InetAddress.getByName("10.36.115.33"),8090);
//3、通过Socket服务,将封装好的数据包发送出去,通过send()方法
ds.send(dp);
//4、关闭资源
ds.close();
}
}
三、UDP应用多线程实现同一界面消息的发送和接受
编写一个聊天程序
有收数据的部分和发数据的部分
这两部分需要同时执行
那就需要用到多线程技术
一个线程控制收,一个线程控制发
因为收和发动作是不一致的,所以要定义两个run方法
首先,接收线程如下:
class Receive implements Runnable
{
//定义UDP服务
private DatagramSocket ds;
public Receive(DatagramSocket ds)
{
this.ds = ds;
}
//实现run()方法
publicvoid run()
{
try
{
while(true)
{
//定义一个字节数组用于存放接收数据
byte[] buf = newbyte[1024];
//将接收的数据封装数据包
DatagramPacket dp = new DatagramPacket(buf,buf.length);
//接收数据
ds.receive(dp);
//输出接收的数据信息
String ip = dp.getAddress().getHostAddress();
String data = new String(dp.getData(),0,dp.getLength());
System.out.println(ip+":"+data);
}
}
catch(Exception e)
{
System.out.println("Receive failed!");
}
}
}
其次,定义UDP的发送线程
class Send implements Runnable
{
//定义UDP 服务
private DatagramSocket ds;
public Send(DatagramSocket ds)
{
this.ds = ds;
}
publicvoid run()
{
try
{
//定义字符输出缓冲流用来输入数据
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
String line = null;
//循环发送数据
while((line=br.readLine())!=null)
{
//如果发送的数据是88就结束
if(line.equals("88"))
break;
//将输入的数据转换成字节数据
byte[] buf = line.getBytes();
//将数据封包发送到指定IP的指定端口
DatagramPacket dp = new DatagramPacket(buf,buf.length,InetAddress.getByName("192.168.137.165"),10005);
ds.send(dp);
}
}
catch(Exception e)
{
System.out.println("Send failed!");
}
}
}
最后,在主函数中调用这两个线程
publicclass ChatDemo {
publicstaticvoid main(String[] args) throws SocketException
{
//创建发送服务
DatagramSocket sds = new DatagramSocket();
//创建接收服务并指定端口
DatagramSocket rds = new DatagramSocket(10005);
//调用线程
new Thread(new Send(sds)).start();
new Thread(new Receive(rds)).start();
}
}
---------------------- <a href="http://edu.csdn.net"target="blank">ASP.Net+Android+IOS开发</a>、<a href="http://edu.csdn.net"target="blank">.Net培训</a>、期待与您交流! ----------------------