客户端通过socket连接服务器的方法,服务器和客户端能够通过socket进行交互
00-1010简介1、类属性2、初始化3、bind4、accept5、面试5.1、说说你对Socket和ServerSocket的理解?5.2.说说你对SocketOptions中SO_TIMEOUT的理解?5.3.构造套接字时,可以选择TCP还是UDP?我该如何选择?5.4.TCP有自动检测服务器是否存活的机制吗?有没有更好的办法?摘要
00-1010上一节,我们学习了Socket。在本文中,我们来看看ServerSocket API: Server Socket。学完这篇文章,我们可以把客户端套接字和服务器套接字串联起来,做一个真实的网络通信演示。
目录
ServerSocket的主要作用是作为服务器的Socket,接受客户端socket传输的信息,并将响应发回给客户端。它的属性非常简单,如下所示:
private boolean created=false//私有布尔绑定已创建=false//绑定私有布尔闭合=false//关闭//底层函数都依赖SocketImpl实现私有SocketImpl implServer,ServerSocket,依赖于SocketImpl在底层的能力,SocketImpl在底层的能力实现基本上是通过native方法实现的。
00-1010初始化大致可以分为两类:无参数构造函数和无参数构造函数。
无参数构造函数做的很简单,只指定SocketImpl为SocksSocketImpl类;参数构造函数有几种初始化形式。我们来看看参数最多的构造函数的源代码。
public socket (int port,int backlog,inet address bind addr)抛出io异常{//默认是SocksSocketImpl实现setImpl();//端口必须大于0小于65535if (port0 port0xffff)抛出new illegalargumentexception(端口值超出范围3360 port);//如果最大连接数小于1,则取默认的50 If(backlog 1)backlog=50;Try {//底层navtive方法bind(new inetsocketaddress(bind addr,port),backlog);} catch(security exception e){ close();扔e;} catch(io exception e){ close();扔e;}}引用端口是指ServerSocket需要绑定的本地端口。
输入backlog是指服务器接受客户端连接的队列的最大长度。这里应该注意的是,客户端连接的数量在这里不受限制。我们在JDK8版本做过实验,我们把服务器的backlog设置为1,减缓了服务器的处理速度。当服务器发出并发请求时,拒绝连接的不是第二个请求。在我们的实际工作中,最好不要用backlog来限制客户端连接数。
还需要注意的是,当backlog小于1时,backlog将被设置为默认值50。
参数InetAddress表示ip地址。
00-1010bind方法主要用于将ServerSocket绑定到本地端口。只有当我们使用无参数构造函数初始化ServerSocket时,才会使用这个方法。如果使用无参数的构造函数,它将在初始化期间绑定到本地端口。
对于无参数构造函数,我们通常这样使用:
//初始化server socket server socket=new server socket();//bind server socket . bind(new inetsocketaddress( localhost ,7007));
00-1010accept方法主要用于ServerSocket接受传入的来宾。
户端的套接字的,如果此时没有来自客户端的请求时,该方法就会一直阻塞,如果有通过 setSoTimeout 方法设置超时时间,那么 accept 只会在超时间内阻塞,过了超时时间就会抛出异常。
bind 和 accept 方法底层都是 native 方法实现,我们就不看源码了。
5、面试题
5.1、说说你对 Socket 和 ServerSocket 的理解?
答:两者我们都可以称为套接字,底层基于 TCP/UDP 协议,套接字对底层协议进行了封装,让我们使用时更加方便,Socket 常被使用在客户端,用于向服务端请求数据和接受响应,ServerSocket 常用于在服务端,用于接受客户端的请求并进行处理,两者其底层使用都是依靠 SocketImpl 的子类的 native 方法。
5.2、说说对 SocketOptions 中的 SO_TIMEOUT 的理解?
答:SocketOptions 类有很多属性设置,比如 SO_TIMEOUT 、SO_LINGER 等等,这些问题说一下自己的理解即可,可以参考 《Socket 源码及面试题》 中对各种属性的解析。
5.3、在构造 Socket 的时候,我可以选择 TCP 或 UDP 么?应该如何选择?
答:可以的,Socket 有三个参数的构造器,第三个参数表示你想使用 TCP 还是 UDP。
5.4、TCP 有自动检测服务端是否存活的机制么?有没有更好的办法?
答:有的,我们可以通过 setKeepAlive 方法来激活该功能,如果两小时内,客户端和服务端的套接字之间没有任何通信,TCP 会自动发送 keepalive 探测给服务端,预测服务端有三种情况:
服务端使用预期的 ACK 回复,说明一切正常;服务端回复 RST,表示服务端处于死机或者重启状态,终止连接;没有得到服务端的响应(会尝试多次),表示套接字已经关闭了。但我们并不建议使用这种方式,我们可以自己起一个定时任务,定时的访问服务端的特殊接口,如果服务端返回的数据和预期一致,说明服务端是存活的。
总结
Socket 和 ServerSocket 在源码方面没啥特别可说的地方,基本都是一些设置,底层实现都是 native 的方法,但面试官会从此延伸到一些网络协议方面的知识,因为这已经超出本专栏的范畴了,感兴趣的同学可以自行百度。
以上就是客户端Socket与服务端ServerSocket串联实现网络通信的详细内容,更多关于Socket与ServerSocket串联实现网络通信的资料请关注盛行IT其它相关文章!
郑重声明:本文由网友发布,不代表盛行IT的观点,版权归原作者所有,仅为传播更多信息之目的,如有侵权请联系,我们将第一时间修改或删除,多谢。