使用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 }
服务端:
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 }
实现的功能是双方对话实时通信,先是client说话,然后服务器再说话,以bye和ok结束通话。
我的问题解决过程:
1:本地电脑同时运行客户端与服务器端正常!ip当然是本机电脑啦,我用的localhost也ok。
2:服务器(阿里云)同时运行客户端与服务端正常!ip是服务端私网,注意这一点!(注意,先运行服务端代码,因为服务器的一些端口已经被占用了,比如别人好使的12345端口我使用就不行,服务器端会告诉你端口不可使用,你随意更改一下就ok了)。
3:本机运行客户端,服务器运行服务端,ip是服务器私网时报错连接超时,ip时服务器公网时也是同样错误!尝试使用本机ping私网(刚开始还不知道是私网),请求超时,当然啦,私网是那么容易给外网用的吗?请求超时太常见了,而阿里云给外网用的ip是公网啊各位!所以我的主机只能使用公网,ping公网正常。
解决方案:
登录阿里云服务器,去安全组规则中添加入方向规则,添加你之前用的端口号就Ok啦,然后再测试就ok了。
就是这个——>添加规则