Socket编程如何搭建一个外网可以访问的服务器

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Socket编程如何搭建一个外网可以访问的服务器相关的知识,希望对你有一定的参考价值。

我用android写了个客户端,用Java写了个服务器。但是只有手机和电脑在一个内网里面,才能通信,也就是说服务器只服务于内网。那么如何搭建一个外网可以访问的服务器呢?是否需要开设代理服务器?求详细解答~

搭建外网访问,首先你要有一台外网可访问的服务器,有以下几种方法可以实现。
一、购买外网服务器。由于服务器端使用JAVA语言开发,所以外网服务器操作系统可以是Linux或Windows,这个需要你花钱购买。如果只是测试,你可以选择购买阿里云的云服务器,非常便宜。
二、还有一种方法就是你通过花生壳之类的软件进行映射你的网络,但花生壳对长城宽带之类的网络支持不是特别好,如果需要很好的支持,那也需要花钱购买。
三、如果你是通过路由器上网,并且可以操作路由器权限且使用的是电信或者是联通的网络,那可以直接在路由器里面做端口映射,这个你可以百度一下,有很多文章讲的非常清楚,这里篇幅限制,就不贴了。
四、如果你是直接通过猫上网且使用电信或联通宽带,那可以直接使用本机外网IP访问你的程序。
以上四种方法中,最稳定的还是购买外网服务器,其它都会有各种问题,你可以选择其中适合你的一种方法。希望能帮助到你追问

我用的第四种方法,电信宽带公网IP,但是外网还是访问不了,不知道可能出了什么问题?

追答

那也是极的可能的,第四种方法只限于电信某些地市的的宽带,有些地区是光纤入户,你所看到的的公网IP其实并不是互联网惟一的公网IP,而是当地电信路由器分配的内网IP,也就是说你所用的公网IP,是当地电信路由器的外网IP,而你的设备还是在内网中。

追问

我已经解决了 是防火墙没关掉,谢谢

追答

那就好

参考技术A 步骤:
1,和代理建立tcp联接。
2,向代理发送版本的请求信息:
void CCommunicator::SendVer()

int datasize = 6;
char tempbuf[6];
tempbuf[0]=5;
tempbuf[1]=4;//标示后面所根的字接数
tempbuf[2]=0;
tempbuf[3]=1;
tempbuf[4]=2;
tempbuf[5]=3;
int senddatalen;
senddatalen=send(m_sock,(char*)tempbuf,6,0);

这一步如果失败,断开建立的tcp联接,如果成功,如果需要用户验证则进行步骤3,否则进行4.
3,如果需要用户验证,则类似:
BOOL CCommunicator::SendUserTest()

int usernamelen=0;
int userpasslen=0;
usernamelen=m_strTestUserName.GetLength();
userpasslen=m_strTestUserPass.GetLength();
char tempbuf[100];
tempbuf[0]=5;
tempbuf[1]=usernamelen;//标示后面所根的字接数
strcpy(&tempbuf[2],m_strTestUserName);
tempbuf[2+usernamelen]=userpasslen;
strcpy((char*)&tempbuf [3+usernamelen],m_strTestUserPass);
int senddatalen;
int len;
len=usernamelen+userpasslen+3;
senddatalen=send(m_sock,(char*)tempbuf,len,0);
如果失败,断开建立的tcp联接, 如果用户返回成功,步骤4.
4,发送请求的协议类似:
void CCommunicator::SendRequestUDP()

int const datasize=10;
BYTE tempbuf[datasize]; tempbuf[0]=5;
tempbuf[1]=3;//标示UDP连接
tempbuf[2]=0;
tempbuf[3]=1;
tempbuf[4]=0;
tempbuf[5]=0;
tempbuf[6]=0;
tempbuf[7]=0;
*((SHORT*)(&(tempbuf[8])))=m_uBindUDPPort; //UDP在客户端绑定的端口,就是你本地机器的做udp数据传送的端口调用
//socket函数后,再调用bind()来邦定一个端口。
char temp;
temp=tempbuf[8];
tempbuf[8]=tempbuf[9];
tempbuf[9]=temp;
int senddatalen=send(m_sock,(char*)tempbuf,datasize,0);

如果失败,断开建立的tcp联接,如果返回成功,验证完毕!步骤5
5,真正的数据传送,用代理传送的时候,数据包的前面加上10个字节类似:
void CCommunicator::CopyDataHead(BYTE * ptempbuf)

struct in_addr addr;
addr.s_addr=inet_addr(“202.220.33.333”);//这个ip是服务器端的ip
ptempbuf[0]=0;
ptempbuf[1]=0;
ptempbuf[2]=0;
ptempbuf[3]=1;
ptempbuf[4]=(char)addr.S_un.S_un_b.s_b1;
ptempbuf[5]=(char)addr.S_un.S_un_b.s_b2;
ptempbuf[6]=(char)addr.S_un.S_un_b.s_b3;
ptempbuf[7]=(char)addr.S_un.S_un_b.s_b4;
*((SHORT*)(&(ptempbuf[8])))=m_uServerUDPPort;//服务器的端口,就是你最终要发到那个服务器的端口,也就是你的qq服务器。
char temp;
temp=ptempbuf[8];
ptempbuf[8]=ptempbuf[9];
ptempbuf[9]=temp;

真正发送的时候类似:
int CCommunicator::SendBufferUDP(LPBYTE lpBuf,int nLen)

