socket通信方式
通常使用的是socket通信模式为c/s模式,就是通过服务端创建连接,并绑定监听相关的端口,客户端通过连接至相应的端口,实现使用tcp的三次握手来进行可靠性连接,从而达到数据传输。如果对应的客户端和服务端在同一台服务器上,因是数据内部通信方式,可直接相连接。但是当我们的客户端和服务端分别部署在不同的服务器上,有时候会出现客户端连接的时候提示connect refuse,连接拒绝,的问题。这种情况是因为防火墙开启(*前提是服务端程序正常启动,并正常监听对应的端口*),说明服务端监听的端口没有放行,解决方法,而通过关闭防火墙,但是这并不是一种好的方法,因为毕竟防火墙为了保护服务器免予收到外部的攻击,从而导致服务瘫痪。为了解决该方法,可以将我们需要监听的端口配置在防火墙配置表里,让其放行服务监听的端口,这样客户端就能正常的连接至服务端,并开始的数据的发送接收处理。
如何将监听的端口配置防火墙配置表中,让其放行端口,如下所示:
(1)可以在/etc/sysconfig/iptables文件中配置将需要放行的端口进行配置,之后重启防火墙,这样该端口每次接收连接请求的时候就会进行放行,就不会拦截,导致连接被拒绝的问题。如图所示:
如上如所示,默认的放行的端口为22,可以将自己使用的端口添加至该文件中,之后重启防火墙命令:service iptables restart.
(2)直接通过命令行累添加
查看防火墙规则及编号:
iptables -nL --line-number
添加端口命令:
iptables -A INPUT -p tcp -m state --state NEW -m tcp --dport 端口号 -j ACCEPT
保存执行的命令:
service iptalbes save
顺带介绍其他的几个参数的含义:
–A 参数就看成是添加一条规则
–p 指定是什么协议,我们常用的tcp 协议,当然也有udp,例如53端口的DNS
–dport 就是目标端口,当数据从外部进入服务器为目标端口
–sport 数据从服务器出去,则为数据源端口使用
–j 就是指定是 ACCEPT -接收 或者 DROP 不接收
-s 禁止某个IP的访问:
例如: iptables -A INPUT -p tcp -s 192.168.1.1 -j DROP 表示禁止该IP访问该服务
-D 删除某个规则
例如: iptables -D INPUT 2 表示删除编号为2的规则、
2. 还存在一种情况是,频繁的启动服务端程序导致系统内核中的文件描述符所占用的端口,尚未被释放掉,需要等待一段时间释放改端口的占用,之后再启动方可成功启动服务。但是并不能都等待,可在编写程序的时候,设置socket地址重用,setblockopt该方法设置地址重用。
3,再试使用中必须保证c/s两端的ip和端口一致,否则依旧显示的是connection refused错误信息,该情形导致的是,客户端发送syn连接请求,因ip不匹配找不到对应的ip匹配对应的端口监听的服务端集成,连接内核会向客户端发送一个RST回应包,表示重连,表名当前的链接请求的地址不存在对应进程的服务端,客户端在接受到RST数据包,做出应答,并且抛出异常connection refused的错误信息。