使用socket通信本地電腦與阿里雲服務器報錯connection time out及解決方案(java語言)


本地電腦使用客戶端,阿里雲服務器使用遠程桌面用服務器端

測試代碼如下(代碼來源於網絡,已測試通過):

客戶端:

 1 import java.net.*;  2 import java.io.*;  3 import java.util.concurrent.ExecutionException;  4 
 5 public class TcpClient {  6     public static void main(String[] args) throws Exception{  7         try{  8             //建立套接字
 9             Socket socket  = null; 10             socket = new Socket(); 11             socket.connect(new InetSocketAddress("服務端ip",7327),8000); 12             //建立連接
13             InputStreamReader Sysin = new InputStreamReader(System.in); 14             BufferedReader SysBuf = new BufferedReader(Sysin); 15 
16             InputStreamReader Socin = new InputStreamReader(socket.getInputStream()); 17             BufferedReader SocBuf = new BufferedReader(Socin); 18 
19             PrintWriter Socout = new PrintWriter(socket.getOutputStream()); 20 
21             //進行通信
22             String readline = SysBuf.readLine(); 23             while(!readline.equals("bye")){ 24  Socout.println(readline); 25  Socout.flush(); 26                 //System.out.println("Client:"+readline);
27 
28                 System.out.println("Server:"+SocBuf.readLine()); 29                 readline = SysBuf.readLine(); 30  } 31 
32             //關閉IO和Socket
33  Socout.close(); 34  Socin.close(); 35  socket.close(); 36         } catch (Exception e){ 37             System.out.println("Error:"+e); 38  } 39  } 40 }
client

服務端:

 1 import java.net.*;  2 import java.io.*;  3 import java.util.concurrent.ExecutionException;  4 
 5 public class TcpServer {  6     public static void main(String [] args) throws Exception{  7         try{  8             //建立套接字
 9             ServerSocket server = new ServerSocket(7327); 10             //監聽
11             Socket socket = server.accept(); 12             //建立連接
13             InputStreamReader Sysin = new InputStreamReader(System.in); 14             BufferedReader SysBuf = new BufferedReader(Sysin); 15 
16             InputStreamReader Socin = new InputStreamReader(socket.getInputStream()); 17             BufferedReader SocBuf = new BufferedReader(Socin); 18 
19             PrintWriter Socout = new PrintWriter(socket.getOutputStream()); 20 
21             //通信
22             System.out.println("Client:" + SocBuf.readLine()); 23             String readline = SysBuf.readLine(); 24             while(!readline.equals("bye")){ 25  Socout.println(readline); 26  Socout.flush(); 27                 //System.out.println("Server:" + readline);
28 
29                 String rl = SocBuf.readLine(); 30                 if(!rl.equals("ok")) 31                     System.out.println("Client:"+rl); 32                 else
33                     break; 34 
35                 readline = SysBuf.readLine(); 36  } 37 
38             //關閉IO/socket
39  Socout.close(); 40  Socin.close(); 41  server.close(); 42         } catch (Exception e){ 43             System.out.println("Error:"+e); 44  } 45  } 46 }
server

實現的功能是雙方對話實時通信,先是client說話,然后服務器再說話,以bye和ok結束通話。

我的問題解決過程:

1:本地電腦同時運行客戶端與服務器端正常!ip當然是本機電腦啦,我用的localhost也ok。

2:服務器(阿里雲)同時運行客戶端與服務端正常!ip是服務端私網,注意這一點!(注意,先運行服務端代碼,因為服務器的一些端口已經被占用了,比如別人好使的12345端口我使用就不行,服務器端會告訴你端口不可使用,你隨意更改一下就ok了)。

3:本機運行客戶端,服務器運行服務端,ip是服務器私網時報錯連接超時,ip時服務器公網時也是同樣錯誤!嘗試使用本機ping私網(剛開始還不知道是私網),請求超時,當然啦,私網是那么容易給外網用的嗎?請求超時太常見了,而阿里雲給外網用的ip是公網啊各位!所以我的主機只能使用公網,ping公網正常。

解決方案:

登錄阿里雲服務器,去安全組規則中添加入方向規則,添加你之前用的端口號就Ok啦,然后再測試就ok了。

就是這個——>添加規則

 

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM