在 Android/Java 中的 S/C 之间建立 TCP 连接
Setting up TCP connections between S/C in Android/Java
我正在设计一个all-to-allAndroid程序,包括5个节点:
- 每个节点同时充当服务器和客户端
- 每个节点都会连接到其他 4 个节点。
- 每个节点都会监听并接受其他 4 个节点的连接。
虽然我遇到的问题是,如果 5 个节点按以下顺序启动:1-2-3-4-5,Node1 的 tcp 连接请求将不会被 Node2 接受,因为 Node2 的启动时间晚于1.
为了解决这个问题,我试过使用 isConnected()
,但它总是 returns true
即使只启动了 Node1。
所以我的问题是如何在 3 个 Android 节点之间建立 all-to-all TCP 连接。
附上我的代码:
private class ClientTask extends Thread {
Socket[] s1 = new Socket[5];
@Override
public void run() {
int flag=1;
for (int i = 0; i < 5; i++) {
if(flag==0) i--;
try {
System.out.println("Begin making connections!");
//s1[i] = new Socket(InetAddress.getByAddress(new byte[]{10, 0, 2, 2}),REMOTE_PORT[i]);
s1[i] = new Socket();
s1[i].connect(new InetSocketAddress("10.0.2.2", REMOTE_PORT[i]),1000);
flag=1;
} catch (UnknownHostException e) {
System.out.println("ClientTask UnknownHostException");
flag=0;
} catch (IOException e) {
//Error happens when set_redir.py is not run
System.out.println("ClientTask socket IOException");
flag=0;
}
}
}
}
服务器代码:
public class ServerTask extends Thread {
ServerSocket serverSocket = null;
public void run() {
System.out.println("Start listening!");
Socket socket = null;
try {
serverSocket = new ServerSocket(10000);
} catch (IOException e) {
System.out.println("Error when creating serversocket!");
}
int flag=1;
for (int i = 0; i < 5; i++) {
if(flag==0) i--;
try {
// waiting for incoming socket
socket = serverSocket.accept();
DataOutputStream out = new DataOutputStream(socket.getOutputStream());
try{
out.writeBytes("You are connected to avd: " + (myPort-11108)/4);
}catch (IOException e){
System.out.println("Error here!");
}
flag=1;
// new thread for the full TCP connection
System.out.println("Receiving new TCP connection from " + socket.getRemoteSocketAddress());
tt[i] = new tcpThread(socket, i);
tt[i].start();
} catch (IOException e) {
System.out.println("ERROR: server socket");
flag=0;
}
}
System.out.println("End listening...");
}
}
在从 Whosebug 和 google 做了一些研究后,我找到了检测服务器是在线还是离线的方法。我正在写以下笔记,以防其他人将来遇到同样的问题:>
而不是使用isConnected()
,只要连接确实是由客户端发出的,它总是true
,无论服务器在线与否,我们可以使用[=12] =] 或 readLine()
.
read()
将 return -1
如果由于连接丢失、服务器关闭等原因实际未建立连接
readLine()
将一直计时,情况与上述相同。
因此我们可以检查 return 值是否为 -1
或超时 readLine()
以检查 TCP 连接的状态。
我正在设计一个all-to-allAndroid程序,包括5个节点:
- 每个节点同时充当服务器和客户端
- 每个节点都会连接到其他 4 个节点。
- 每个节点都会监听并接受其他 4 个节点的连接。
虽然我遇到的问题是,如果 5 个节点按以下顺序启动:1-2-3-4-5,Node1 的 tcp 连接请求将不会被 Node2 接受,因为 Node2 的启动时间晚于1.
为了解决这个问题,我试过使用 isConnected()
,但它总是 returns true
即使只启动了 Node1。
所以我的问题是如何在 3 个 Android 节点之间建立 all-to-all TCP 连接。
附上我的代码:
private class ClientTask extends Thread {
Socket[] s1 = new Socket[5];
@Override
public void run() {
int flag=1;
for (int i = 0; i < 5; i++) {
if(flag==0) i--;
try {
System.out.println("Begin making connections!");
//s1[i] = new Socket(InetAddress.getByAddress(new byte[]{10, 0, 2, 2}),REMOTE_PORT[i]);
s1[i] = new Socket();
s1[i].connect(new InetSocketAddress("10.0.2.2", REMOTE_PORT[i]),1000);
flag=1;
} catch (UnknownHostException e) {
System.out.println("ClientTask UnknownHostException");
flag=0;
} catch (IOException e) {
//Error happens when set_redir.py is not run
System.out.println("ClientTask socket IOException");
flag=0;
}
}
}
}
服务器代码:
public class ServerTask extends Thread {
ServerSocket serverSocket = null;
public void run() {
System.out.println("Start listening!");
Socket socket = null;
try {
serverSocket = new ServerSocket(10000);
} catch (IOException e) {
System.out.println("Error when creating serversocket!");
}
int flag=1;
for (int i = 0; i < 5; i++) {
if(flag==0) i--;
try {
// waiting for incoming socket
socket = serverSocket.accept();
DataOutputStream out = new DataOutputStream(socket.getOutputStream());
try{
out.writeBytes("You are connected to avd: " + (myPort-11108)/4);
}catch (IOException e){
System.out.println("Error here!");
}
flag=1;
// new thread for the full TCP connection
System.out.println("Receiving new TCP connection from " + socket.getRemoteSocketAddress());
tt[i] = new tcpThread(socket, i);
tt[i].start();
} catch (IOException e) {
System.out.println("ERROR: server socket");
flag=0;
}
}
System.out.println("End listening...");
}
}
在从 Whosebug 和 google 做了一些研究后,我找到了检测服务器是在线还是离线的方法。我正在写以下笔记,以防其他人将来遇到同样的问题:>
而不是使用isConnected()
,只要连接确实是由客户端发出的,它总是true
,无论服务器在线与否,我们可以使用[=12] =] 或 readLine()
.
read()
将 return -1
如果由于连接丢失、服务器关闭等原因实际未建立连接
readLine()
将一直计时,情况与上述相同。
因此我们可以检查 return 值是否为 -1
或超时 readLine()
以检查 TCP 连接的状态。