java udp简单总结

udp优点与缺点:

 

udp是无连接协议,也就是说虽然客户端发送了数据,服务端能不能接到数据是不一定的,而且接收到的信息可能是无序的,而且可能是有差错的。数据报通常不能超过64k,很多基于udp以上的协议能够发送的数据会更少。udp实时性比较好。所以多用在视频、音频、如 qq。udp是可以广播发送或是单点发送的。

 

udp对应java的实现:

 

java.net 包中存放的主要是网络通信方面的类。udp协议的封装就在其中。为了测试光单向传输设备(该设备 是基于udp协议的)从网络中搜索了有关java udp的一点知识。

 

java实现udp主要是net包中的几个类。。

 

DatagramSocket: 数据包接受和发送的类。

 

DatagramPacket: 数据报类。

 

InetSocketAddress: 此类实现了IP套接字地址(IP+port)。可以通过这个类去查找主机。

 

DatagramChannel:针对面向数据报套接字的可选择通道。应该是可以加速传输的。

 

udp协议简单的通讯过程:

 

服务端 : 通过创建DatagramSocket实例socket,然后socket不断的监听某个端口12345,查看是否有数据发送过来,如果有就可以接受并处理,这里处理的数据就是DatagramPacket类所创建的实例。

 

客户端 : 通过封装一个要发送数据的DatagramPacket类,通过InetSocketAddress这个类可以找到接收数据的主机,

dataPacket = new DatagramPacket(sendDataByte, sendDataByte.length,new InetSocketAddress("127.0.0.1", PORT) ); 通过DatagramSocket类的实例对数据进行发送的操作。

 

以下是网络上搜索的程序:

 

服务端:


package test.server;

import java.net.DatagramPacket;
import java.net.DatagramSocket;

public class UDPServer {
    private static final int PORT = 12345;
    private DatagramSocket dataSocket = null;
    private DatagramPacket dataPacket = null;
   
    private byte[] receiveByte;
    private String receiveStr;
   
   
    public UDPServer() {
        Init();
    }

    public void Init() {
        try {
            dataSocket = new DatagramSocket(PORT);
            receiveByte = new byte[1024];
            dataPacket = new DatagramPacket(receiveByte, receiveByte.length);
            System.out.println("server start...");
            receiveStr = "";
            int i = 0;
            // 无数据,则循环
            while (i == 0){
                dataSocket.receive(dataPacket);
                i = dataPacket.getLength();
                // 接收数据

                if (i > 0) {
                    // 指定接收到数据的长度,可使接收数据正常显示,开始时很容易忽略这一点
                    receiveStr = new String(receiveByte, 0, dataPacket.getLength());
                    System.out.println(receiveStr);
                    i = 0;// 循环接收
                }
            }
        } catch (Exception e) {
            e.printStackTrace();
        }
    }

    public static void main(String args[]) {
        new UDPServer();
    }
   
}

客户端:

 

package test.client;

import java.io.IOException;
import java.net.DatagramPacket;
import java.net.DatagramSocket;
import java.net.InetSocketAddress;
import java.net.SocketException;

public class UDPClient {
    private static final int PORT = 12345;
    private DatagramSocket dataSocket;
    private DatagramPacket dataPacket;
    private byte sendDataByte[];
    private String sendStr;

    public UDPClient() {
        Init();
    }

    public void Init() {
        try {
            // 指定端口号,避免与其他应用程序发生冲突
            dataSocket = new DatagramSocket(8888);
            sendDataByte = new byte[1024];
            sendStr = "通过UDP发送数据!!!";
            sendDataByte = sendStr.getBytes();
            dataPacket = new DatagramPacket(sendDataByte, sendDataByte.length,new InetSocketAddress("127.0.0.1", PORT ));
            dataSocket.send(dataPacket);
        } catch (SocketException se) {
            se.printStackTrace();
        } catch (IOException ie) {
            ie.printStackTrace();
        }
    }

    public static void main(String args[]) {
        new UDPClient();
    }
}

 

==================================================

 

在测试光单向设备时,需要绑定ip和mac,这样才能接受到数据包。

 

命令:arp -s [ip] [mac]

 

===================================================

 

一个有关java socket 的简单教程:

 

http://wenku.baidu.com/view/d540613231126edb6f1a104d.html

 

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值