`
SunnyYoona
  • 浏览: 367815 次
社区版块
存档分类
最新评论

[Java]UDP通信的简单例子

 
阅读更多
package com.sjf;

import java.io.IOException;
import java.net.DatagramPacket;
import java.net.DatagramSocket;
import java.net.InetAddress;
import java.net.InetSocketAddress;
import java.net.SocketException;

/**
 * @time 2015-05-27
 * @desc UDP通信
 * @author sjf0115
 *
 */
public class Server {    

    private byte[] buffer = new byte[1024];    
    private DatagramSocket socket = null;    
    private DatagramPacket packet = null;    
    private InetSocketAddress socketAddress = null;    
    private InetAddress clientAddress;
    private String clientIP;
    private int clientPort;
    private String clientData;

    //+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
    /**  
     * 构造函数,绑定主机和端口.  
     * @param ip  IP 地址
     * @param port 端口  
     * @throws Exception  
     */    
    public Server(String ip, int port) throws Exception 
    {    
        // 绑定IP地址和端口. 
        Bind(ip,port); 
        System.out.println("[服务端启动]");    
    }
    //++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
    public Server() throws SocketException
    {
        // 构造数据报套接字并将其绑定到本地主机上任何可用的端口
        socket = new DatagramSocket();    
        System.out.println("[服务端启动]");    
    }
  //+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
    /**  
     * 绑定监听地址和端口.  
     * @param ip IP地址  
     * @param port 端口  
     * @throws SocketException  
     */    
    public void Bind(String ip, int port) throws SocketException {    
        // 根据 IP 地址和端口号创建套接字地址
        socketAddress = new InetSocketAddress(ip, port);  
        // 创建数据报套接字,将其绑定到指定的本地地址
        socket = new DatagramSocket(socketAddress);
        packet = new DatagramPacket(buffer, buffer.length);
    }    
    //+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
    public final String getOrgIp() 
    {    
        return clientIP;    
    }    
    //+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
    /**  
     * 设置超时时间  
     * @param timeout 超时时间  
     * @throws Exception  
     */    
    public void SetTimeout(int timeout) throws Exception 
    {    
        /* 启用/禁用带有指定超时值的 SO_TIMEOUT,以毫秒为单位。
         * 将此选项设为非零的超时值时,对此 DatagramSocket 调用 receive() 将只阻塞此时间长度。
         * 如果超过超时值,将引发 java.net.SocketTimeoutException,虽然 DatagramSocket 仍旧有效。
         * 选项必须在进入阻塞操作前被启用才能生效。
         */
        socket.setSoTimeout(timeout);    
    }    
    //+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
    /**  
     * 获得超时时间.  
     * @return 返回超时时间.  
     * @throws Exception  
     */    
    public int GetTimeout() throws Exception 
    {    
        return socket.getSoTimeout();    
    }    
    //+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
    /**  
     * 接收数据包,该方法会造成线程阻塞.  
     * @return 返回接收的数据串信息  
     * @throws IOException   
     */    
    public String Receive() throws IOException 
    {    
        /*
         * 从此套接字接收数据报包。当此方法返回时,DatagramPacket 的缓冲区填充了接收的数据。
         * 数据报包也包含发送方的 IP 地址和发送方机器上的端口号。此方法在接收到数据报前一直阻塞。
         * 数据报包对象的 length 字段包含所接收信息的长度。如果信息比包的长度长,该信息将被截短。
         */
        socket.receive(packet);
        // 数据报包包含发送方的 IP 地址
        clientAddress = packet.getAddress();
        clientIP = clientAddress.getHostAddress();
        // 数据报包包含发送方的端口号
        clientPort = packet.getPort();
        // 数据报包包含发送方的数据
        clientData = new String(packet.getData(), 0, packet.getLength());     
        return " ["+clientData+"]";    
    }    
    //+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
    /**  
     * 将响应包发送给请求端.  
     * @param bytes 回应报文  
     * @throws IOException  
     */    
    public void Send(String info) throws IOException 
    {    
        packet.setAddress(clientAddress);
        packet.setPort(clientPort);
        packet.setData(info.getBytes()); 
        /*
         * 从此套接字发送数据报包。DatagramPacket 包含的信息指示:将要发送的数据、其长度、远程主机的 IP 地址和远程主机的端口号。
         */
        socket.send(packet);    
    }    
    //+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
    /**  
     * 关闭udp监听口.  
     */    
    public void close() 
    {    
        try 
        {    
            socket.close();    
        } 
        catch (Exception ex) 
        {    
            ex.printStackTrace();    
        }    
    }    
    //+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
    /**  
     * 测试方法.  
     * @param args  
     * @throws Exception  
     */    
    public static void main(String[] args) throws Exception {    
        String serverHost = "127.0.0.1";    
        int serverPort = 3344;    
        Server udpServerSocket = new Server(serverHost, serverPort);    
        while (true) 
        {    
            String info = udpServerSocket.Receive();  
            System.out.println("["+udpServerSocket.clientPort+"]->"+info);
            udpServerSocket.Send("Reponse-----"+info);    
        }    
    }    
}   
package com.sjf;

import java.io.*;  
import java.net.*;  

/** 
 * @time 2015-05-27
 * @desc UDP通信
 * @author QPING
 */  
public class Client {  

    private byte[] buffer = new byte[1024];  
    private DatagramSocket socket = null;  
    private InetSocketAddress socketAddress = null;    
    private String clientIP;
    private int clientPort;
    private String clientData;
    private InetAddress clientAddress;
    private DatagramPacket sendPacket;
    private DatagramPacket receivePacket;
    //++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
    public Client(String host, int port) throws Exception 
    {    
         // 根据 IP 地址和端口号创建套接字地址
        socketAddress = new InetSocketAddress(host, port);  
        // 创建数据报套接字,将其绑定到指定的本地地址
        socket = new DatagramSocket(socketAddress);    
        System.out.println("服务端启动!");    
    }
    //++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
    /** 
     * 构造函数,创建UDP客户端 
     * @throws Exception 
     */  
    public Client() throws Exception 
    {  
        socket = new DatagramSocket();  
    }  
    //+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++  
    /** 
     * 设置超时时间,该方法必须在bind方法之后使用. 
     * @param timeout 超时时间 
     * @throws Exception 
     */  
    public final void SetTimeout(final int timeout) throws Exception 
    {  
        socket.setSoTimeout(timeout);  
    }  
    //+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
    /** 
     * 获得超时时间. 
     * @return 返回超时时间 
     * @throws Exception 
     */  
    public int GetTimeout() throws Exception 
    {  
        return socket.getSoTimeout();  
    }
    //+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
    public DatagramSocket GetSocket() 
    {  
        return socket;  
    }  
    //+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
    /** 
     * 向指定的服务端发送数据信息. 
     * @param ip 服务器主机地址 
     * @param port 服务端端口 
     * @param bytes 发送的数据信息 
     * @return 返回构造后俄数据报 
     * @throws IOException 
     */  
    public DatagramPacket Send(String ip,int port,String info) throws IOException 
    {  
        byte[] bytes = info.getBytes();
        sendPacket = new DatagramPacket(bytes, bytes.length);
        sendPacket.setAddress(InetAddress.getByName(ip));
        sendPacket.setPort(port);
        socket.send(sendPacket);  
        return sendPacket;  
    }  
    //+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
    /** 
     * 接收从指定的服务端发回的数据. 
     * @param lhost 服务端主机 
     * @param lport 服务端端口 
     * @return 返回从指定的服务端发回的数据. 
     * @throws Exception 
     */  
    public String Receive(String lhost,int lport)   throws Exception 
    {  
        receivePacket = new DatagramPacket(buffer, buffer.length);  
        socket.receive(receivePacket);  
        // 数据报包包含发送方的 IP 地址
        clientAddress = receivePacket.getAddress();
        clientIP = clientAddress.getHostAddress();
        // 数据报包包含发送方的端口号
        clientPort = receivePacket.getPort();
        // 数据报包包含发送方的数据
        clientData = new String(receivePacket.getData(), 0, receivePacket.getLength());     
        return "["+clientData+"]"; 
    }  
    //++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
    /** 
     * 关闭udp连接. 
     */  
    public void close() 
    {  
        try 
        {  
            socket.close();  
        } 
        catch (Exception ex) 
        {  
            ex.printStackTrace();  
        }  
    }  
    //++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
    /** 
     * 测试客户端发包和接收回应信息的方法. 
     * @param args 
     * @throws Exception 
     */  
    public static void main(String[] args) throws Exception {  

        String serverHost = "127.0.0.1";  
        int serverPort = 3344;

        String myIP = "127.0.0.2";
        int myPort = 3333;

        Client client = new Client(myIP,myPort);  
        while(true)
        {
            BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
            System.out.println("["+myPort+"] ");
            String str = br.readLine();

            client.Send(serverHost, serverPort, str);

            String info = client.Receive(serverHost, serverPort);  
            System.out.println("["+client.clientPort+"]->" + info);  
        }
    }  
} 
<script type="text/javascript"> $(function () { $('pre.prettyprint code').each(function () { var lines = $(this).text().split('\n').length; var $numbering = $('<ul/>').addClass('pre-numbering').hide(); $(this).addClass('has-numbering').parent().append($numbering); for (i = 1; i <= lines; i++) { $numbering.append($('<li/>').text(i)); }; $numbering.fadeIn(1700); }); }); </script>
分享到:
评论

相关推荐

    UDP简单的通信小例子

    前面个有点问题,我回家打开时才发现, 问题是设置IP不对,我用了我机器的IP,呵呵 不过你看完后改一下就可以了 还有一个问题就是,发送的字符在接收时,在窗体的后机会有乱码, 这个是开始我也没有想到,现在改...

    串口,TCP, UDP通信实例(源代码)

    串口,TCP, UDP通信例子(源代码)

    JAVA基于UDP通信的一对一聊天

    端口监听、消息的发送与接收,这个例子并没有界面,大家可以看看,原理及流程清楚了可以自己搭建一个界面实现。

    java udp例子

    这是一个使用JAVA UDP通信建立的网络传输案例,方便初始学者学习,交流,,此处只有源码..

    JAVA读写PLC物联网Modbus RTU Modbus TCP Modbus UDP通信,JAVA与Modbus通信源码

    Modbus允许多个 (大约240个) 设备连接在同一个网络上进行通信,举个例子,一个由测量温度和湿度的装置,并且将结果发送给计算机。Modbus支持的具体协议有:Modbus TCP、Modbus UDP、Modbus RTU、ModbusRtuOverTcp、...

    java中socket的TCP和UDP两种通信方式的例子

    java中socket的TCP和UDP两种通信方式的例子

    欧姆龙以太网通讯TCP_UDP例子及欧姆龙PLC程序例子说明.zip

    欧姆龙TCP/UDP网络通讯例子,通讯的每个节点都有详细说明,还有欧姆龙PLC程序例子,以及中文版通讯功能块。

    Java中的UDP协议编程

    Java中实现UDP协议编程详细文档,详解了在Java中使用UDP协议编程的相关类,给出一个UDP的服务端和客户端交互通信的例子,服务端循环等待客户端发送的信息,并对其进行回应,客户端向服务端发送信息,并接收服务端的...

    java文件传输等一些例子(两种通信方式)

    自己写的一些关于java Socket UDP的一些例子,感觉里面应该写的挺全了。希望有助于大家的学习.不足之处多多指教.

    java Socket与C#通信中中文乱码问题的解决方案

    近正在做一个项目,其中遇到了一个问题是java与.NET之间的通信问题。具体的问题是这样的:  客户端使用java,服务器端使用的是C#。两者之间使用基于TCP的...  首先是客户端的java代码(这是比较简单的部分) im

    基于java的TCP和UDP实现的一个简单的通信的例子.zip

    本项目是UDP项目,内含源码和教程可以直接部署,创作不易欢迎交流

    利用UDP实现局域网通信

    本程序是利用java实现了UDP下的局域网通信,并打包成了EXE可执行文件,不需要java环境就可以直接运行在自己的电脑上,是学习网络通信的很好的例子

    java编程socket通信

    这是个很全面的java写的socket通信,使用套接字实现基于TCP协议的服务器和客户机程序,还有个UDP协议的例子。文档很详细。

    Blender-Networking-Java-Examples:Blender通过Java进行UDP套接字通信控制的例子

    Blender通过Java进行UDP套接字通信控制的例子 示例 1 第一个示例展示了如何在基于单独命令行的 Python 程序和 Blender 游戏引擎之间传递非常基本的字符串。 示例 2 第二个示例展示了如何通过 Java 应用程序在 ...

    java源码包---java 源码 大量 实例

     基于JAVA的UDP服务器模型源代码,内含UDP服务器端模型和UDP客户端模型两个小程序,向JAVA初学者演示UDP C/S结构的原理。 简单聊天软件CS模式 2个目标文件 一个简单的CS模式的聊天软件,用socket实现,比较简单。 ...

    java源码包4

     基于JAVA的UDP服务器模型源代码,内含UDP服务器端模型和UDP客户端模型两个小程序,向JAVA初学者演示UDP C/S结构的原理。 简单聊天软件CS模式 2个目标文件 一个简单的CS模式的聊天软件,用socket实现,比较简单。 ...

    JAVA上百实例源码以及开源项目

     基于JAVA的UDP服务器模型源代码,内含UDP服务器端模型和UDP客户端模型两个小程序,向JAVA初学者演示UDP C/S结构的原理。 简单聊天软件CS模式 2个目标文件 一个简单的CS模式的聊天软件,用socket实现,比较简单。 ...

    java源码包3

     基于JAVA的UDP服务器模型源代码,内含UDP服务器端模型和UDP客户端模型两个小程序,向JAVA初学者演示UDP C/S结构的原理。 简单聊天软件CS模式 2个目标文件 一个简单的CS模式的聊天软件,用socket实现,比较简单。 ...

    JAVA上百实例源码以及开源项目源代码

     基于JAVA的UDP服务器模型源代码,内含UDP服务器端模型和UDP客户端模型两个小程序,向JAVA初学者演示UDP C/S结构的原理。 简单聊天软件CS模式 2个目标文件 一个简单的CS模式的聊天软件,用socket实现,比较简单。 ...

Global site tag (gtag.js) - Google Analytics