package com.socket; import java.io.IOException; import java.net.DatagramPacket; import java.net.DatagramSocket; import java.net.InetAddress; import java.net.SocketException; import java.text.BreakIterator; public class UDP { public DatagramSocket socket = null;// 通过UDP建立的Socket private int myPort = 6000;// 我的端口,从6000开始查找可用的端口号 public InetAddress friendIP = null;// 好友的IP地址 public int friendPort = 0;// 好友的端口 public UDP(String friendIP) { getMyUsefulPort(); try { this.friendIP = InetAddress.getByName(friendIP); } catch (Exception e) { e.printStackTrace(); } } /** * 设置好友的端口号 * @param friendPort */ public void setFriendPort(int friendPort) { this.friendPort=friendPort; } /** * 获取我的端口号,只有当UDP类被实例化后才能调用此方法, * 否则得到的端口号可能不是最终有效的端口号 * @return */ public int getMyPort() { return this.myPort; } /** * 获取可用的端口号 */ public void getMyUsefulPort() { while(true) { try { // 实例化一个DatagramSocket socket = new DatagramSocket(myPort); break; } catch (SocketException e) { myPort++; } } } /* * 给好友发送消息 */ public void sendMessage(String text) { byte[] data = text.getBytes(); DatagramPacket packet = new DatagramPacket(data, data.length, friendIP, friendPort); try { socket.send(packet);// 开始发送消息 System.out.println("使用UDP成功发送:"+text); } catch (IOException e) { e.printStackTrace(); } } /** * 接收消息 */ public String getMessage() { byte[] buf = new byte[1024]; DatagramPacket dp = new DatagramPacket(buf, buf.length); try { socket.receive(dp); String message = new String(dp.getData(), 0, dp.getLength()); System.out.println("使用UDP成功接收到:"+message); return message; } catch (Exception e) { e.printStackTrace(); return null; } } /** * 开辟新线程后台获取消息,这个方法姑且丢置在这里,暂时不会用到 */ public void newThreadGetMessage() { Runnable runnable = new Runnable() { @Override public void run() { while (true) { getMessage();// 调用UDP的获取消息方法 try { Thread.sleep(100);// 线程休息100毫秒 } catch (InterruptedException e) { e.printStackTrace(); } } } }; new Thread(runnable).start(); } }