无线P2P - 使用什么主机/如何获得它?

时间:2014-02-20 11:07:50

标签: android p2p

我正在尝试获取WiFi Peer-to-Peer的运行示例,其中一个用户可以向另一个用户发送一个简单的字符串。
我已经可以获得可用客户列表,但我仍然无法连接到客户端:

02-20 09:59:12.789: E/TTT(4176): Host is unresolved: 5e:f8:a1:36:ee:64

socket.connect((new InetSocketAddress(host, 8888)), 5000);

我猜我需要IP地址而不是MAC地址,但我该如何获取? 或者这是一个不同的问题?

解决方案:
我向两个客户端显示他们自己的IP地址,因此您可以输入要连接的IP(另一个IP) - 它可以这样工作,虽然它不是一个完美的解决方案。

2 个答案:

答案 0 :(得分:0)

试试这个..

socket = new Socket();
        InetSocketAddress socketAddress = new InetSocketAddress(SERVER_IP, SERVERPORT);
        socket.connect(socketAddress);

答案 1 :(得分:-2)

您在一台设备上打开一个服务器套接字并在另一台设备上使用客户端套接字连接,然后在客户端上打开套接字并从服务器连接到客户端,然后它们变得相等(P2P)。

您确实需要连接设备的IP地址,并且需要将端口设置为您在服务器上打开的端口。如果在PC上执行此操作,请确保正确设置防火墙,如果您安装了防火墙应用程序,这也适用于Android。创建服务器套接字时,您只需设置端口(您可以在此处添加IP地址,但这些仅用于过滤请求)。

您需要IP地址,因为TCP和UDP协议依赖于Internet协议(IP)才能工作。本文将详细解释这一点http://en.wikipedia.org/wiki/TCP/IP_model,但您也可以看到有关网络堆栈和OSI模型的任何教程或解释。

在服务器端,您可以编写如下内容:

ServerSocket serverSocket = null;
Socket clientSocket = null;
try {
    serverSocket = new ServerSocket(8000);
    clientSocket = serverSocket.accept();

    ObjectOutputStream oos = new ObjectOutputStream(clientSocket.getOutputStream());
    ObjectInputStream ois = new ObjectInputStream(clientSocket.getInputStream());

    oos.writeObject("WELCOME");
    oos.flush();
} catch (Exception e) {
    e.printStackTrace();
}

不要把它放在UI线程上,因为你会得到一个例外。相反,创建名为Networking或其他东西的AsyncTask或工作线程并在那里做网络工作。此外,在连接时,您可能会使用while(isConnected)循环创建阻塞方法,以便从套接字中侦听数据。

在客户端,只需使用以下内容连接到此打开的套接字:

Socket socket;
try {
    socket = new Socket("IP.OF.HOST.DEVICE", 8000);
    ObjectInputStream input = new ObjectInputStream(socket.getInputStream());
    ObjectOutputStream output = new ObjectOutputStream(socket.getOutputStream());
    System.out.println("Connected");
    System.out.println("Input: " + input.readObject());
    while (true) {
        BufferedReader br = new BufferedReader(new InputStreamReader(System.in));

        String s = br.readLine();
        output.writeObject(s);
        output.flush();
    }
} catch (Exception e) {
    e.printStackTrace();
}
//Close resources when you don't need them especially sockets.
socket.close();