我正在開發一個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