`

基于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协议的聊天程序

    java环境下的基于UDP协议的聊天程序,udp协议聊天程序 具体功能: 1、实现多客户端之间的群聊功能; 2、客户端、服务器端均能显示在线用户列表; 3、服务器负责转发聊天消息;

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

    linux下运行客户端 和服务端后,在服务端可以设置字符串转化模式,根据相应模式将客户端发来的字符串进行转化,并转发回客户端。

    基于UDP的聊天程序 Java实现

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

    基于UDP的网络聊天工具

    使用UPD通信,支持广播和单播,服务器进行数据的转发,支持多线程

    C#实现UDP简单聊天室功能(winform版)

    开发工具使用的是VS2017,基于UDP协议实现的一个简单聊天室功能,包括客户端和服务器端,首先运行服务器端,接着调试-&gt;启动新实例开启多个客户端,每开启一个客户端,服务器端会显示XXX连接等提示。客户端发送消息给...

    C++实现基于云服务器多人聊天室项目源码,GUI界面实现客户端的登录与注册功能+聊天室功能

    服务器:多线程处理通信数据,基于TCP协议转发聊天数据流,基于UDP协议收发注册登录数据包。 客户端:登录注册基于UDP协议实现与服务器的数据通信,聊天室基于TCP协议实现连接与信息收发。 安装教程 云服务器端...

    C++实现Socket传输json(UDP形式)

    服务端发送给客户端,服务端有一串字符串,按照分隔符将其分割,并存入json,发给客户端,然后输出。

    rtsp转发服务器demo

    0积分福利!rtsp转发服务器,基于epoll的ET模式,支持H264,H265,支持TCP和UDP,此文件为个人所写的测试demo,仅作为参考使用。

    快速UDP互联网连接协议QUIC.zip

    QUIC (Quick UDP Internet Connections)是 chromium 的一个项目,这是一个体验的协议,旨在降低基于 TCP 通讯的 Web 延迟。QUIC 非常类似 TCP TLS SPDY ,但是基于 UDP 实现的。因为 TCP 是由操作系统内核或者是 ...

    qt qq 类似qq 客户端 服务器 华清远见

    在目前的程序设计下客户端已经能够获取peer端的ip,只要指定双方通信的端口号即可实现,基于udp的聊天. 2.实现用户与用户之间的文件传输,目前拟定采用tcp通信,确保文件传输的可靠性. ///////////////////////版权...

    linux下组播聊天室的服务器转发实现 C语言

    在linux下实现UDP组播聊天室,是聊天室的服务器端,作用是存储与转发

    TCP和UDP连接测试程序

    公司项目有时要测试TCP/UDP连接测试的服务,为了方便外网(一台有固定域名和ip的WEB服务器)连接本地服务器——客户端在web服务器,服务端在本地(通过路由转发到指定端口),写了此版基于Struts1.2 的Socket(套接字...

    nodejs-httpp:使用Node.js在UDP上运行HTTP

    nodejs-httpp-在基于UDP的传输上运行...利用多核CPU支持高性能多进程/多线程UDP服务器 可配置的拥塞控制 每插槽网络性能监视器 透明地扩展客户端/中央服务器样式的Web服务 易于使用的API,可重用现有的http / web和node

    基于Linux的TCP多人聊天室

    服务器:采用多线程以及线程锁处理客户端的所有请求以及信息转发任务。服务端实时显示客户的登录与登出信息;保存客户上传的共享文件(网盘功能);保存客户的账号密码信息,记录在线用户。 客户端:打开时可选择...

    J2ME基于TCP/UDP的多客户端聊天

    再运行多个客户端,客户端可以设置自己的昵称,服务器不参与聊天,只用于转发客户端的信息,相当于群聊。代码比较简单,运行之后界面也比较简洁,可以在此基础上添加功能。可以修改代码中的IP地址为本机的IP地址,...

    netproxy:一个简单的基于.NETCore的,跨平台的,支持ipv6的TCPUDP代理

    网络代理Netproxy是基于.NET Core的简单ipv6 / ipv4 UDP和TCP代理。 它应该为任何在.net Core 1.1兼容平台上构建并运行,并已在win10-x64和ubuntu.16.10-x64上进行了测试。为什么? 我们需要一个简单的,跨平台IPV6...

    Java聊天系统实训报告

    4、熟练掌握基于UDP协议的Socket编程; 5、了解Socket编程的协议约定以及信息交互方法; 本程序客户端主要完成了: 1. 客户端发送信息可以广播客户。 2. 广播客户,则将信息转发到所有客户端。 服务器主要完成了: ...

    基于JAVA的网络通讯系统设计与实现.rar

    客户端-服务器架构:采用客户端-服务器模式,其中服务器负责接收、处理和转发消息,而客户端负责发送和接收消息,并提供用户界面。 多线程支持:服务器端和客户端都需要支持多线程,以处理多个客户端的并发连接和...

    LoRaPacketForwarder:LoRa单通道数据包转发器,用于通过Semtech UDP协议v2传输上游数据

    单通道LoRa UDP数据包转发器非常适合开发或测试目的。 只能接收LoRa数据并将其上传到一台或多台服务器。 这个项目非常适合DIY,这是最便宜的LoRa“网关”之一,它由单板计算机和一个4美元的LoRa模块组成。 该项目...

Global site tag (gtag.js) - Google Analytics