udp协议java代码 java基于udp的socket编程

JAVA问题UDP协议中的端口问题在Java中操纵UDP
使用位于JDK中Java.net包下的DatagramSocket和DatagramPacket类,可以非常方便地控制用户数据报文 。
在描述它们之前,必须了解位于同一个位置的InetAddress类 。InetAddress实现了Java.io. Serializable接口,不允许继承 。它用于描述和包装一个Internet IP地址,通过三个方法返回InetAddress实例:
getLocalhost():返回封装本地地址的实例 。
getAllByName(String host):返回封装Host地址的InetAddress实例数组 。
getByName(String host):返回一个封装Host地址的实例 。其中,Host可以是域名或者是一个合法的IP地址 。
DatagramSocket类用于创建接收和发送UDP的Socket实例 。和Socket类依赖SocketImpl类一样,DatagramSocket类的实现也依靠专门为它设计的DatagramScoketImplFactory类 。DatagramSocket类有3个构建器:
DatagramSocket():创建实例 。这是个比较特殊的用法,通常用于客户端编程,它并没有特定监听的端口,仅仅使用一个临时的 。
DatagramSocket(int port):创建实例 , 并固定监听Port端口的报文 。
DatagramSocket(int port, InetAddress localAddr):这是个非常有用的构建器,当一台机器拥有多于一个IP地址的时候,由它创建的实例仅仅接收来自LocalAddr的报文 。
值得注意的是,在创建DatagramSocket类实例时,如果端口已经被使用,会产生一个SocketException的异常抛出,并导致程序非法终止 , 这个异常应该注意捕获 。DatagramSocket类最主要的方法有4个:
Receive(DatagramPacket d):接收数据报文到d中 。receive方法产生一个“阻塞” 。
Send(DatagramPacket d):发送报文d到目的地 。
SetSoTimeout(int timeout):设置超时时间,单位为毫秒 。
Close():关闭DatagramSocket 。在应用程序退出的? 焙颍?ǔ;嶂鞫?头抛试矗?乇誗ocket,但是由于异常地退出可能造成资源无法回收 。所以 , 应该在程序完成时,主动使用此方法关闭Socket,或在捕获到异常抛出后关闭Socket 。
“阻塞”是一个专业名词 , 它会产生一个内部循环 , 使程序暂停在这个地方,直到一个条件触发 。
DatagramPacket类用于处理报文,它将Byte数组、目标地址、目标端口等数据包装成报文或者将报文拆卸成Byte数组 。应用程序在产生数据包是应该注意,TCP/IP规定数据报文大小最多包含65507个,通常主机接收548个字节,但大多数平台能够支持8192字节大小的报文 。DatagramPacket类的构建器共有4个:
DatagramPacket(byte[] buf, int length, InetAddress addr, int port):从Buf数组中,取出Length长的数据创建数据包对象,目标是Addr地址,Port端口 。
DatagramPacket(byte[] buf, int offset, int length, InetAddress address, int port):从Buf数组中,取出Offset开始的、Length长的数据创建数据包对象 , 目标是Addr地址 , Port端口 。
DatagramPacket(byte[] buf, int offset, int length):将数据包中从Offset开始、Length长的数据装进Buf数组 。
DatagramPacket(byte[] buf, int length):将数据包中Length长的数据装进Buf数组 。
DatagramPacket类最重要的方法就是getData()了,它从实例中取得报文的Byte数组编码 。
请教一个JAVA UDP程序问题 。我编了一个UDP通信程序,实现客户端向服务器端发送信息 。UDP是不需要实时连接的
这一观点是错误的 。你UDP数据包到达服务器主机后因为没有程序准备处理它从而丢失了,不存在服务器主机为你保存数据包这种情况 。
Java写的一个udp的demo用来计算探针传送过来的数据,怎么实现一个接口来调用这个数据Java UDP通信简单实现
1、Java实现方式
1)server端
/**
* UDPserver端
* */
public class UdpServer {
// 定义一些常量
private final intMAX_LENGTH = 1024; // 最大接收字节长度
private final intPORT_NUM= 5066;// port号
// 用以存放接收数据的字节数组
private byte[] receMsgs = new byte[MAX_LENGTH];
// 数据报套接字
private DatagramSocket datagramSocket;
// 用以接收数据报
private DatagramPacket datagramPacket;
public UdpServer(){
try {
/******* 接收数据流程**/
// 创建一个数据报套接字,并将其绑定到指定port上
datagramSocket = new DatagramSocket(PORT_NUM);
// DatagramPacket(byte buf[], int length),建立一个字节数组来接收UDP包
datagramPacket = new DatagramPacket(receMsgs, receMsgs.length);
// receive()来等待接收UDP数据报
datagramSocket.receive(datagramPacket);
/****** 解析数据报****/
String receStr = new String(datagramPacket.getData(), 0 , datagramPacket.getLength());
System.out.println("Server Rece:"receStr);
System.out.println("Server Port:"datagramPacket.getPort());
/***** 返回ACK消息数据报*/
// 组装数据报
byte[] buf = "I receive the message".getBytes();
DatagramPacket sendPacket = new DatagramPacket(buf, buf.length, datagramPacket.getAddress(), datagramPacket.getPort());
// 发送消息
datagramSocket.send(sendPacket);
【udp协议java代码 java基于udp的socket编程】} catch (SocketException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
} finally {
// 关闭socket
if (datagramSocket != null) {
datagramSocket.close();
}
}
}
}
2)client
/***
* UDPclientClient端
***/
public class UdpClient {
private String sendStr = "SendString";
private String netAddress = "127.0.0.1";
private final intPORT_NUM = 5066;
private DatagramSocket datagramSocket;
private DatagramPacket datagramPacket;
public UdpClient(){
try {
/*** 发送数据***/
// 初始化datagramSocket,注意与前面Server端实现的差别
datagramSocket = new DatagramSocket();
// 使用DatagramPacket(byte buf[], int length, InetAddress address, int port)函数组装发送UDP数据报
byte[] buf = sendStr.getBytes();
InetAddress address = InetAddress.getByName(netAddress);
datagramPacket = new DatagramPacket(buf, buf.length, address, PORT_NUM);
// 发送数据
datagramSocket.send(datagramPacket);
/*** 接收数据***/
byte[] receBuf = new byte[1024];
DatagramPacket recePacket = new DatagramPacket(receBuf, receBuf.length);
datagramSocket.receive(recePacket);
String receStr = new String(recePacket.getData(), 0 , recePacket.getLength());
System.out.println("Client Rece Ack:"receStr);
System.out.println(recePacket.getPort());

} catch (SocketException e) {
e.printStackTrace();
} catch (UnknownHostException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
} finally {
// 关闭socket
if(datagramSocket != null){
datagramSocket.close();
}
}
}
}
java udp协议 16进制转换这个问题产生的原因是因为编码不一致导致的udp协议java代码,如果数据包中包含中文udp协议java代码,建议使用UTF-8传输,只含有英文可以使用ISO-8859-1,您可以尝试getBytes("ISO-8859-1"),接收的时候也可以带上编码String info = new String(dp.getData(), 0, dp.getLength(),"ISO-8859-1"); getBytes()在不同系统之间得到的数据很有可能是不同的 。
关于udp协议java代码和java基于udp的socket编程的介绍到此就结束了,不知道你从中找到你需要的信息了吗 ?如果你还想了解更多这方面的信息,记得收藏关注本站 。

    推荐阅读