还差实现内网终端,向服务器发送请求,要对方的内网连接自己,实现打洞。在同一网段,或者公网运行,可以相互聊天。

没有实现检测客户端下线功能。

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();
    }
    
}
View Code

相关文章: