何咏明
(长江工程职业技术学院,武汉 430212)
所谓socket通常也称作“套接字”,用于描述IP地址和端口,是一个通信链的句柄。应用程序通常通过“套接字”向网络发出请求或者应答网络请求。
以J2SDK-1.6为例,Socket和ServerSocket类库位于java.net包中。ServerSocket用于服务器端,Socket是建立网络连接时使用的。在连接成功时,应用程序两端都会产生一个Socket实例,操作这个实例,完成所需的会话。对于一个网络连接来说,套接字是平等的,并没有差别,不因为在服务器端或在客户端而产生不同级别。不管是Socket还是ServerSocket它们的工作都是通过SocketImpl类及其子类完成的。
java.net.Socket继承于java.lang.Object,有9个构造器,其方法并不多,下面介绍使用最频繁的3个方法,其它方法大家可以见JDK-1.6文档。
·Accept方法用于产生“阻塞”,直到接受到一个连接,并且返回一个客户端的Socket对象实例。“阻塞”是一个术语,它使程序运行暂时“停留”在这个地方,直到一个会话产生,然后程序继续;通常“阻塞”是由循环产生的。
·getInputStream方法获得网络连接输入,同时返回一个IutputStream对象实例。
·getOutputStream方法连接的另一端将得到输入,同时返回一个OutputStream对象实例。
Socket通讯原理图如图1。
服务器:创建ServerSocket于指定的端口监听客户端的连接请求,有连接为服务端创建一个可以通讯的socket。
客户端:使用Socket对网络上某一个服务器的某一个端口发出连接请求,一旦连接成功,就能进行socket通讯。借助于上述原理开发的简易通讯程序如图2。
创建ServerSocket对应的服务的端口号,创建一个线程去监听客户端的连接情况,如果有客户端的连接则把一个JFrame服务端通讯的窗口包装成一个线程去与客户端进行socket通讯,直到客户端或者是服务端发出bye才结束通讯。
图1 Socket通讯原理图
图2 简单通讯程序
(1)服务端通讯在构造函数中通过传递的socket对象来获取相关的输入和输出流,同时把窗体自身显示出来。
关键代码:
(2)发送消息
服务器可以随时向客户机发送消息,下面的代码是发送用的代码,同时也监听客户机的情况,当客户机向服务器发送bye时,延迟2秒关闭自身,此时由于客户端已经接收到bye能够进行自身窗口的关闭操作而先期关闭客户端的窗口。
关键代码:
(3)接收消息
接收消息采用线程来完成,因为消息的到达是随机的,我们不能让CPU来等待一个随机的消息的到达,此时改善性能的最好的办法就是使用线程,让CPU从繁重的等待中解脱出来而做重要的事情。下面是接收消息的代码,当接收到一个bye时关闭相关的通讯并退出应用程序。
客户机采用对话框的形式创建窗口,通过构造函数来侦听指定IP地址上的端口号,同时添加窗口的关闭事件,并使自身显示出来。
构造函数关键代码:
客户机的其它通讯与服务器的代码是一致的,在此不再重复。