编者最近想用Socket编程的知识做一个类似QQ的即时通讯软件,但后来发现,以前的编写的Socket程序都是在局域网内部进行通讯,而编写这个通讯软件就必须用到Socket的跨外网通讯知识。想解决这个问题,我们需要掌握端口映射的知识。这次,就让小编来给大家补补课吧。
一、什么是端口映射:
端口映射就是将外网主机的IP地址的一个端口映射到内网中一台机器,提供相应的服务。当用户访问该IP的这个端口时,服务器自动将请求映射到对应局域网内部的机器上。端口映射有动态和静态之分。
通俗一点来说,就是将此服务端进程的内网访问入口映射到外网端口,然后客户端进程只需要从外网的访问入口进入即可访问此服务端进程。
二、如何配置端口映射:
1.通过路由器配置
2.使用第三方软件如“花生壳”
注:编者用的是校园网,所以只能使用第三方软件进行端口配置。所以编者将重点讲一讲“花生壳”的配置方法
①官网下载花生壳:
②注册用户:
这里注册成功后会自动获得一个域名
③登录客户端
并点击内网穿透:
④设置内网穿透:
⑤设置完成
以后直接使用外网访问地址就行了。
注意:在使用端口映射的过程中,“花生壳”客户端需要一直处于开启状态,否则,端口映射将失效。
//客户端代码
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.OutputStreamWriter;
import java.io.PrintWriter;
import java.net.InetAddress;
import java.net.Socket;
public class ClientSocketTest {
public static void main(String[] args)throws IOException{
InetAddress inetAddress = InetAddress.getByName("外网ip");
String hostAddr = inetAddress.getHostAddress();
System.out.println("host addr:"+hostAddr);
int port = 28621;//这里填外网访问端口
Socket clientSocket = new Socket(hostAddr,port);
BufferedReader in = new BufferedReader(new InputStreamReader(System.in));
BufferedReader reader = new BufferedReader(new InputStreamReader(clientSocket.getInputStream()));
PrintWriter writer = new PrintWriter(new OutputStreamWriter(clientSocket.getOutputStream()), true);
String str = null;
while(true){
str = in.readLine();
writer.println(str);
if(str.equals("quit"))
break;
System.out.println(reader.readLine());
}
clientSocket.close();
in.close();
reader.close();
writer.close();
}
}