我正在开发一个android应用程序,它必须在两部手机之间进行实时通信。有一个客户端和服务器在两个电话上运行,我有一个中央服务器,每个服务器的公共IP和端口都被交换。两个电话都在监听中央服务器的通知。连接拒绝错误,同时在android中通过使用打孔的TCP套接字进行通信
假设两部手机都通过中央服务器接收对方的公共IP和端口,然后在每部手机上启动客户端,然后再启动服务器(这是因为它以其他顺序失败,因为我在做打孔我使用相同的端口进行收听和发送)。
以下是我如何启动服务器和客户端
socket=new Socket();
try {
socket.setReuseAddress(true);
} catch (SocketException e) {
e.printStackTrace();
}
try {
socket.bind(new InetSocketAddress(<Port of this phone>));
} catch (IOException e) {
e.printStackTrace();
}
ClientThread clientThread=new ClientThread(<IP of the other phone>,<Port of the other phone>,socket);
clientThread.execute();
Thread serverThread = new Thread(new ServerThread(<IP of this phone>,<Port of this phone>));
serverThread.start();
这是我的服务器
public class ServerThread implements Runnable {
private String serverIP;
private int serverPort;
private ServerSocket serverSocket;
public ServerThread(String serverIP,int serverPort){
this.serverIP=serverIP;
this.serverPort=serverPort;
}
public void run() {
try {
serverSocket = new ServerSocket();
serverSocket.setReuseAddress(true);
serverSocket.bind(new InetSocketAddress(serverPort));
while (true) {
// listen for incoming clients
Socket client = serverSocket.accept();
Log.d("serverstatus","Connected :)");
if(connected)
//then pass messages
}
}
catch (Exception e) {
Log.d("serverstatus","Error");
e.printStackTrace();
}
}
}
代码这是我的客户端代码
public class ClientThread extends AsyncTask<String,String,String>{
private String serverIP;
private int serverPort;
private Socket socket;
public ClientThread(String serverip,int serverport,Socket mySocket)
{
serverIP=serverip;
serverPort=serverport;
socket=mySocket;
}
@Override
protected String doInBackground(String... arg0) {
try {
while(true)
{
socket.connect(new InetSocketAddress(serverIP, serverPort));
if(socket.isConnected())
{
//pass messages
}
}
}
catch (Exception e) {
Log.d("clientstatus","Error");
e.printStackTrace();
//try again
ClientThread clientThread=new ClientThread(serverIP,serverPort,socket);
clientThread.execute();
}
}
}
预期的是,phone1到phone2的第一次连接尝试失败后(因为phone2的端口尚未打开),phone1的端口变为开放(因为对phone2的请求),然后当电话2尝试与phone1通信时成功是因为phone1的端口现在是开放的,phone2也是如此(因为phone2对phone1的请求)。
它仍然显示连接拒绝每次我尝试连接,然后'套接字关闭'异常被抛出。
我在做什么错,有人可以帮助我这个。
'拒绝连接'通常不表示防火墙问题,'套接字关闭'仅表示您自己关闭套接字,然后继续使用它:您的部分出现编程错误。 – EJP 2014-10-04 10:30:26
@ejp在连接完成之前,我还没有关闭代码中的任何地方的套接字,并且套接字关闭错误将在下一次尝试中建立连接。 (第一次尝试显示连接被拒绝) – 2014-10-04 10:38:56