ServerSocket与Socket简解

来源:互联网 发布:网络大电影制作流程 编辑:程序博客网 时间:2024/06/10 23:04

一直认为,实践出真知,理论是基石。没有理论的实践是空虚和盲目的。

【1】Socket

socket是什么?

百度百科:网络上的两个程序通过一个双向的通信连接实现数据的交换,这个连接的一端称为一个socket。

建立网络通信连接至少要一对socket。


Java网络编程第四版如是说:

Socket又称套接字,应用程序通常通过套接字向网络发出请求或者应答网络请求。

Socket是建立网络连接时使用的,在连接成功时,应用程序两端都会产生一个socket实例。操作这个实例,完成所需的会话。

Socket 允许程序员将网络连接看作是另外一个可以读写字节的流。

即,Socket是网络编程接口,是用来进行网络通信的。客户端与服务器进行一次网络通信,肯定要建立连接,那么在连接建立时,在客户端与服务器端都会产生一个socket实例。客户端和服务器可以通过该实例进行信息的发送与接收。


它可以完成7个基本操作:

1.连接远程机器;
2.发送数据;
3.接受数据;
4.关闭连接;
5.绑定端口;
6.监听入站数据;
7.在绑定端口上接受来自远程机器的连接。

Java的socket类(客户端和服务器都可以使用)提供了对应前4个操作的方法。后面三个仅服务器需要,即等待客户端的连接。这些操作由ServerSocket类实现。

一旦建立连接,本地和远程主机就从这个socket得到输入流和输出流,使用这两个流相互发送数据。连接是全双工的,两台主机都可以同时发送和接收数据。


【2】Socket的构造

① 你可以直接使用带参构造方法进行实例化:

Socket socket = new Socket("127.0.0.1",8989);

需要注意的时,这不只是实例化对象,还会在网络上建立连接。如果连接建立成功,将会在客户端和服务端产生socket实例。如果失败,将会抛出异常。

可以为连接设置一个超时时间,按毫秒度量:

socket.setSoTimeOut(15000);

② 也可以使用无参构造方法并进行地址连接

Socket socket = new Socket();SocketAddress address = new InetSocketAddress("127.0.0.1",8989);socket.connet(address);

【3】服务器Socket–ServerSocket

上面说客户端就是向监听连接的服务器打开一个socket的程序。

对于接受连接的服务器,Java提供了一个ServerSocket类表示服务器socket。

从基本上来讲,服务器Socket在服务器上运行,监听入站TCP连接。每个服务器Socket监听服务器机器上的一个特定端口。当远程主机上的一个客户端尝试连接这个端口时,服务器就被唤醒。协商建立客户端和服务器之间的连接,并返回一个常规的Socket对象。表示两台主机之间的Socket。换句话说,服务器socket等待连接,而客户端socke发起连接。一旦ServerSocket建立了连接,服务器会使用一个常规的Socket对象向客户端发送数据。

数据总是通过常规socket传输。


在Java中,服务器程序的基本生命周期如下:

1.使用一个ServerSocket()构造函数在一个特定端口创建一个新的ServerSocket。

2.ServerSocket使用其accept()方法监听这个端口的入站连接。accept()会一直阻塞,直到一个客户端尝试建立连接,此时accept()将返回一个连接客户端和服务器的socket对象。

也就是,客户端和服务器之间连接位于服务器端的socket。

3.根据服务器的类型,会调用socket的getInputStream()方法或getOutputStream()方法,或者这两个方法都调用,以获得与客户端通信的输入和输出流。

4.服务器和客户端根据已协商的协议交互,直到要关闭连接。

5.服务器或客户端(或二者)关闭连接。

6.服务器返回到步骤2,等待下一次连接。


【4】Socket通信模型图

这里写图片描述


【5】本地和远程

本地,就是客户端发起的主机。远程,就是服务器端的主机。

这里以客户端进行测试,代码如下:

                //获取远程请求地址和端口                InetAddress inetAddress = client.getInetAddress();                int port = client.getPort();                String hostAddress = inetAddress.getHostAddress();                String hostName = inetAddress.getHostName();                InetAddress localHost = inetAddress.getLocalHost();                System.out.println("远程主机 :"+inetAddress+",远程端口:"+port+",远程hostAddress:"+hostAddress+",远程hostName:"+hostName);                //获取发起的地址和端口                InetAddress localAddress = client.getLocalAddress();                int localPort = client.getLocalPort();                String hostAddress2 = localAddress.getHostAddress();                String hostName2 = localAddress.getHostName();                System.out.println("本地主机 :"+localAddress+",本地端口 :"+localPort+",本地hostAddress:"+hostAddress2+",本地hostName:"+hostName2);

这里连续发起了两次客户端请求,每次都实例化一个新的socket。需要注意的时远程端口和本地端口。

远程端口(对于客户端socket而言)通常是一个标准委员会预先分配的已知端口,而本地端口与远程端口不同,通常是由系统在运行时从未使用的空闲端口中选择。

这里写图片描述

具体实战(完整源码)看下一篇博客socket编程实践

原创粉丝点击