java-----Socket编程之UDP

来源:互联网 发布:哨兵数据波段介绍 编辑:程序博客网 时间:2024/05/17 12:49



 * UDP:
 *  1,不需要建立连接,将数据及源和目的封装成数据包中。
 *  2,每个数据大小的限制在64k内
 *  3,因为无连接,是不可靠协议。
 *  4,不需要建立连接,速度快。
 *  
 *  TCP:
 *  1,需要建立连接,形成传输数据的通道。
 *  2,在连接中进行大量数据传输
 *  3,通过三次握手完成连接,是可靠协议。
 *  4,需要建立连接,速度比UDP慢
 *

UDP:

主要类:DatagramSocket       DatagramPacket

DatagramSocket 一个是插座 , DatagramPacket一个是包   将数据放入包中  然后通过插座 从 客户端 发送到服务端



举例发送一次:

 首先是发送端(客户端):


import java.net.*;import java.io.*;public class UDPClient{    public static void main(String[] args) throws Exception    {// 1,创建UDP服务,通过DatagramSocketDatagramSocket ds = new DatagramSocket();// 2,确定数据,并封装成数据包 DatagramSocket// (buf,buf.length,InetAddress.getByName("127.0.0.1"),10000);byte[] buf = "this is test".getBytes();DatagramPacket dp = new DatagramPacket(buf, buf.length,InetAddress.getByName("127.0.0.1"), 10000);// 3,通过socket服务,将已有的数据包发送出去,通过send方法ds.send(dp);// 4,关闭资源ds.close();    }}

然后是接收端(服务端)

import java.net.*;import java.io.*;public class UDPServer{    public static void main(String[] args) throws Exception    {// 1,创建udp socket,建立端点DatagramSocket ds = new DatagramSocket(10000);// 2,定义数据包,用于存储数据。byte[] buf = new byte[1024];DatagramPacket dp = new DatagramPacket(buf, buf.length);// 3,通过服务的receeive方法将接收到的数据存入数据包中。ds.receive(dp);// 3,通过服务的receeive方法将接收到的数据存入数据包中。int port;//获取端口System.out.println("ip:" + dp.getPort());//获取数据System.out.println("接收到了:"+ new String(dp.getData(), 0, dp.getLength()));// 关闭资源ds.close();    }}

*******************


下面使用循环的方式 以及 键盘输入的方式 达到 传输数据

是上面例子的增强:

发送端:


import java.net.*;import java.io.*;public class UDPClient{    public static void main(String[] args) throws Exception    {// 创建UDP服务,通过DatagramSocketDatagramSocket ds = new DatagramSocket();// 因为用到键盘 用到转换流BufferedReader bufr = new BufferedReader(new InputStreamReader(System.in));// 开始读取String line = null;while ((line = bufr.readLine()) != null){    // 如果输入886则退出客户端    if ("886".equals(line))    {break;    }    // 将数据转换成比特数组    byte[] buf = line.getBytes();    // 将数据打成包    DatagramPacket dp = new DatagramPacket(buf, buf.length,    InetAddress.getByName("127.0.0.1"), 10000);    // 通过socket服务,将已有的数据包发送出去,通过send方法    ds.send(dp);}ds.close();    }}

接收端:


import java.net.*;import java.io.*;public class UDPServer{    public static void main(String[] args) throws Exception    {// 1,创建udp socket,建立端点DatagramSocket ds = new DatagramSocket(10000);// 2,定义数据包,用于存储数据。byte[] buf = new byte[1024];DatagramPacket dp = new DatagramPacket(buf, buf.length);// 得到的数据String data = new String(dp.getData(), 0, dp.getLength());// 3,通过服务的receeive方法将接收到的数据存入数据包中// 循环接收。 while (true){  //接收数据    ds.receive(dp);      // 3,通过服务的receeive方法将接收到的数据存入数据包中。    System.out.println("ip:"    + new String(dp.getAddress().getHostAddress()));    System.out.println("接收到了:"    + new String(dp.getData(), 0, dp.getLength()));}    }}



**************************************************************************************************************************************************************************************



下面是综合性的: 

需求 :编写 一个聊天程序,有收数据的部分和发数据的部分,

这两部分需要同时执行。

那就需要用到多线程技术

一个线程控制收取,一个线程控制发送

因为收和发是不一致的,所以要定义两个runfangfa 

而且这两个方法要封装到不同的类中。


import java.net.*;import java.io.*;class UDPTest{    public static void main(String[] args) throws Exception    {DatagramSocket sendSocket = new DatagramSocket();DatagramSocket receSocket = new DatagramSocket(10001);new Thread(new Send(sendSocket)).start();new Thread(new Rece(receSocket)).start();    }}// 这是发送端 使用线程 继承了runnable接口 实现 run方法class Send implements Runnable{    private DatagramSocket ds;    public Send(DatagramSocket ds)    {this.ds = ds;    }    public void run()    {try{    // 下面就是通过键盘读数据然后封装到包中传送出去    BufferedReader bufr = new BufferedReader(new InputStreamReader(    System.in));    String line = null;    while ((line = bufr.readLine()) != null)    {if ("886".equals(line)){    break;}byte[] buf = line.getBytes();DatagramPacket dp = new DatagramPacket(buf, buf.length,InetAddress.getByName("127.0.0.1"), 10001);ds.send(dp);    }} catch (Exception e){    throw new RuntimeException("发送数据出现错误");}ds.close();    }}// 这是接收端 一样用线程 实现接口 重写run方法class Rece implements Runnable{    private DatagramSocket ds;    public Rece(DatagramSocket ds)    {this.ds = ds;    }    public void run()    {try{    while (true)    {byte[] buf = new byte[1024];DatagramPacket dp = new DatagramPacket(buf,buf.length);ds.receive(dp);String ip = new String(dp.getAddress().getHostAddress());String data = new String(dp.getData(),0,dp.getLength());System.out.println("ip:"+ip +"说::"+data);    }} catch (Exception ex){    throw new RuntimeException("接收数据时错误");}    }}




原创粉丝点击