import java.io.IOException; import java.net.*; import java.util.Date; import java.util.LinkedList; import java.util.List; /** * User: yfzhangbin * Date: 13-7-23 * Time: 下午12:47 */ public class UDPServer { public static final int SERVER_PORT = 20202; private static final int BUFFER_SIZE = 1024; private static final List<InetSocketAddress> clientAddressList = new LinkedList<InetSocketAddress>(); static { clientAddressList.add(new InetSocketAddress("localhost", 9001)); clientAddressList.add(new InetSocketAddress("localhost", 9002)); clientAddressList.add(new InetSocketAddress("localhost", 9003)); } public static void main(String[] args) { System.out.println("服务器已经启动,监听端口:"+SERVER_PORT); try { DatagramSocket ds = new DatagramSocket(SERVER_PORT); while (true) { // 从客户端接收到的内容,即客户端的请求 DatagramPacket dp = new DatagramPacket(new byte[BUFFER_SIZE], BUFFER_SIZE); ds.receive(dp); String msg = new String(dp.getData(), 0, dp.getLength()); System.out.println("收到客户端消息:" + msg); if ("shutdown server".equals(msg)) { System.out.println("服务器已经被关闭!"); break; } sendToClients(msg, dp.getSocketAddress()); } ds.close(); } catch (SocketException e) { e.printStackTrace(); } catch (IOException e) { e.printStackTrace(); } } /** * 服务器端向客户端群发消息 * @param msg 消息 * @throws IOException */ private static void sendToClients(String msg, SocketAddress fromAddress) throws IOException { DatagramSocket ds = new DatagramSocket(); byte[] bytes = (msg+", 经服务器转发,服务器时间 "+new Date()).getBytes(); for (InetSocketAddress clientAddress : clientAddressList) { // todo 判断如果是发送者,可以跳过消息转发,根据ip地址判断 ds.send(new DatagramPacket(bytes, bytes.length, clientAddress)); } ds.close(); } }
import java.io.BufferedReader; import java.io.IOException; import java.io.InputStreamReader; import java.net.*; /** * User: yfzhangbin * Date: 13-7-23 * Time: 下午1:14 */ public class UDPClient { private static final int BUFFER_SIZE = 1024; private static final String SERVER_IP = "localhost"; // todo Change Run 为客户端的监听端口,取值9001,9002,9003 private static int clientListenPort = 9003; public static void main(String[] args) { new Thread(new ReceiveMsgThread(clientListenPort)).start(); try { BufferedReader br = new BufferedReader(new InputStreamReader(System.in)); while(true) { String msg = br.readLine(); if ("shutdown".equals(msg)) { System.out.println("客户端已退出!"); System.exit(-1); } sendToServer(msg); } } catch (IOException e) { e.printStackTrace(); } } /** * 客户端向服务端发送消息 * @param msg * @throws IOException */ private static void sendToServer(String msg) throws IOException { DatagramSocket ds = new DatagramSocket(); byte[] bytes = msg.getBytes(); ds.send(new DatagramPacket(bytes, bytes.length, new InetSocketAddress(SERVER_IP, UDPServer.SERVER_PORT))); ds.close(); } /** * 用来监听服务器端发送的信息 */ private static class ReceiveMsgThread implements Runnable { private int listenPort; private ReceiveMsgThread(int listenPort) { this.listenPort = listenPort; } @Override public void run() { System.out.println("客户端已经启动,监听端口:"+clientListenPort); try { DatagramSocket ds = new DatagramSocket(listenPort); while (true) { DatagramPacket recv = new DatagramPacket(new byte[BUFFER_SIZE], BUFFER_SIZE); ds.receive(recv); System.out.println("收到:" + new String(recv.getData(), 0, recv.getLength())); } } catch (SocketException e) { e.printStackTrace(); } catch (IOException e) { e.printStackTrace(); } } } }
相关推荐
【描述】:这个聊天系统基于UDP服务器,允许用户在同一个局域网内发送和接收消息。由于UDP的特性,该系统可能具有较低的延迟,使用户能够快速地交流。不过,因为UDP不保证数据的顺序和完整性,所以设计时需要考虑...
总的来说,这个模型展示了如何在Linux环境下使用C语言实现基于UDP的字符串交互,涵盖了网络编程的基本概念,如套接字创建、数据包收发,以及针对特定业务逻辑的字符串处理。同时,这也涉及到操作系统层面的进程管理...
### 基于UDP的聊天程序的实验报告 #### 一、需求分析 在本实验中,我们将深入了解基于**UDP协议**的网络编程技术,并尝试分析类似于QQ群聊的程序设计原理及其工作流程。我们的目的是设计并实现一个简易的基于UDP的...
【标题】"基于UDP的QQ客户端和服务器"指的是使用用户数据报协议(UDP)来构建一个简单的即时通讯系统,类似于腾讯QQ。UDP是一种无连接的、不可靠的传输层协议,它比TCP(传输控制协议)更为轻量级,适合于实时数据...
实现【压缩包子文件】"Udpsrv"可能是一个UDP服务器端的代码或可执行文件,它监听特定的端口,等待来自客户端的数据包,并将接收到的消息转发给其他连接的客户端。另一方面,"UdpClient"可能包含了客户端的代码或可...
服务器负责转发消息,而客户端则负责接收和发送消息。UDP的多播功能在此处发挥了作用,可以将消息一次性广播给多个接收者。 5. 数据包封装与解析:在UDP通信中,数据需要封装成UDP数据报进行发送,到达目的地后需要...
【基于UDP的群聊聊天室】是一个使用用户数据报协议(UDP)实现的多用户通信系统,它允许多个用户通过网络进行实时交流。在本文中,我们将深入探讨UDP协议、聊天室的设计原理以及如何实现一个基于UDP的命令行聊天室。...
UDP数据包转发器是基于UDP协议实现的一种工具,主要用于在局域网内或者互联网上转发数据包。这种转发器允许用户指定源IP和端口以及目标IP和端口,以实现在网络中的数据传输。 UDP协议的特点: 1. **无连接性**:与...
Indy的UDP组件为开发人员提供了方便的方式来创建基于UDP的应用程序,无论是作为服务器端还是客户端。 在"indy udp_udp 转发_xe10.2 indy udp"这个例子中,开发者使用Indy的UDPServer组件来建立一个服务器,该服务器...
【标题】:“基于UDP的网络聊天程序” 网络聊天程序是一种允许用户通过互联网进行实时通信的应用。在本项目中,我们关注的是基于用户数据报协议(UDP)实现的聊天程序。UDP是传输层的一个协议,与常用的TCP(传输...
这表明源代码可能分别实现了OPC客户端和UDP服务器的功能。VB_UDP_CLIENT可能包含实现OPC连接和数据请求的代码,以及将数据封装成UDP数据包的逻辑。VB_UDP_SERVER可能负责监听UDP端口,接收来自客户端的数据包,并...
实现一个基于UDP的聊天程序。具体功能: (1)能实现多客户端之间的群聊功能; (2)客户端的聊天记录可以存储在文件或数据库中; (3)客户端、服务器端均能显示在线用户列表; (4)客户可以查看以往聊天记录; ...
最后,提到了服务端和客户端,表明该系统包含两部分:服务器负责接收和转发消息,而客户端则用于用户交互和发送消息。 【标签】:“udp 聊天” 这两个标签突出了项目的两大核心概念。"udp"指的是协议基础,而"聊天...
这个组件提供了简单的接口,可以方便地与远程UDP服务器进行交互。 2. **监听客户端请求**:设置一个UDP端口来监听来自客户端的代理请求。这通常涉及到绑定到一个本地IP地址和端口,并开启接收数据的循环。 3. **...
在本文中,我们将深入探讨如何利用 Netty 4 构建基于 UDP(用户数据报协议)的数据接收服务,以及如何实现相应的发送服务。 首先,UDP 是一种无连接的传输层协议,它不保证数据的顺序或可靠性,但具有较低的开销,...
在本文中,我们将深入探讨如何使用Java基于UDP协议实现图片群发功能。UDP(用户数据报协议)是一种无连接的网络协议,它在通信过程中不建立连接,因此具有较高的效率,适合实时性要求高的应用场景。然而,由于其不...
【基于UDP的MFC五子棋】是一款使用Microsoft Foundation Class (MFC)库开发的桌面游戏,它利用User Datagram Protocol (UDP)进行网络通信,实现玩家间的远程对战功能。MFC是微软提供的一个C++类库,用于构建Windows...
服务器负责转发消息,确保每个消息都能到达目标客户端。在C#中,可以创建多个线程或使用Task并行处理来自不同客户端的请求。 三、实现消息发送与接收 1. 消息发送:客户端发送消息时,需要将目标客户端的IP和端口...
这种方式虽然简单可靠,但由于所有数据都需要经过服务器转发,可能会导致服务器负载过高以及通信延迟增加等问题。 ![中继站方式示意图](https://example.com/relay.png) **图1** 中继站方式示意图 ##### 4.2 反向...