Java 如何在局域网中找到在线用户?

Java 如何在局域网中找到在线用户?,java,android,networking,lan,Java,Android,Networking,Lan,我目前正在开发一个小型的点对点应用程序,用户可以在局域网内相互聊天。我目前已经实现了以下代码,以便由一个在线用户广播 import java.io.*; import java.net.*; class BroadcastOnline extends Thread{ public void run(){ try{ String string = "a"; DatagramSocket serverSocket = new D

我目前正在开发一个小型的点对点应用程序,用户可以在局域网内相互聊天。我目前已经实现了以下代码,以便由一个在线用户广播

import java.io.*;
import java.net.*;
class BroadcastOnline extends Thread{
    public void run(){
        try{
            String string = "a";
            DatagramSocket serverSocket = new DatagramSocket();
            InetAddress IPAddress = InetAddress.getByName("255.255.255.255");
            byte[] sendData = new byte[1];
            sendData = string.getBytes();
            for(;;){
                DatagramPacket sendPacket = new DatagramPacket(sendData, sendData.length, IPAddress, 9877);
                serverSocket.send(sendPacket);
                Thread.sleep(1000);
            }    
        } catch (Exception e){}
    }
}
我用下面的代码找到了那些在线的人

import java.io.*;
import java.net.*;
class FindUsers { 
    InetAddress ad;
    String ipaddress;
    String onlineUsers[] = new String [10];
    FindUsers() throws Exception{
        DatagramSocket clientSocket = new DatagramSocket(9877);
        int count=0;
        byte[] receiveData = new byte[1];
        for(int i=0;i<=9;i++){                   
            DatagramPacket receivePacket = new DatagramPacket(receiveData, receiveData.length);
            clientSocket.receive(receivePacket);
            String sentence = new String( receivePacket.getData());
            ad = receivePacket.getAddress();
            ipaddress = ad.getHostAddress();
            onlineUsers[i]=ipaddress;
            count++;
        }
    }
}
import java.io.*;
导入java.net。*;
类FindUsers{
地址广告;
字符串地址;
字符串onlineUsers[]=新字符串[10];
FindUsers()引发异常{
DatagramSocket客户端套接字=新DatagramSocket(9877);
整数计数=0;
字节[]接收数据=新字节[1];

对于(int i=0;i您需要在BroadcastOnline类中广播如下名称:

byte[] sendData = new byte[15];
String name = nameField.getText();
sendData = name.getBytes();
        for(;;){
            DatagramPacket sendPacket = new DatagramPacket(sendData, sendData.length, IPAddress, 9877);
            serverSocket.send(sendPacket);
            Thread.sleep(1000);
        }  
**当然,需要捕获上面的异常

要查找联机用户,请实现以下代码

import java.io.*;
import java.net.*;
import java.util.List;
import java.util.ArrayList;

public class FindUsers{
    InetAddress inetAddress;
    List<String> ipList = new ArrayList<String>();
    List<String> nameList = new ArrayList<String>();
    String ipAddress;
    String name;
    DatagramSocket  clientSocket;
    DatagramPacket receivePacket;
    int count=0;
    byte[] receiveData;
    long futureTime;
    Thread collect;
    boolean refresh = true;

    public FindUsers(){
        futureTime = System.currentTimeMillis()+1100;

        try{
            clientSocket = new DatagramSocket(9877);
        }
        catch(IOException e){
            e.printStackTrace();
            System.out.println(e.toString());
        }

        collect = new Thread(new Runnable(){
            public void run(){
                for(;;){
                    receiveData = new byte[15];
                    receivePacket = new DatagramPacket(receiveData, receiveData.length);
                    try{
                    clientSocket.receive(receivePacket);
                    inetAddress = receivePacket.getAddress();
                    ipAddress = inetAddress.getHostAddress();
                    }
                    catch(IOException e){
                        //e.printStackTrace();
                    }
                    if(!ipList.contains(ipAddress)){
                        name = new String( receivePacket.getData());
                        ipList.add(ipAddress);
                        nameList.add(name);
                        receiveData = null;
                    }
                    try{
                        Thread.sleep(10);
                    }
                    catch(InterruptedException e){
                        //System.out.println("\nInterrupted!");
                        return;
                    }
                }
            }
        });
        collect.start();

        while(System.currentTimeMillis()<=futureTime){
            //do nothing.
        }
        clientSocket.close();
        collect.interrupt();

        int size = nameList.size();
        if (size==0){
            System.out.println("No online servers.");
        }
        else{
            for(int i = 0; i< nameList.size();i++){
                System.out.println(nameList.get(i)+ ": "+ ipList.get(i));
            }
        }
    }

    public static void main(String[] args){
        FindUsers f = new FindUsers();
    }
}
import java.io.*;
导入java.net。*;
导入java.util.List;
导入java.util.ArrayList;
公共类查找器{
InetAddress InetAddress;
List ipList=新建ArrayList();
列表名称列表=新的ArrayList();
字符串地址;
字符串名;
DatagramSocket客户端套接字;
数据包接收数据包;
整数计数=0;
字节[]接收数据;
未来时间长;
线程收集;
布尔刷新=真;
公共金融机构(){
futureTime=System.currentTimeMillis()+1100;
试一试{
clientSocket=newdatagramsocket(9877);
}
捕获(IOE异常){
e、 printStackTrace();
System.out.println(例如toString());
}
collect=new线程(new Runnable(){
公开募捐{
对于(;;){
receiveData=新字节[15];
receivePacket=新数据包(receiveData,receiveData.length);
试一试{
clientSocket.receive(receivePacket);
inetAddress=receivePacket.getAddress();
ipAddress=inetAddress.getHostAddress();
}
捕获(IOE异常){
//e、 printStackTrace();
}
如果(!ipList.contains(ipAddress)){
name=新字符串(receivePacket.getData());
ipList.add(ipAddress);
姓名列表。添加(姓名);
receiveData=null;
}
试一试{
睡眠(10);
}
捕捉(中断异常e){
//System.out.println(“\nInterrupted!”);
返回;
}
}
}
});
collect.start();

while(System.currentTimeMillis())您真的不应该直接捕获异常。除非我使用另一个循环,如:
while(serverIsOpen){…}
因此,当您将其设置为false时,线程将退出。这是我的旧代码和短代码。我知道异常功能。请忽略它,如果有,请给我解决方案。@rekireMore或更少您的代码就可以了。我只会改进它,为服务器搜索添加一个超时。我不确定您的调用是否真的会阻塞(但我认为是这样)如果只有一台服务器,则需要10秒钟才能看到服务器。这可以用更好的方法完成。