DatagramSocket 类
要收发DatagramPacket必须打开一个数据报socket ,当服务器构造DatagramSocket时。
1.1服务器和客户端的服务器
两者使用的socket都是一样的,区别仅仅在于 服务器端的端口是已知端口,而客户端的端口是系统分配的。
TCP端口和UDP端口之间没有关联,所以两者可以共同绑定在同一个端口上,而不会有相互影响。
1.2 DatagramSocket 类的构造函数
DatagramSocket创建一个在指定端口监听的入站数据报的 socket ,使用此构造函数可以编写出在指导的端口监听的服务器。
如果服务器在匿名端口监听,客户端就无法与之联系。
DatagramSocket中的receive 方法,是阻塞方法,只有当接收到数据的时候,才会进行下面的代码,否则只会阻塞当前的进程。
一个简单的UDP客户端
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;
import java.net.UnknownHostException;
public class UDPDiscardClient extends Thread {
public final static int DEFAULT_PORT = 3000;
public UDPDiscardClient() {
start();
}
public void run() {
String hostname = "localhost";
int port = DEFAULT_PORT;
try {
InetAddress server = InetAddress.getByName(hostname);
BufferedReader userInput = new BufferedReader(
new InputStreamReader(System.in));
DatagramSocket theSocket = new DatagramSocket();
while (true) {
String theLine = userInput.readLine();
if (theLine.equals("."))
break;
byte[] data = theLine.getBytes("UTF-8");
DatagramPacket theOutput = new DatagramPacket(data,
data.length, server, port);
theSocket.send(theOutput);
}
} catch (UnknownHostException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (SocketException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
public static void main(String[] args) {
new UDPDiscardClient();
}
}
|
1.4 UDP服务器
每当接收到一个数据报的时候,packet需要设置成最大的可能的值,否则当接收多个数据报以后,packet的值会变成已经接收到的最小的值。
import java.io.IOException;
import java.net.DatagramPacket;
import java.net.DatagramSocket;
import java.net.SocketException;
public class UDPDiscardServer extends Thread {
public final static int DEFAULT_PORT = 3000;
public final static int MAX_PACKET_SIZE = 65507;
public UDPDiscardServer() {
start();
}
public void run() {
serverWork();
}
public void serverWork() {
int port = DEFAULT_PORT;
byte[] buffer = new byte[MAX_PACKET_SIZE];
// port = Integer.parseInt(args[0]);
try {
DatagramSocket server = new DatagramSocket(port);
DatagramPacket packet = new DatagramPacket(buffer, buffer.length);
while (true) {
server.receive(packet);
String s = new String(packet.getData(), 0, packet.getLength(),
"UTF-8");
System.out.println("我是服务器:" + packet.getAddress() + "at port "
+ packet.getPort() + "says" + s);
/**//* 必须重新设置 */
packet.setLength(buffer.length);
}
} catch (SocketException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
public static void main(String[] args) {
new UDPDiscardServer();
}
}
|
2感想
利用UDP协议来收发数据,都是将数据放在DatagramPacket 中,而TCP协议都是放在流中,通过getInputStream 和 getOutputStream 函数来获得流。
在服务器端UDP需要调用含有端口参数的DatagramSocket 构造函数, 在客户端设置DatagramSocket时,调用匿名端口构造函数。
然后在构造DatagramPacket 构造函数的时候,发送端需要制定发送主机的主机名 和 端口 。
分享到:
相关推荐
java实现udp的发送信息和接受信息,看对应的”操作说明.doc
Java+UDP+数据解码+UDP数据发送+源代码,实现实时接收数据并显示在前端界面,读取本地文件,对文件进行操作。适合初学者对Java的UDP通信还不是特别的熟悉的Java开发者,详细的呈现出对数据处理和怎么样把后端数据...
Java+UDP+数据解码+UDP数据发送+源代码,实现实时接收数据并显示在前端界面,读取本地文件,对文件进行操作。适合初学者对Java的UDP通信还不是特别的熟悉的Java开发者,详细的呈现出对数据处理和怎么样把后端数据...
利用Java语言基于UDP协议建立的多播广播组通信,可以实现一个服务器向多个客户端实时发送信息,基于GUI界面设计,可视化操作。
主要介绍了java UDP通信客户端与服务器端,结合实例形式分析了java基于UDP通信的客户端与服务器端具体实现技巧及相关操作注意事项,需要的朋友可以参考下
Java Socket Udp协议实时在线云消费机服务器端开发示例,本示例展示了Java监听UDP通讯端口,向端口发送信息,只需在本示例上加上数据库的增、删、查、改等操作就可快速完成实时一卡通消费系统。
项目操作方法有详细注释说明 项目为maven工程配置的memcached所需jar包。 工具类中包含memcached所有操作方法实例及memcached日志操作日志记录。
基于MINA架构实现的UDP接收服务器,支持对mysql数据库的连接池插入查找操作。数据接收采用MINA,处理使用线程池并结合数据库连接池实现对发送数据的储存。
基于JAVA的UDP服务器模型源代码,内含UDP服务器端模型和UDP客户端模型两个小程序,向JAVA初学者演示UDP C/S结构的原理。 简单聊天软件CS模式 2个目标文件 一个简单的CS模式的聊天软件,用socket实现,比较简单。 ...
包括Java编程常用知识、Java文件编程、Java文件I/O编程、Java TCP编程、Java UDP编程、Java Swing编程、JDBC编程,最后还给出了一个聊天程序实例和一个数据表操作窗口实例,将Swing、UDP、Java集合类、线程同步、...
包括Java编程常用知识、Java文件编程、Java文件I/O编程、Java TCP编程、Java UDP编程、Java Swing编程、JDBC编程,最后还给出了一个聊天程序实例和一个数据表操作窗口实例,将Swing、UDP、Java集合类、线程同步、...
主要介绍了Java实现UDP通信过程,结合实例形式分析了java实现UDP服务器端与客户端相关操作技巧与注意事项,需要的朋友可以参考下
java 实现内网穿透,udp 打洞,NAT 穿透原理 1,客户端A登陆的时候,发送一个UDP数据包给服务器,然后服务器根据该包获得客户端A的IP和端口并保存到UdpAddressMap(用登录名作为key保存)中。 2,客户端A执行操作的...
使用java的UPD实现了一个简单的服务器和客户端操作 即在自己电脑上 客户端发送消息给服务器,服务器将处理完的消息重新返回给客户端
语言:java jdk1.8 最低支持:Android4.1以上 1.2 测试环境 实测: 红米4(android 6.0.1) 红米Note5A(android 7.1.2) 测试完美运行。 实现了两台Android设备在同一局域网内通过UDP进行实时的聊天通信。实测支持...
基于JAVA的UDP服务器模型源代码,内含UDP服务器端模型和UDP客户端模型两个小程序,向JAVA初学者演示UDP C/S结构的原理。 简单聊天软件CS模式 2个目标文件 一个简单的CS模式的聊天软件,用socket实现,比较简单。 ...
基于JAVA的UDP服务器模型源代码,内含UDP服务器端模型和UDP客户端模型两个小程序,向JAVA初学者演示UDP C/S结构的原理。 简单聊天软件CS模式 2个目标文件 一个简单的CS模式的聊天软件,用socket实现,比较简单。 ...
基于JAVA的UDP服务器模型源代码,内含UDP服务器端模型和UDP客户端模型两个小程序,向JAVA初学者演示UDP C/S结构的原理。 简单聊天软件CS模式 2个目标文件 一个简单的CS模式的聊天软件,用socket实现,比较简单。 ...
udp syslog发包工具,支持多种数据类型。大家可以根据自己的需要进行配置。操作简单。一看便会。
基于JAVA的UDP服务器模型源代码,内含UDP服务器端模型和UDP客户端模型两个小程序,向JAVA初学者演示UDP C/S结构的原理。 简单聊天软件CS模式 2个目标文件 一个简单的CS模式的聊天软件,用socket实现,比较简单。 ...