udp server client

复制代码
package testUDP;

import java.io.IOException;
import java.net.DatagramPacket;
import java.net.DatagramSocket;

public class UDPServer

{

    public static final int PORT = 30000;

    // 定义每个数据报的最大大小为4K

    private static final int DATA_LEN = 4096;

    // 定义该服务器使用的DatagramSocket

    private DatagramSocket socket = null;

    // 定义接收网络数据的字节数组

    byte[] inBuff = new byte[DATA_LEN];

    // 以指定字节数组创建准备接受数据的DatagramPacket对象

    private DatagramPacket inPacket =

    new DatagramPacket(inBuff, inBuff.length);

    // 定义一个用于发送的DatagramPacket对象

    private DatagramPacket outPacket;

    // 定义一个字符串数组,服务器发送该数组的的元素

    String[] books = new String[]

    {

    "轻量级J2EE企业应用实战",

    "基于J2EE的Ajax宝典",

    "Struts2权威指南",

    "ROR敏捷开发最佳实践"

    };

    public void init() throws IOException

    {

        try

        {

            // 创建DatagramSocket对象

            socket = new DatagramSocket(PORT);

            // 采用循环接受数据

            for (int i = 0; i < 1000; i++)

            {

                // 读取Socket中的数据,读到的数据放在inPacket所封装的字节数组里。

                socket.receive(inPacket);

                // 判断inPacket.getData()和inBuff是否是同一个数组

                System.out.println(inBuff == inPacket.getData());

                // 将接收到的内容转成字符串后输出

                System.out.println(new String(inBuff,

                0, inPacket.getLength()));

                // 从字符串数组中取出一个元素作为发送的数据

                byte[] sendData = books[i % 4].getBytes();

                // 以指定字节数组作为发送数据、以刚接受到的DatagramPacket的

                // 源SocketAddress作为目标SocketAddress创建DatagramPacket.

                outPacket = new DatagramPacket(sendData,

                sendData.length, inPacket.getSocketAddress());

                // 发送数据

                socket.send(outPacket);

            }

        }

        // 使用finally块保证关闭资源

        finally

        {

            if (socket != null)

            {

                socket.close();

            }

        }

    }

    public static void main(String[] args)

    throws IOException

    {

        new UDPServer().init();

    }

}
复制代码

 

 

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
package testUDP;
 
import java.io.IOException;
import java.net.DatagramPacket;
import java.net.DatagramSocket;
import java.net.InetAddress;
import java.util.Scanner;
 
public class UDPClient 
    // 定义发送数据报的目的地 
    public static final int DEST_PORT = 30000
    public static final String DEST_IP = "127.0.0.1"
    // 定义每个数据报的最大大小为4KB 
    private static final int DATA_LEN = 4*4096;    
    // 定义接收网络数据的字节数组 
    byte[] inBuff = new byte[DATA_LEN]; 
    // 以指定的字节数组创建准备接收数据的DatagramPacket对象 
    private DatagramPacket inPacket =  
        new DatagramPacket(inBuff , inBuff.length); 
    // 定义一个用于发送的DatagramPacket对象 
    private DatagramPacket outPacket = null
    public void init()throws IOException 
    
        try
            // 创建一个客户端DatagramSocket,使用随机端口 
            DatagramSocket socket = new DatagramSocket()) 
        
            // 初始化发送用的DatagramSocket,它包含一个长度为0的字节数组 
            outPacket = new DatagramPacket(new byte[0] , 0 
                , InetAddress.getByName(DEST_IP) , DEST_PORT); 
            // 创建键盘输入流 
            Scanner scan = new Scanner(System.in); 
            // 不断地读取键盘输入 
            while(scan.hasNextLine()) 
            
                // 将键盘输入的一行字符串转换成字节数组 
                byte[] buff = scan.nextLine().getBytes(); 
                // 设置发送用的DatagramPacket中的字节数据 
                outPacket.setData(buff); 
                // 发送数据报 
                socket.send(outPacket); 
                // 读取Socket中的数据,读到的数据放在inPacket所封装的字节数组中 
                socket.receive(inPacket); 
                System.out.println(new String(inBuff , 0 
                    , inPacket.getLength())); 
            
        
    
    public static void main(String[] args)  
        throws IOException 
    
        new UDPClient().init(); 
    

  

posted @   Bigben  阅读(202)  评论(0编辑  收藏  举报
编辑推荐:
· AI与.NET技术实操系列(二):开始使用ML.NET
· 记一次.NET内存居高不下排查解决与启示
· 探究高空视频全景AR技术的实现原理
· 理解Rust引用及其生命周期标识(上)
· 浏览器原生「磁吸」效果!Anchor Positioning 锚点定位神器解析
阅读排行:
· DeepSeek 开源周回顾「GitHub 热点速览」
· 物流快递公司核心技术能力-地址解析分单基础技术分享
· .NET 10首个预览版发布:重大改进与新特性概览!
· AI与.NET技术实操系列(二):开始使用ML.NET
· 单线程的Redis速度为什么快?
点击右上角即可分享
微信分享提示