`

基于udp的服务器消息转发

    博客分类:
  • java
udp 
阅读更多
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();
            }
        }
    }

}

 

  • net.rar (2.1 KB)
  • 下载次数: 22
分享到:
评论

相关推荐

    基于UDP聊天系统.rar_UDP服务器_udp 聊天_udp聊天_基于udp聊天

    【描述】:这个聊天系统基于UDP服务器,允许用户在同一个局域网内发送和接收消息。由于UDP的特性,该系统可能具有较低的延迟,使用户能够快速地交流。不过,因为UDP不保证数据的顺序和完整性,所以设计时需要考虑...

    UDP协议客户-服务端字符串转发模型

    总的来说,这个模型展示了如何在Linux环境下使用C语言实现基于UDP的字符串交互,涵盖了网络编程的基本概念,如套接字创建、数据包收发,以及针对特定业务逻辑的字符串处理。同时,这也涉及到操作系统层面的进程管理...

    基于UDP的聊天程序的实验报告

    ### 基于UDP的聊天程序的实验报告 #### 一、需求分析 在本实验中,我们将深入了解基于**UDP协议**的网络编程技术,并尝试分析类似于QQ群聊的程序设计原理及其工作流程。我们的目的是设计并实现一个简易的基于UDP的...

    基于UDP的QQ客户端和服务器

    【标题】"基于UDP的QQ客户端和服务器"指的是使用用户数据报协议(UDP)来构建一个简单的即时通讯系统,类似于腾讯QQ。UDP是一种无连接的、不可靠的传输层协议,它比TCP(传输控制协议)更为轻量级,适合于实时数据...

    基于UDP的聊天程序

    实现【压缩包子文件】"Udpsrv"可能是一个UDP服务器端的代码或可执行文件,它监听特定的端口,等待来自客户端的数据包,并将接收到的消息转发给其他连接的客户端。另一方面,"UdpClient"可能包含了客户端的代码或可...

    基于UDP的多人聊天

    服务器负责转发消息,而客户端则负责接收和发送消息。UDP的多播功能在此处发挥了作用,可以将消息一次性广播给多个接收者。 5. 数据包封装与解析:在UDP通信中,数据需要封装成UDP数据报进行发送,到达目的地后需要...

    基于UDP的群聊聊天室

    【基于UDP的群聊聊天室】是一个使用用户数据报协议(UDP)实现的多用户通信系统,它允许多个用户通过网络进行实时交流。在本文中,我们将深入探讨UDP协议、聊天室的设计原理以及如何实现一个基于UDP的命令行聊天室。...

    udp数据包转发器-UDP协议

    UDP数据包转发器是基于UDP协议实现的一种工具,主要用于在局域网内或者互联网上转发数据包。这种转发器允许用户指定源IP和端口以及目标IP和端口,以实现在网络中的数据传输。 UDP协议的特点: 1. **无连接性**:与...

    UDP.rar_indy udp_udp 转发_xe10.2 indy udp

    Indy的UDP组件为开发人员提供了方便的方式来创建基于UDP的应用程序,无论是作为服务器端还是客户端。 在"indy udp_udp 转发_xe10.2 indy udp"这个例子中,开发者使用Indy的UDPServer组件来建立一个服务器,该服务器...

    基于UDP的网络聊天程序

    【标题】:“基于UDP的网络聊天程序” 网络聊天程序是一种允许用户通过互联网进行实时通信的应用。在本项目中,我们关注的是基于用户数据报协议(UDP)实现的聊天程序。UDP是传输层的一个协议,与常用的TCP(传输...

    基于OPC客户端和UDP通讯协议的无连接数据转发软件.rar

    这表明源代码可能分别实现了OPC客户端和UDP服务器的功能。VB_UDP_CLIENT可能包含实现OPC连接和数据请求的代码,以及将数据封装成UDP数据包的逻辑。VB_UDP_SERVER可能负责监听UDP端口,接收来自客户端的数据包,并...

    基于UDP的聊天程序 Java实现

    实现一个基于UDP的聊天程序。具体功能: (1)能实现多客户端之间的群聊功能; (2)客户端的聊天记录可以存储在文件或数据库中; (3)客户端、服务器端均能显示在线用户列表; (4)客户可以查看以往聊天记录; ...

    基于UDP局域网聊天软件的设计与实现

    最后,提到了服务端和客户端,表明该系统包含两部分:服务器负责接收和转发消息,而客户端则用于用户交互和发送消息。 【标签】:“udp 聊天” 这两个标签突出了项目的两大核心概念。"udp"指的是协议基础,而"聊天...

    基于UDP的网络代理

    这个组件提供了简单的接口,可以方便地与远程UDP服务器进行交互。 2. **监听客户端请求**:设置一个UDP端口来监听来自客户端的代理请求。这通常涉及到绑定到一个本地IP地址和端口,并开启接收数据的循环。 3. **...

    基于netty4 的udp字节数据接收服务

    在本文中,我们将深入探讨如何利用 Netty 4 构建基于 UDP(用户数据报协议)的数据接收服务,以及如何实现相应的发送服务。 首先,UDP 是一种无连接的传输层协议,它不保证数据的顺序或可靠性,但具有较低的开销,...

    java基于UDP实现图片群发功能

    在本文中,我们将深入探讨如何使用Java基于UDP协议实现图片群发功能。UDP(用户数据报协议)是一种无连接的网络协议,它在通信过程中不建立连接,因此具有较高的效率,适合实时性要求高的应用场景。然而,由于其不...

    基于UDP的MFC五子棋

    【基于UDP的MFC五子棋】是一款使用Microsoft Foundation Class (MFC)库开发的桌面游戏,它利用User Datagram Protocol (UDP)进行网络通信,实现玩家间的远程对战功能。MFC是微软提供的一个C++类库,用于构建Windows...

    MyQQ.rar_CSharp udp_UDP CSharp _udp 发送消息_udp通讯

    服务器负责转发消息,确保每个消息都能到达目标客户端。在C#中,可以创建多个线程或使用Task并行处理来自不同客户端的请求。 三、实现消息发送与接收 1. 消息发送:客户端发送消息时,需要将目标客户端的IP和端口...

    基于UDP协议P2P通信技术的分析及实现

    这种方式虽然简单可靠,但由于所有数据都需要经过服务器转发,可能会导致服务器负载过高以及通信延迟增加等问题。 ![中继站方式示意图](https://example.com/relay.png) **图1** 中继站方式示意图 ##### 4.2 反向...

Global site tag (gtag.js) - Google Analytics