Android 安卓网络搜索

Android 安卓网络搜索,android,sockets,wifi,Android,Sockets,Wifi,我正在创建一个应用程序,该应用程序将要求人们通过WiFi相互连接,以使他们能够一起玩 但是,我不想通过IP地址搜索一个人,我想搜索当前所有主持游戏的人,并更新我可以点击连接的人的列表 服务器 public class server extends AppCompatActivity { int numPlayers=0; int count = 0; TextView infoip, msg; String message = ""; ServerSocket serverSocket; pri

我正在创建一个应用程序,该应用程序将要求人们通过WiFi相互连接,以使他们能够一起玩

但是,我不想通过IP地址搜索一个人,我想搜索当前所有主持游戏的人,并更新我可以点击连接的人的列表

服务器

public class server extends AppCompatActivity {
int numPlayers=0;
int count = 0;
TextView infoip, msg;
String message = "";
ServerSocket serverSocket;
private String name="server";

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_server);
    Bundle b = this.getIntent().getExtras();
    numPlayers = b.getInt("numPlayers");
    //name = b.getString("name");

    infoip = (TextView) findViewById(R.id.serverText);
    msg = (TextView) findViewById(R.id.serverPlayerCount);

    infoip.setText("Hosting...");

    Thread socketServerThread = new Thread(new SocketServerThread());
    socketServerThread.start();
    ButtClickListener();
}
@Override
protected void onDestroy() {
    if (serverSocket != null) {
        try {
            serverSocket.close();
        } catch (IOException e) {
            e.printStackTrace();
        }
        super.onDestroy();
    }
 }
private void ButtClickListener() {
    Button cancel = (Button) findViewById(R.id.severQuit);
    cancel.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View v) {
            finish();
        }
    });
}

private class SocketServerThread extends Thread 

{
static final int SocketServerPORT = 8080;

@Override
public void run() {
    try {
        serverSocket = new ServerSocket(SocketServerPORT);
        server.this.runOnUiThread(new Runnable() {

            @Override
            public void run() {
            }
        });

        while (true) {
            Socket socket = serverSocket.accept();
            count++;
            message += "#" + count + " from " + socket.getInetAddress()
                    + ":" + socket.getPort() + "\n";

            server.this.runOnUiThread(new Runnable() {

                @Override
                public void run() {
                    msg.setText(message);
                }
            });

            SocketServerReplyThread socketServerReplyThread = new SocketServerReplyThread(
                    socket, count);
            socketServerReplyThread.run();

        }
    } catch (IOException e) {
        e.printStackTrace();
    }
}

}

private class SocketServerReplyThread extends Thread {

private Socket hostThreadSocket;

SocketServerReplyThread(Socket socket, int c) {
    hostThreadSocket = socket;
    count = c;
}

@Override
public void run() {
    OutputStream outputStream;
    String msgReply = "You are the #" + count+" person out of "+count+"/"+numPlayers;

    try {
        outputStream = hostThreadSocket.getOutputStream();
        PrintStream printStream = new PrintStream(outputStream);
        printStream.print(msgReply);
        printStream.close();

        message += msgReply + "\n";

        server.this.runOnUiThread(new Runnable() {

            @Override
            public void run() {
                msg.setText(message);
            }
        });

    } catch (IOException e) {
        e.printStackTrace();
        message += "Error " + e.toString() + "\n";
    }

    server.this.runOnUiThread(new Runnable() {
        @Override
        public void run() {
            msg.setText(message);
        }
    });
}

}

   private String getIpAddress() {
        String ip = "";
        try {
            Enumeration<NetworkInterface> enumNetworkInterfaces = NetworkInterface
                    .getNetworkInterfaces();
            while (enumNetworkInterfaces.hasMoreElements()) {
                NetworkInterface networkInterface = enumNetworkInterfaces
                        .nextElement();
            Enumeration<InetAddress> enumInetAddress = networkInterface
                    .getInetAddresses();
            while (enumInetAddress.hasMoreElements()) {
                InetAddress inetAddress = enumInetAddress.nextElement();

                if (inetAddress.isSiteLocalAddress()) {
                    ip += "SiteLocalAddress: "
                            + inetAddress.getHostAddress() + "\n";
                }

            }

        }

    } catch (SocketException e) {
        // TODO Auto-generated catch block
        e.printStackTrace();
        ip += "Something Wrong! " + e.toString() + "\n";
    }

    return ip;
}
}
上面的代码将在我通过单击找到服务器时实现,我将能够通过名称连接到服务器,但我不知道如何搜索服务器

如何修改客户端,使其在运行时搜索所有可能的服务器并返回服务器名称列表


谢谢。

我认为这是一个很好的网络服务发现用例

你应该看看谷歌附近的API。根据我的理解,我必须修改我的服务器端以进行注册,对吗?是的,服务器应用程序应该注册服务,然后客户端可以发现该服务。我认为与您当前的方法相比,它实际上更容易实现
public class ClientThread implements Runnable {

    public void run() {
        try {
            InetAddress serverAddr = InetAddress.getByName(serverIpAddress);
            Socket socket = new Socket(serverAddr,
                    8080);
            connected = true;
            while (connected) {
                try {
                } catch (Exception e) {
                }
            }
            socket.close();
        } catch (Exception e) {
            connected = false;
        }
    }
}