这段时间在看孙卫琴的网络编程,这本书很不错。梳理下学习知识。
socket是什么?socket可以看做是计算机进程间通信的收发器。socket实际上是传输层为应用层提供的一个抽象,应层层需要用socket来实现进程间的通信(通常这些进程处于不同的计算机)。用socket的好处是它封装了传输层的实现细节,对于应用层而言这些传输层的细节就变得透明了。
因为socket建立在TCP/IP基础上,所以socket也分为有连接的socket和无连接的socket。其中ServerSocket(服务器socket,负责接收客户端连接),Socket(客户端socket)是有连接的socket。DatagramSocket是无连接的socket。
serverSocket的accept方法可以阻塞的接收客户端连接,一旦有客户端连接过来就返回这个客户端的socket。这样一个线程的话,不能处理多个客户连接。因此可以考虑采用非阻塞的方式使用服务器能够用一个线程就可以接收n个客户端连接。这就需要用到nio编程的知识点了。
事实上有基本功能的http服务器的实现也不是很神秘,大致过程如下:
1.服务器起一个ServerSocket,端口可以是8081
2.客户端(这里是浏览器),通过在浏览器上输入网址,比如 http://localhost:8081/index.html,会请求服务器上端口为8081的serverSocket建立连接
3.服务器上的SererSocket接收到这个连接,对请求参数进行解析,判断是GET还是POST,GET的话,这里为简单起见假设是GET。
解析参数完成后要发送响应。
http响应格式分为三部分:响应状态行,响应头及响应体。
响应状态行包含了:状态码 描述 协议版本。
响应头则包含了服务器的一些信息
响应体则是要返回的内容,可以是一个HTML流。
我们接下去要做的事就是形成这个响应,响应状态行很简单,比如如果成功的话可以发送"200 OK HTTP/1.1"这样一个字符串到通道中。
响应头可以有选择的发送。
我们主要关注的是响应体,响应体,如果是GET一个HTML的话,就需要找到服务器上这个HTML文件,将它转成流发送到通道中。
如果是请求一个Servlet,则我们要实例化出一个servlet实例,然后调用它的service方法,在service方法中我们可以根据解析请求参数时得到的请求参数来动态生成网页,其实说白了就是一大堆html片断转成流后发送到通道。
4.响 应发送完后,服务器会释放资源如与客户端的连接,服务器上文件的连接等。
5.客户端收到这个响应后,浏览器负责展示
代码连接:http://download.csdn.net/detail/zhaozhenzuo/4568592