- 浏览: 338388 次
- 性别:
- 来自: 北京
文章分类
最新评论
-
右手边的你:
你确定你测试过batch是没问题的???
使用DbUtils进行数据库操作 -
电点mxn:
...
使用DbUtils进行数据库操作 -
sljackson:
顶
Spring事务管理 -
geyaandy:
...
Oracle行列互换 横表和纵表 -
weizou_china:
Request URL:http://localhost:80 ...
Spring mvc3的ajax
两个核心类DatagramPacket 数据包、DatagramSocket 数据包Socket
接收数据包的构造函数
public DatagramPacket(byte buf[], int length)
发送数据包的构造函数,比接收的多了发送目标地址
public DatagramPacket(byte buf[], int length, InetAddress address, int port)
两个核心方法 DatagramSocket类
public void send(DatagramPacket p) throws IOException
public synchronized void receive(DatagramPacket p) throws IOException
都是void的,发送和接受到的数据被包装到DatagramPacket中。
一些有用的应用程序
echo协议
基于TCP的echo客户端,可以发送一个消息,然后在同一个连接上等待响应。但是基于UDP的echo客户端不能保证发送的消息总能被收到。因此要异步地发送和接受数据。
你好,已经更新了
接收数据包的构造函数
public DatagramPacket(byte buf[], int length)
发送数据包的构造函数,比接收的多了发送目标地址
public DatagramPacket(byte buf[], int length, InetAddress address, int port)
两个核心方法 DatagramSocket类
public void send(DatagramPacket p) throws IOException
public synchronized void receive(DatagramPacket p) throws IOException
都是void的,发送和接受到的数据被包装到DatagramPacket中。
一些有用的应用程序
//简单UDP客户端,发送空数据到服务器,打印接收信息 public class SimpleUDPClient { private int bufferSize; private DatagramSocket socket; private DatagramPacket out; public SimpleUDPClient(InetAddress host, int port, int bufferSize, int timeout) throws SocketException { out = new DatagramPacket(new byte[1], 1, host, port); this.bufferSize = bufferSize; socket = new DatagramSocket(0); socket.connect(host, port); socket.setSoTimeout(timeout); } public SimpleUDPClient(InetAddress host, int port) throws SocketException { this(host, port, 8192, 300000); } public byte[] request() { DatagramPacket in; try { socket.send(out); in = new DatagramPacket(new byte[bufferSize], bufferSize); socket.receive(in); } catch (IOException e) { throw new RuntimeException(e); } return in.getData(); } public static void main(String[] args) { InetAddress host = null; int port = 0; try { port = Integer.parseInt(args[0]); host = InetAddress.getByName(args[1]); port = Integer.parseInt("13"); if (port < 1 || port > 65535) throw new Exception("端口号不对"); } catch (Exception e) { try { host = InetAddress.getByName("localhost"); port = 13; } catch (UnknownHostException e1) { } } try { SimpleUDPClient client = new SimpleUDPClient(host, port); byte[] response = client.request(); String result; try { result = new String(response, "ASCII"); } catch (UnsupportedEncodingException e) { result = new String(response, "8859_1"); } System.out.println(result); } catch (Exception e) { e.printStackTrace(); } } }
//可重用的UDPServer,继承类根据接收信息发送返回结果, //要实现public abstract void response(DatagramPacket request)方法 public abstract class BaseUDPServer extends Thread { private int bufferSize; protected DatagramSocket socket; public BaseUDPServer(int bufferSize, int port) throws SocketException { this.bufferSize = bufferSize; socket = new DatagramSocket(port); } public BaseUDPServer(int port) throws SocketException { this(8192, port); } public void run() { byte[] buf = new byte[bufferSize]; while (true) { DatagramPacket in = new DatagramPacket(buf, bufferSize); try { socket.receive(in); this.response(in); } catch (IOException e) { throw new RuntimeException(e); } } } public abstract void response(DatagramPacket request); } //继承BaseUDPServer的,实现了daytime协议的server public class DayTimeServer extends BaseUDPServer { private static final int DEFAULT_PORT = 13; public DayTimeServer() throws SocketException { super(DEFAULT_PORT); } public void response(DatagramPacket request) { try { String date = new Date() + "\r\n"; byte[] data = date.getBytes("ASCII"); DatagramPacket response = new DatagramPacket(data, data.length, request.getAddress(), request.getPort()); socket.send(response); } catch (UnsupportedEncodingException e) { throw new RuntimeException(e); } catch (IOException e) { throw new RuntimeException(e); } } public static void main(String[] args) { try { BaseUDPServer server = new DayTimeServer(); server.start(); } catch (SocketException e) { throw new RuntimeException(e); } } }
echo协议
基于TCP的echo客户端,可以发送一个消息,然后在同一个连接上等待响应。但是基于UDP的echo客户端不能保证发送的消息总能被收到。因此要异步地发送和接受数据。
public class UDPEchoServer extends UDPServer { public final static int DEFAULT_PORT = 7; public UDPEchoServer() throws SocketException { super(DEFAULT_PORT); } public void respond(DatagramPacket packet) { try { DatagramPacket outgoing = new DatagramPacket(packet.getData(), packet.getLength(), packet.getAddress(), packet.getPort()); socket.send(outgoing); } catch (IOException ex) { System.err.println(ex); } } public static void main(String[] args) { try { UDPServer server = new UDPEchoServer(); server.start(); } catch (SocketException ex) { System.err.println(ex); } } } public class UDPEchoClient { private static final int DEFAULT_PORT = 7; public static void main(String[] args) { String hostname = "localhost"; int port = DEFAULT_PORT; if (args.length > 0) { hostname = args[0]; } try { DatagramSocket socket = new DatagramSocket(); InetAddress address = InetAddress.getByName(hostname); socket.connect(address, port); SenderThread sender = new SenderThread(socket, address, DEFAULT_PORT); sender.start(); Thread receiver = new ReceiverThread(socket); receiver.start(); } catch (SocketException e) { throw new RuntimeException(e); } catch (UnknownHostException e) { throw new RuntimeException(e); } } } public class SenderThread extends Thread { private DatagramSocket socket; private InetAddress address; private int port; private boolean stopped = false; public SenderThread(DatagramSocket socket, InetAddress address, int port) { this.socket = socket; this.address = address; this.port = port; } public void halt() { this.stopped = true; } public void run() { Scanner sc = new Scanner(System.in); while (true) { if (stopped) return; String input = sc.nextLine(); if (input.equals(".")) break; byte[] in = input.getBytes(); DatagramPacket request = new DatagramPacket(in, in.length, address, port); try { socket.send(request); } catch (IOException e) { throw new RuntimeException(e); } Thread.yield(); } } } public class ReceiverThread extends Thread { private DatagramSocket socket; private boolean stopped = false; public void halt() { this.stopped = true; } public ReceiverThread(DatagramSocket socket) { this.socket = socket; } public void run() { byte[] buffer = new byte[65507]; while (true) { if (stopped) return; DatagramPacket dp = new DatagramPacket(buffer, buffer.length); try { socket.receive(dp); String s = new String(dp.getData(), 0, dp.getLength()); System.out.println(s); Thread.yield(); } catch (IOException ex) { System.err.println(ex); } } } } public abstract class UDPServer extends Thread { private int bufferSize; // in bytes protected DatagramSocket socket; public UDPServer(int port, int bufferSize) throws SocketException { this.bufferSize = bufferSize; this.socket = new DatagramSocket(port); } public UDPServer(int port) throws SocketException { this(port, 8192); } public void run() { byte[] buffer = new byte[bufferSize]; while (true) { DatagramPacket incoming = new DatagramPacket(buffer, buffer.length); try { socket.receive(incoming); this.respond(incoming); } catch (IOException ex) { System.err.println(ex); } } // end while } // end run public abstract void respond(DatagramPacket request); }
评论
2 楼
ace
2010-12-14
cuiran 写道
请教一下,您的UDPServer类是从哪来的?
你好,已经更新了
1 楼
cuiran
2010-12-08
请教一下,您的UDPServer类是从哪来的?
发表评论
-
Java网络编程URL和URI
2010-08-25 17:13 2823获得URL的方法 URI.toURL() File.toUR ... -
Java网络编程 非阻塞I/O
2010-07-16 17:53 2477对于CPU速度高于网络的 ... -
JAVA使用Socket编写HTTP服务器
2010-07-08 15:43 4448HTTP服务器核心就是Socket短连接 先简单说概念: 1 ... -
Java 新I/O
2010-07-06 21:23 1688Java新IO所使用的结构 更接近于操作系统执行I/O的方式: ... -
Java I/O系统
2010-07-01 23:21 1224编程语言的I/O类库,常使用流这个抽象概念,它代表任何有能力产 ... -
Java线程学习
2010-06-29 16:12 1328从线程中取得信息 轮询 主程序无限循环,从子线程取得返回值, ... -
中文FTP环境下,使用commons-net,FTPClient.listFiles()方法返回null的问题及解决办法
2010-06-28 16:42 13351项目中需要从FTP上下载数据,采用了开源的commons-ne ... -
Comparable和Comparator接口
2010-05-20 15:23 1502Java中有2个用于比较的接口,Comparable和Comp ... -
中序后缀表达式
2010-01-25 17:11 1604import java.io.BufferedReader; ... -
java异常链处理
2009-07-29 12:54 3491jdk1.4后的,所有异常根类Throwable部分代码 ... -
java正则表达式
2009-07-07 23:06 1548Scanner与正则表达式运用 import java.uti ...
相关推荐
Java UDP(用户数据报协议)收发结构体实例与Socket编程是网络通信中的重要主题,尤其是在需要高效、无连接的数据传输场景下。UDP是一种无连接的传输层协议,相较于TCP,它提供了更低的延迟和更高的吞吐量,但不保证...
Java UDP套接字网络编程是Java编程领域中的一个重要部分,主要涉及如何利用Java的Socket类库来实现基于用户数据报协议(User Datagram Protocol)的通信。UDP是一种无连接的、不可靠的传输协议,适用于对实时性要求...
在Java中,`DatagramSocket`类代表一个UDP套接字,用于发送和接收数据报。`DatagramPacket`类则用来封装要发送的数据和接收的数据报信息,包括数据、目标IP地址和端口号。 在`UDPServer.java`中,通常会创建一个`...
Java UDP(用户数据报协议)网络聊天程序是基于Socket编程实现的一种通信方式。UDP是一种无连接的、不可靠的传输层协议,相比TCP(传输控制协议),它在速度上更占优势,但不保证数据的顺序和完整性。下面将详细阐述...
`DatagramSocket`用于创建发送和接收UDP数据报的套接字,而`DatagramPacket`则用来封装要发送的数据以及接收的数据包。 2. **数据包封装与解封装**:在发送端,你需要将视频数据封装到`DatagramPacket`对象中,指定...
上述代码展示了基本的UDP数据收发流程,但实际应用中可能需要考虑更多的因素,如多线程处理接收,错误处理,数据的分包与重组等。为了提高程序的可读性和复用性,通常会将发送和接收功能封装到单独的类或方法中,并...
标签"java_socket_udp"和"socket_udp"进一步强调了这是关于Java实现的UDP套接字编程。在实际开发中,开发者可能会遇到如多线程、并发处理、错误处理、网络安全性以及性能优化等挑战。例如,为了提高服务的健壮性,...
Java中的TCP和UDP Socket通信是网络编程的基础,用于在不同设备之间建立可靠的数据传输通道。TCP(Transmission Control Protocol)提供的是面向连接、有序且无损的服务,而UDP(User Datagram Protocol)则是无连接...
Socket编程是Java中用于网络通信的核心技术,它涵盖了TCP(传输控制协议)和UDP(用户数据报协议)两种主要的互联网协议。TCP是一种面向连接的、可靠的、基于字节流的传输层通信协议,而UDP则是一种无连接的、不可靠...
Java UDP(用户数据报协议)是网络编程中的一个重要部分,尤其在需要低延迟、无连接通信的场景下。本文将详细讲解如何使用Java来实现一个UDP广播监听器,以接收并处理UDP广播数据。 首先,我们需要理解UDP的基本...
在Java编程语言中,Socket和UDP(User Datagram Protocol)是两个关键的概念,它们在构建网络通信应用程序时起着重要作用。本篇文章将详细讲解如何使用Java实现UDP协议的Socket客户端和服务器程序。 首先,UDP是一...
创建一个UDP Socket实例并不与远程主机建立连接,而是通过发送和接收`java.net.DatagramPacket`对象来完成通信。 2. **DatagramPacket**: `DatagramPacket`用于封装数据和目标/源IP地址及端口号信息。数据可以是...
在Java中,我们使用`java.net.DatagramSocket`类来创建一个UDP套接字,用于发送和接收数据报。`DatagramPacket`类用于封装我们要发送的数据和目标地址。以下是一个简单的UDP客户端示例: ```java import java.io....
在Java中,处理UDP数据传输主要涉及到两个核心类:`java.net.DatagramSocket` 和 `java.net.DatagramPacket`。 1. **DatagramSocket类**: `DatagramSocket` 类用于创建UDP套接字,它可以用来发送和接收数据报。...
Java Socket编程实现UDP网络测试是计算机网络领域中的一个重要实践,主要涉及到Java编程语言以及网络通信协议UDP(User Datagram Protocol)。Socket在计算机网络中扮演着桥梁的角色,它允许应用程序通过网络发送和...
本实验项目“tcp_udp_socket.zip”旨在帮助开发者理解如何使用Java实现TCP和UDP的Socket通信。以下将详细讲解这两个协议及其在Java中的实现。 首先,TCP(Transmission Control Protocol)是一种面向连接的、可靠的...
Java UDP调试工具是一种用于测试和调试UDP(User Datagram Protocol)网络通信的应用程序。UDP是一种无连接的传输协议,常用于需要高效传输且对数据完整性要求不高的场景,如在线视频流、实时游戏等。该工具通常包含...
标题“c与Java的UDP收发”指的是使用C语言和Java语言进行用户数据报协议(User Datagram Protocol, UDP)的通信。UDP是一种无连接的、不可靠的传输层协议,常用于实时应用,如音频、视频流传输,因为它提供快速的...
Java UDP套接字(UDP Sockets)是一种网络通信机制,用于在互联网上发送和接收数据报,这是一种无连接、不可靠的数据传输方式。在Java中,我们使用`java.net.DatagramSocket`类来实现UDP通信。这个压缩包包含的是...
- Java中的`java.net.DatagramSocket`类代表UDP套接字,用于发送和接收数据报包(`java.net.DatagramPacket`)。 - `DatagramSocket`创建后,可以通过`send(DatagramPacket)`发送数据,通过`receive...