还差实现内网终端,向服务器发送请求,要对方的内网连接自己,实现打洞。在同一网段,或者公网运行,可以相互聊天。
没有实现检测客户端下线功能。
1,服务器代码
package router; import java.io.ByteArrayOutputStream; import java.io.IOException; import java.io.ObjectOutputStream; import java.net.DatagramPacket; import java.net.DatagramSocket; import java.net.InetAddress; import java.net.InetSocketAddress; import java.net.SocketAddress; import java.net.SocketException; import java.util.HashSet; import java.util.Set; public class Server { // private Set<InetSocketAddress> clients= new HashSet(); DatagramSocket socket; HeartBeat heart; Server(){ try { socket = new DatagramSocket(9090); } catch (SocketException e) { // TODO Auto-generated catch block e.printStackTrace(); } } public void startServer(){ try { while(true){ byte[] buf = new byte[1024]; DatagramPacket packet = new DatagramPacket(buf, buf.length); socket.receive(packet); InetAddress addr=packet.getAddress(); int port = packet.getPort(); InetSocketAddress address = new InetSocketAddress(addr,port); heart.add(address); send(heart.getDests(), address); String s = address + " is comming."; notifyClients(s); } } catch (SocketException e) { // TODO Auto-generated catch block e.printStackTrace(); } catch (IOException e) { // TODO Auto-generated catch block e.printStackTrace(); } } private void send(Object clients, SocketAddress client) throws IOException { ByteArrayOutputStream bous = new ByteArrayOutputStream(); ObjectOutputStream oos = new ObjectOutputStream(bous); oos.writeObject(clients); oos.flush(); byte[] data= bous.toByteArray(); DatagramPacket sendip = new DatagramPacket(data, data.length); sendip.setSocketAddress(client); socket.send(sendip); } void notifyClients(String s){ for( SocketAddress client:heart.getDests()){ try { send(s, client); } catch (IOException e) { // TODO Auto-generated catch block e.printStackTrace(); } } } public static void main(String[] args) { Server server =new Server(); server.heart = new HeartBeat(server.socket); server.startServer(); } }