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日