jlwcb 发表于 2015-07-16 13:26

Java Socket UDP协议 的超级简单使用

Java socket udp协议

send.jpg

server.jpg

SocketClient.javaimport java.net.DatagramPacket;
import java.net.DatagramSocket;
import java.net.InetAddress;
import java.net.UnknownHostException;

/**
* 消息发送端
*
* @author 肖蕾
*/
public class SocketClient
{
    private DatagramSocket socket = null;
    private DatagramPacket packet = null;
    private byte[] def = new byte;
    private InetAddress address;
    private int port = -1;

    public SocketClient()
    {
      try
      {
            socket = new DatagramSocket();
            packet = new DatagramPacket(def, def.length);
      } catch (Exception e)
      {
            throw new RuntimeException("SocketClient 初始化失败");
      }
    }

    public SocketClient(String ip, int port)
    {
      try
      {
            socket = new DatagramSocket();
            packet = new DatagramPacket(def, def.length);
            address = InetAddress.getByName(ip);
            packet.setAddress(address);
            this.port = port;
            packet.setPort(this.port);
      } catch (UnknownHostException e)
      {
            throw new RuntimeException(
                  "SocketClient(String ip,int port) 发送ip设置失败");
      } catch (Exception e)
      {
            throw new RuntimeException("SocketClient 初始化失败");
      }
    }


    /**
   * 发送消息
   *
   * @param data
   *            发送的内容
   * @param ip
   *            发送的ip地址
   * @param port
   *            发送的端口号
   */
    public void sendMessage(byte[] data)
    {
      try
      {
            packet.setData(data);
            packet.setLength(data.length);
            socket.send(packet);
      } catch (Exception e)
      {
            String errorMsg = "";
            if (address == null)
            {
                errorMsg += "\n发送的地址为空 setAddress(String ip)\n";
            }
            if (port == -1)
            {
                errorMsg += "发送的端口为空 setPort(int port)\n";
            }
            throw new RuntimeException(errorMsg);
      }
    }

    /**
   * 设置发送的IP地址
   *
   * @param ip
   *            发送的ip地址
   */
    public void setAddress(String ip)
    {
      try
      {
            address = InetAddress.getByName(ip);
            packet.setAddress(address);
      } catch (UnknownHostException e)
      {
            throw new RuntimeException("setAddress(String ip) 发送ip设置失败");
      }
    }

    /**
   * 设置发送的端口
   *
   * @param port
   *            发送的端口
   */
    public void setPort(int port)
    {
      this.port = port;
      packet.setPort(this.port);
    }

    /**
   * 释放资源
   */
    public void close()
    {
      if (socket != null)
      {
            socket.close();
      }
    }
}SocketServer.javaimport java.net.DatagramPacket;
import java.net.DatagramSocket;

public class SocketServer
{
    private byte[] buff= null;
    private DatagramPacket packet = null;
    private DatagramSocket server = null;
    private OnMessageListener listener = null;
    private boolean loop = false;
    Thread thread = new Thread()
    {
      public void run()
      {
            try
            {
                while (loop)
                {
                  if (server != null)
                  {
                        server.receive(packet);
                        byte []data = packet.getData();
                        byte []msg = new byte;
                        for (int i = 0; i < msg.length; i++)
                        {
                            msg = data;
                        }
                        if (SocketServer.this.listener != null)
                        {
                            SocketServer.this.listener.getmsg(msg,packet.getAddress().getHostAddress(),packet.getPort());
                        }
                  }
                }
            } catch (Exception e)
            {
            }
      };
    };
    /**
   * 构造函数 初始化数据
   * @param port      端口
   * @param size      缓冲区的长度
   * @throws Exception
   */
    public SocketServer(int port, int size)
    {
      try
      {
            buff= new byte;
            packet = new DatagramPacket(buff, buff.length);
            server = new DatagramSocket(port);
      } catch (Exception e)
      {
            throw new RuntimeException(e);
      }
    }
    /**
   * 设置数据的获取者
   * @param listener
   */
    public SocketServer setOnMessageListener(OnMessageListener listener)
    {
      this.listener = listener;
      return this;
    }
    /**
   * 开始接收数据
   */
    public void start()
    {
      loop = true;
      thread.start();
    }
    /**
   * 关闭流释放资源
   */
    public void close()
    {
      loop = false;
      if (server != null)
      {
            server.close();
      }
    }
   
}
/**
* 数据获取者
* @author 肖蕾
*/
interface OnMessageListener
{
    /**
   * 获取发送的数据,ip地址 以及端口号
   * @param data数据
   * @param ip    ip地址
   * @param port端口号
   */
    public void getmsg(byte []data,String ip,int port);
}

renxiao2003 发表于 2015-08-12 13:06

UDP比TCP简单。
页: [1]
查看完整版本: Java Socket UDP协议 的超级简单使用