BYTE tempbuf[1000];
int iHeadData=0;
struct sockaddr_in her;
her.sin_family=AF_INET;
her.sin_addr.s_addr=inet_addr(m_szProxyAddr);//代理服务器
her.sin_port=htons(m_uSocksPort);//发送请求的时候返回的代理服务器端的端口,记住,这是最重要的。
CopyDataHead(tempbuf);
iHeadData=10;
nLen=nLen+10;
int addr_len;
addr_len=sizeof(struct sockaddr);
CopyMemory((char*)&tempbuf[iHeadData],lpBuf,nLen);
int returndatalen=sendto(m_socket,(char *)tempbuf,nLen,0,(struct sockaddr *)&her,addr_len);

关于内网用户访问外网ftp的问题:无法列出目录

大家好,

我遇到了非常棘手的问题:

我申请了一个虚拟主机,想建一个网站.

我是用的学校的校园网,我的ip是学校的内网的ip,即我的电脑需要通过学校的网关才能访问internet.

当我用我的ftp帐号访问虚拟主机的ftp的时候,可以显示登陆成功,但是一直不能列出目录(我用的是cuteftp,但是用其他的软件也是同样的问题),而当我在ftp软件中设置socket代理或者http代理后则可以正常列出目录.因此,我认为,这和我的ip有关,或者说是和我们学校的网络有关.可能是学校的路由器方面的某些配置限制了我的访问.

我想在知道有什么办法能突破这种限制呢?可以让我顺利地操作我的虚拟主机呢?

补充一下,我的虚拟主机的ftp在网吧的机器上可以正常访问,只是在学校不行.
补充:二楼:由于我是用的学校的网络,所以不可能知道路由器的密码
再补充:三楼的回答也没有说明问题...

1.用户帐号:
在Linux系统中,是通过用户帐号来标识每一个用户的,通过登录时输入不同的用户帐号和密码确定你的身份。也就是说,Linux系统通过用户帐号和管理系统的所有用户。

2.ftp:
FTP是File Transportation Protocol(文件传输协议)的缩写.FTP专门用来下载.FTP下载方式最古老,在没有WWW的日子里,FTP就已经广为使用了

3.虚拟目录:
每个 Internet 服务可以从多个目录中发布。通过以通用命名约定 (UNC) 名、用户名及用于访问权限的密码指定目录,可将每个目录定位在本地驱动器或网络上。虚拟服务器可拥有一个宿主目录和任意数量的其它发布目录。其它发布目录称为虚拟目录。
指定客户 URL 地址,服务将整个发布目录集提交给客户作为一个目录树。宿主目录是“虚拟”目录树的根。虚拟目录的实际子目录对于客户也是可用的。只有http://www.服务支持虚拟服务器;而 FTP 和 gopher 服务则只能有一个宿主目录。

注意 虚拟目录不出现在目录列表中(也称为http://www.服务的“目录浏览”)。要访问虚拟目录,用户必须知道虚拟目录的别名,并在浏览器中键入 URL,对于http://www.服务,还可在 HTML 页面中创建链接。对于 gopher 服务,可在标志文件中创建明确的链接,以便用户可访问虚拟目录。对于 FTP 服务,可使用目录注释列出虚拟目录。

4.网络操作系统
网络操作系统(NOS)是网络的心脏和灵魂,是向网络计算机提供服务的特殊的操作系统。它在计算机操作系统下工作,使计算机操作系统增加了网络操作所需要的能力。例如像前面已谈到的当在LAN上使用字处理程序时,用户的PC机操作系统的行为像在没有构成LAN时一样,这正是LAN操作系统软件管理了用户对字处理程序的访问。网络操作系统运行在称为服务器的计算机上,并由联网的计算机用户共享,这类用户称为客户。
NOS与运行在工作站上的单用户操作系统或多用户操作系统由于提供的服务类型不同而有差别。一般情况下,NOS是以使网络相关特性达到最佳为目的的,如共享数据文件、软件应用,以及共享硬盘、打印机、调制解调器、扫描仪和传真机等。一般计算机的操作系统,如DOS和OS/2等,其目的是让用户与系统及在此操作系统上运行的各种应用之间的交互作用最佳。
为防止一次由一个以上的用户对文件进行访问,一般网络操作系统都具有文件加锁功能。如果系统没有这种功能,用户将不会正常工作。文件加锁功能可跟踪使用中的每个文件,并确保一次只能一个用户对其进行编辑。文件也可由用户的口令加锁,以维持专用文件的专用性。
NOS还负责管理LAN用户和LAN打印机之间的连接。NOS总是跟踪每一个可供使用的打印机,以及每个用户的打印请求,并对如何满足这些请求进行管理,使每个端用户感到进行操作的打印机犹如与其计算机直接相连。

5.vpn

VPN的英文全称是“Virtual Private Network”,翻译过来就是“虚拟专用网络”。顾名思义,虚拟专用网络我们可以把它理解成是虚拟出来的企业内部专线。它可以通过特殊的加密的通讯协议在连接在Internet上的位于不同地方的两个或多个企业内部网之间建立一条专有的通讯线路,就好比是架设了一条专线一样,但是它并不需要真正的去铺设光缆之类的物理线路。这就好比去电信局申请专线,但是不用给铺设线路的费用,也不用购买路由器等硬件设备。VPN技术原是路由器具有的重要技术之一,目前在交换机,防火墙设备或WINDOWS2000等软件里也都支持VPN功能,一句话,VPN的核心就是在利用公共网络建立虚拟私有网。
参考技术A 去校外网吧,去校外宾馆上网。

以上是关于Socket编程如何搭建一个外网可以访问的服务器的主要内容,如果未能解决你的问题,请参考以下文章

局域网主机如何通过socket访问外网服务器?

如何使用HTTP访问自己搭建好的FTP服务器?

tcp外网通信

腾讯云服务器怎么搭建支持外网访问的mysql数据库

论自己电脑如何搭建服务器

如何利用外网服务器和本地内网机搭建反向隧道?