`

java -> UDP 服务器/客户端 ( 性能指数1星 )

    博客分类:
  • java
 
阅读更多

 

来自/原文 : http://blog.chinaunix.net/uid-540802-id-446145.html

 

 

以下是服务器端代码,代码在接收到请求后,处理交给线程池。线程池在处理完成后回复报文线客户端。
里面加入了一些性能统计功能,加入了处理报文数量的计数器,还有一个线程统计每秒收到的报文数。
  1. package com.chouy.udpdns;
  2. import java.io.IOException;
  3. import java.net.DatagramPacket;
  4. import java.net.DatagramSocket;
  5. import java.net.InetSocketAddress;
  6. import java.net.SocketAddress;
  7. import java.net.SocketException;
  8. import java.util.concurrent.ExecutorService;
  9. import java.util.concurrent.Executors;
  10. import java.util.concurrent.atomic.AtomicInteger;
  11. public class UDPServer
  12. {
  13.     String host;
  14.     int port;
  15.     ExecutorService executor;
  16.     DatagramSocket datagramSocket;
  17.     AtomicInteger receiveCount;
  18.     public UDPServer(String host, int port)
  19.     {
  20.         this.host = host;
  21.         this.port = port;
  22.     }
  23.     public void setExecutor(ExecutorService executor)
  24.     {
  25.         this.executor = executor;
  26.     }
  27.     
  28.     public void start() throws SocketException
  29.     {
  30.         this.receiveCount = new AtomicInteger(0);
  31.         Thread t = new TimeThread(this.receiveCount, 1000);
  32.         t.setPriority(Thread.MAX_PRIORITY);
  33.         t.start();
  34.         SocketAddress socketAddress = new InetSocketAddress(host, port);
  35.         this.datagramSocket = new DatagramSocket(socketAddress);
  36.         this.datagramSocket.setReceiveBufferSize(1024 * 1000);
  37.         System.out.println("UDPServer start ... " + socketAddress);
  38.         while (true)
  39.         {
  40.             try
  41.             {
  42.                 DatagramPacket packet = DatagramSocketFactory.getDatagramPacket();
  43.                 this.datagramSocket.receive(packet);
  44.                 this.receiveCount.incrementAndGet();
  45.                 if (this.executor != null)
  46.                     this.executor.execute(new UDPRunnable(packet));
  47.                 else
  48.                 {
  49.                     DatagramPacket p = new DatagramPacket(packet.getData(), packet.getLength());
  50.                     // System.out.println("from ip:port " +this.packet.getAddress() + ":" + this.packet.getPort());
  51.                     p.setSocketAddress(packet.getSocketAddress());
  52.                     datagramSocket.send(p);
  53.                 }
  54.             }
  55.             catch (IOException e)
  56.             {
  57.                 e.printStackTrace();
  58.             }
  59.         }
  60.     }
  61.     class UDPRunnable implements Runnable
  62.     {
  63.         DatagramPacket packet;
  64.         public UDPRunnable(DatagramPacket packet)
  65.         {
  66.             this.packet = packet;
  67.         }
  68.         @Override
  69.         public void run()
  70.         {
  71.             try
  72.             {
  73.                 DatagramPacket p = new DatagramPacket(this.packet.getData(), this.packet.getLength());
  74.                 // System.out.println("from ip:port " +this.packet.getAddress() + ":" + this.packet.getPort());
  75.                 p.setSocketAddress(this.packet.getSocketAddress());
  76.                 datagramSocket.send(p);
  77.             }
  78.             catch (IOException e)
  79.             {
  80.                 e.printStackTrace();
  81.             }
  82.         }
  83.     }
  84.     class TimeThread extends Thread
  85.     {
  86.         long period;
  87.         AtomicInteger atom;
  88.         private int temp;
  89.         public TimeThread(AtomicInteger atomInt, int period)
  90.         {
  91.             this.atom = atomInt;
  92.             this.period = period;
  93.             this.temp = 0;
  94.         }
  95.         @Override
  96.         public void run()
  97.         {
  98.             while (true)
  99.             {
  100.                 int t = this.atom.get();
  101.                 if (t != this.temp)
  102.                 {
  103.                     System.out.printf("second recv: %6d, recv sum: %8d\n", (t - this.temp), t);
  104.                     this.temp = t;
  105.                 }
  106.                 try
  107.                 {
  108.                     Thread.sleep(this.period);
  109.                 }
  110.                 catch (InterruptedException e)
  111.                 {
  112.                     e.printStackTrace();
  113.                 }
  114.             }
  115.         }
  116.     }
  117.     public static void main(String[] args) throws IOException
  118.     {
  119.         UDPServer udpServer = new UDPServer("0.0.0.0", 1800);
  120.         udpServer.setExecutor(Executors.newFixedThreadPool(1));
  121.         udpServer.start();
  122.     }
  123. }

下面是客户端代码,也加入了计数器和线程池功能,但在测试中发现线程个数对性能提升不明显。

  1. package com.chouy.udpdns;
  2. import java.io.IOException;
  3. import java.net.DatagramPacket;
  4. import java.net.DatagramSocket;
  5. import java.net.InetSocketAddress;
  6. import java.util.concurrent.ExecutorService;
  7. import java.util.concurrent.Executors;
  8. import java.util.concurrent.atomic.AtomicInteger;
  9. public class UDPClient
  10. {
  11.     public static AtomicInteger atomicInteger;
  12.     public String host;
  13.     public int port;
  14.     public ExecutorService executorService;
  15.     public DatagramSocket datagramSocket;
  16.     public UDPClient(String host, int port)
  17.     {
  18.         this.host = host;
  19.         this.port = port;
  20.     }
  21.     public void setExecutor(ExecutorService executorService)
  22.     {
  23.         this.executorService = executorService;
  24.     }
  25.     public void start(int nums)
  26.     {
  27.         Runtime.getRuntime().addShutdownHook(new Thread()
  28.         {
  29.             @Override
  30.             public void run()
  31.             {
  32.                 System.out.println("exit, count: " + atomicInteger.get());
  33.             }
  34.         });
  35.         try
  36.         {
  37.             datagramSocket = new DatagramSocket();
  38.             datagramSocket.connect(new InetSocketAddress(host, port));
  39.             byte[] bs = "你好".getBytes();
  40.             DatagramPacket packet = new DatagramPacket(bs, bs.length);
  41.             // packet.setAddress(socketAddress);
  42.             // datagramSocket.connect(socketAddress);
  43.             datagramSocket.setSoTimeout(30000);
  44.             atomicInteger = new AtomicInteger(nums);
  45.             for (int i = 0; i < nums; i++)
  46.             {
  47.                 // System.out.println("send success");
  48.                 this.executorService.execute(new UDPClientRunnable(packet));
  49.             }
  50.         }
  51.         catch (Exception e)
  52.         {
  53.             e.printStackTrace();
  54.         }
  55.         Thread.currentThread().setPriority(Thread.MIN_PRIORITY);
  56.         while (!this.executorService.isTerminated())
  57.             if (atomicInteger.get() >= 1)
  58.                 Thread.currentThread().yield();
  59.             else
  60.             {
  61.                 break;
  62.             }
  63.         System.out.println(" main thread ended ... ");
  64.         System.exit(0);
  65.     }
  66.     class UDPClientRunnable implements Runnable
  67.     {
  68.         DatagramPacket packet;
  69.         public UDPClientRunnable(DatagramPacket p)
  70.         {
  71.             this.packet = p;
  72.         }
  73.         @Override
  74.         public void run()
  75.         {
  76.             try
  77.             {
  78.                 datagramSocket.send(packet);
  79.                 DatagramPacket p2 = new DatagramPacket(new byte[100], 100);
  80.                 datagramSocket.receive(p2);
  81.                 System.out.println(new String(p2.getData(), 0, p2.getLength()) + " "
  82.                         + atomicInteger.decrementAndGet());
  83.             }
  84.             catch (IOException e)
  85.             {
  86.                 System.out.println(e.getMessage());
  87.                 atomicInteger.decrementAndGet();
  88.             }
  89.         }
  90.     }
  91.     public static void main(String[] args)
  92.     {
  93.         UDPClient client = new UDPClient("192.168.21.117", 1800);
  94.         client.setExecutor(Executors.newFixedThreadPool(100));
  95.         client.start(100000);
  96.     }
  97. }

下面是一个工厂类,只是在服务器端生成接收报文用,实际没啥大用。

  1. package com.chouy.udpdns;
  2. import java.net.DatagramPacket;
  3. public class DatagramSocketFactory
  4. {
  5.     final static int bufferSize = 2048;
  6.     public static DatagramPacket getDatagramPacket()
  7.     {
  8.         byte[] buffer = new byte[bufferSize];
  9.         DatagramPacket packet = new DatagramPacket(buffer, buffer.length);
  10.         return packet;
  11.     }
  12. }

因为代码非常简单,所以没有注释。

分享到:
评论

相关推荐

    java -> UDP Server/Client

    在这个主题中,我们将深入理解如何在Java中实现UDP服务器和客户端。 首先,`UDPServer.java` 文件应该包含了服务器端的代码。在Java中,我们使用`java.net.DatagramSocket` 类来创建一个UDP套接字,用于接收和发送...

    java -> TCP/UDP 连接测试 SocketTest

    3. 创建UDP服务器端: - 实例化DatagramSocket并绑定到特定端口。 - 创建一个DatagramPacket,准备接收数据。 - 使用receive()方法接收数据包。 4. 创建UDP客户端: - 实例化DatagramSocket。 - 创建一个...

    TCP--UDP的服务器和客户端程序

    本资源包含基于JAVA实现的TCP和UDP服务器及客户端程序,非常适合用于学习和课程设计。下面将详细介绍TCP与UDP的特点、工作原理以及它们在JAVA中的应用。 TCP是一种面向连接的、可靠的、基于字节流的传输层通信协议...

    UDP服务器和客户端程序

    在标题和描述中提到的"UDP服务器和客户端程序",这是指使用UDP协议进行通信的两个程序实例,一个作为服务端接收数据,另一个作为客户端发送数据。通常,开发这样的程序需要理解以下几个关键概念: 1. **端口号**:...

    【Socket编程】--UDP异步通讯一服务器多客户端

    【Socket编程】--UDP异步通讯一服务器多客户端 Socket编程是网络通信的基础,而UDP(User Datagram Protocol)是一种无连接、不可靠的传输协议,适用于实时性要求高但对数据完整性要求相对较低的场景。在这个项目中...

    Java实现UDP服务器和客户端模型.rar

    Java实现UDP服务器模型,内含UDP服务器端模型和UDP客户端模型两个小程序,向JAVA初学者演示UDP C/S结构的原理。比如客户端模型如下:  DatagramSocket socket=new DatagramSocket(); //实例化一个数据报Socket  ...

    UDP简易客户端与服务器端程序(Java)

    在这个Java实现的UDP简易客户端与服务器端程序中,我们可以通过两个核心文件——UDPClient.java和UDPServer.java来理解其工作原理。 首先,让我们来看看`UDPServer.java`。服务器端通常负责监听特定的端口,接收...

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

    1. **socket编程**:服务器端需要创建一个UDP套接字,使用`socket()`函数创建套接字,`bind()`函数绑定本地IP和端口,然后用`recvfrom()`函数接收来自客户端的数据。 2. **数据包处理**:接收到的数据通常以字节流...

    一个简单的JAVA-JAIN-SIP客户端,可以连接SIP服务端发起呼叫

    这个简单的JAVA-JAIN-SIP客户端示例展示了如何利用该库与SIP服务器进行交互,实现登录和发起呼叫的基本功能。SIP是一种互联网协议,常用于多媒体通信,如VoIP电话、视频会议等。 首先,我们要理解JAIN SIP(Java ...

    TCP协议服务器/客户端框架

    1. **面向连接的通信**:TCP在进行数据传输前,会先建立连接,确保通信双方都能正常收发数据,这与UDP(用户数据报协议)的无连接通信方式不同。 2. **C#编程语言**:这是一个广泛应用于Windows平台的面向对象的...

    JAVA_ Socket_UDP(客户端服务器)

    以下是一个简单的UDP服务器示例: ```java import java.io.IOException; import java.net.DatagramPacket; import java.net.DatagramSocket; import java.net.InetSocketAddress; public class UDPServer { ...

    基于java netty的udp客户端声呐数据对接

    Java Netty是一个高性能、异步事件驱动的网络应用程序框架,常用于开发高效的网络服务,包括TCP、UDP等网络协议的应用。在"基于Java Netty的UDP客户端声呐数据对接"项目中,我们主要关注如何利用Netty处理UDP通信,...

    Java-Oracle-UDP通信

    例如,以下是一个简单的Java UDP客户端和服务器端示例: ```java // 客户端 public class UDPSender { public static void main(String[] args) throws Exception { String message = "Hello, Oracle!"; byte[] ...

    javaUDP实现服务器客户端大小写的转换

    总的来说,Java UDP实现服务器客户端大小写的转换是一个基础的网络编程示例,它涉及到网络套接字的创建、数据的收发以及基本的字符串操作。通过这个例子,开发者可以更好地理解网络编程的基本概念,为后续更复杂的...

    UDP服务器客户端编程实战

    在IT行业中,网络编程是不可或缺的一部分,...总之,理解并掌握UDP服务器和客户端的多线程编程是提升网络应用性能的关键,也是IT开发者必备的技能之一。通过实践和不断学习,你可以更好地应对各种复杂的网络编程挑战。

    UDP服务器客户端通信代码

    综上所述,实现基于Java的UDP服务器客户端通信涉及多个层面,包括Socket编程、数据封装、广播通信以及心跳机制等。理解这些概念和技术对于开发网络应用至关重要。通过`UDPserver`这样的项目,开发者可以实践这些知识...

    基于UDP的客户端与服务器端java实现

    本篇将详细介绍如何使用Java语言来实现基于UDP的客户端与服务器端通信。 首先,我们要了解UDP的基本原理。UDP不建立连接,而是直接发送数据报,每个数据报包含完整的源地址和目的地址,因此可以由任何节点发送到...

    p2p网络聊天室-----c/s模式

    相反,C/S模式则是传统的客户端-服务器架构,其中一部分设备作为服务器提供服务,而另一部分设备作为客户端请求服务。在C/S模式的聊天室中,所有用户都连接到同一台或一组服务器,由服务器处理并转发消息。这种方式...

    netty高性能异步I/O服务器/客户端开源开发工具

    它是一个开源的Java库,广泛应用于服务器和客户端的开发,尤其在处理高并发、低延迟的网络服务时,Netty的表现尤为突出。Netty的核心是基于NIO(非阻塞I/O)和EventLoop事件驱动模型,这使得它能够在单线程或多线程...

    Java版本实现UDP服务器在局域网中实现与客户端通信的测试demo

    * UDP服务器 * &lt;p&gt; UDP说明: * &lt;p&gt;UDP是无连接的通信协议,本质上不分服务端和客户端,两个段都可以对方当作服务器。 * &lt;p&gt; Java版本的可使用DatagramSocket接口实现,关键函数说明: * &lt;p&gt; .bind(): 表示监听...

Global site tag (gtag.js) - Google Analytics