package com.zkzy.fxfh.utils;

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

/**
 * UTP服务类.     
 */
public class TalkServerUDP {
    private byte[] buffer = new byte[1024];
    
    private DatagramSocket ds = null;

    private DatagramPacket packet = null;

    private InetSocketAddress socketAddress = null;

    private String orgIp;

    /**
     * 构造函数,绑定主机和端口.
     * @param host 主机
     * @param port 端口
     * @throws Exception
     */
    public TalkServerUDP(String host, int port) throws Exception {
        socketAddress = new InetSocketAddress(host, port);
        ds = new DatagramSocket(socketAddress);
        System.out.println("服务端启动!");
    }
    
    public final String getOrgIp() {
        return orgIp;
    }

    /**
     * 设置超时时间,该方法必须在bind方法之后使用.
     * @param timeout 超时时间
     * @throws Exception
     */
    public final void setSoTimeout(int timeout) throws Exception {
        ds.setSoTimeout(timeout);
    }

    /**
     * 获得超时时间.
     * @return 返回超时时间.
     * @throws Exception
     */
    public final int getSoTimeout() throws Exception {
        return ds.getSoTimeout();
    }

    /**
     * 绑定监听地址和端口.
     * @param host 主机IP
     * @param port 端口
     * @throws SocketException
     */
    public final void bind(String host, int port) throws SocketException {
        socketAddress = new InetSocketAddress(host, port);
        ds = new DatagramSocket(socketAddress);
    }


    /**
     * 接收数据包,该方法会造成线程阻塞.
     * @return 返回接收的数据串信息
     * @throws IOException
     */
    public final String receive() throws IOException {
        packet = new DatagramPacket(buffer, buffer.length);
        ds.receive(packet);
        orgIp = packet.getAddress().getHostAddress();
        String info = new String(packet.getData(), 0, packet.getLength());
        System.out.println("接收信息:" + info);
        return info;
    }

    /**
     * 将响应包发送给请求端.
     * @param bytes 回应报文
     * @throws IOException
     */
    public final void response(String info) throws IOException {
        System.out.println("客户端地址 : " + packet.getAddress().getHostAddress()
                + ",端口:" + packet.getPort());
        DatagramPacket dp = new DatagramPacket(buffer, buffer.length, packet
                .getAddress(), packet.getPort());
        dp.setData(info.getBytes());
        ds.send(dp);
    }

    /**
     * 设置报文的缓冲长度.
     * @param bufsize 缓冲长度
     */
    public final void setLength(int bufsize) {
        packet.setLength(bufsize);
    }

    /**
     * 获得发送回应的IP地址.
     * @return 返回回应的IP地址
     */
    public final InetAddress getResponseAddress() {
        return packet.getAddress();
    }

    /**
     * 获得回应的主机的端口.
     * @return 返回回应的主机的端口.
     */
    public final int getResponsePort() {
        return packet.getPort();
    }

    /**
     * 关闭udp监听口.
     */
    public final void close() {
        try {
            ds.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;
        TalkServerUDP udpServerSocket = new TalkServerUDP(serverHost, serverPort);
        while (true) {
            udpServerSocket.receive();
            udpServerSocket.response("你好,sterning!");
        }
    }
}
最近下载更多
ITfans  LV19 2020年12月31日
liuxie  LV12 2020年12月14日
cjy123  LV2 2020年4月6日
fanxiaolin84  LV10 2019年12月26日
哈勃8910  LV1 2019年5月18日
l1104119188  LV2 2019年4月23日
1847731288  LV13 2019年4月15日
zyx123452  LV1 2019年3月22日
zhjwgs  LV15 2019年3月4日
dasda66  LV1 2018年11月14日
最近浏览更多
钱小小  LV3 2023年7月15日
月之氏族  LV23 2022年11月11日
adimgaoshou  LV10 2022年9月6日
764938214  LV7 2022年7月21日
zhendong  LV7 2022年3月6日
111111255  LV2 2021年12月24日
488291556  LV5 2021年11月22日
Aoifee  LV4 2021年11月9日
Allengoo  LV1 2021年10月15日
yiyiyi55555  LV1 2021年9月5日
顶部 客服 微信二维码 底部
>扫描二维码关注最代码为好友扫描二维码关注最代码为好友