diff --git a/8.1.md b/8.1.md index 13643a96..428ecb13 100644 --- a/8.1.md +++ b/8.1.md @@ -1,8 +1,23 @@ -#8.1 webSockets +#8.1 Socket编程 +在很多底层开发者的眼里一切编程都是Socket,话虽然有点夸张,但是事实如此,现在的网络编程几乎都是用的Socket。如我们每天打开浏览器浏览网页时,浏览器的进程怎么和Web服务器进行通信的呢?当你用QQ聊天时,QQ进程怎么和服务器或者是你的好友所在的QQ进程进行通信的呢?当你打开PPstream观看视频时,PPstream进程如何视频服务器进行通信的呢?这些都是靠Socket来进行通信的,可见Soacket编程对于现在的编程来说是如何的重要,接下来我们讲介绍Go语言中如何来进行Socket编程。 +##什么是Socket? +Socket起源于Unix,而Unix/Linux基本哲学之一就是“一切皆文件”,都可以用“打开open –> 读写write/read –> 关闭close”模式来操作。Socket就是该模式的一个实现,网络的Socket数据传输是一种特殊的I/O,Socket也是一种文件描述符。Socket也具有一个类似于打开文件的函数调用Socket(),该函数返回一个整型的Socket描述符,随后的连接建立、数据传输等操作都是通过该Socket实现的。 + +常用的Socket类型有两种:流式Socket(SOCK_STREAM)和数据报式Socket(SOCK_DGRAM)。流式是一种面向连接的Socket,针对于面向连接的TCP服务应用;数据报式Socket是一种无连接的Socket,对应于无连接的UDP服务应用。 +##Socket如何通信 +网络中进程之间如何通过Socket通信呢?首要解决的问题是如何唯一标识一个进程,否则通信无从谈起!在本地可以通过进程PID来唯一标识一个进程,但是在网络中这是行不通的。其实TCP/IP协议族已经帮我们解决了这个问题,网络层的“ip地址”可以唯一标识网络中的主机,而传输层的“协议+端口”可以唯一标识主机中的应用程序(进程)。这样利用三元组(ip地址,协议,端口)就可以标识网络的进程了,网络中的进程通信就可以利用这个标志与其它进程进行交互。请看下面这个TCP/IP协议结构图 + +![](images/8.1.socket.png?raw=true) + +使用TCP/IP协议的应用程序通常采用应用编程接口:UNIX BSD的套接字(socket)和UNIX System V的TLI(已经被淘汰),来实现网络进程之间的通信。就目前而言,几乎所有的应用程序都是采用socket,而现在又是网络时代,网络中进程通信是无处不在,这就是为什么说“一切皆Socket”。 + +##TCP Socket +##UDP Socket + ## links * [目录]() * 上一节: [Web服务](<8.md>) - * 下一节: [Socket编程](<8.2.md>) + * 下一节: [webSockets](<8.2.md>) ## LastModified * $Id$ \ No newline at end of file diff --git a/8.2.md b/8.2.md index e4b10b78..5f4f86ca 100644 --- a/8.2.md +++ b/8.2.md @@ -1,7 +1,7 @@ -#8.2 Socket编程 +#8.2 webSockets ## links * [目录]() - * 上一节: [webSockets](<8.1.md>) + * 上一节: [Socket编程](<8.1.md>) * 下一节: [REST](<8.3.md>) ## LastModified diff --git a/8.3.md b/8.3.md index 6697e647..94000f82 100644 --- a/8.3.md +++ b/8.3.md @@ -1,7 +1,7 @@ #8.3 REST ## links * [目录]() - * 上一节: [Socket编程](<8.2.md>) + * 上一节: [webSockets](<8.2.md>) * 下一节: [RPC](<8.4.md>) ## LastModified diff --git a/8.md b/8.md index 6e9eaac4..3d4a50db 100644 --- a/8.md +++ b/8.md @@ -1,9 +1,19 @@ #8 Web服务 +Web服务可以让你在HTTP协议的基础上通过XML或者JSON来交换信息。如果你想知道上海的天气预报、中国石油的股价或者淘宝商家的一个商品信息,你可以编写一段简短的代码,通过抓取这些信息然后通过标准的接口开放出来,就如同你调用一个本地函数并返回一个值。 +Web服务背后的关键在于平台的无关性,你可以运行你的服务在Linux系统,可以与其他Window的asp.net程序交互,同样的,也可以通过同一个接口和运行在FreeBSD上面的JSP无障碍地通信。 + +目前主流的有如下几种Web服务:REST、SOAP。 + +REST请求是很直观的,因为REST是基于HTTP协议的一个补充,他的每一次请求都是一个HTTP请求,然后根据不同的method来处理不同的逻辑,很多Web开发者都熟悉HTTP协议,所以学习REST是一件比较容易的事情。所以我们在8.3小节讲详细的讲解如何在Go语言中来实现REST方式。 + +SOAP是W3C在跨网络信息传递和远程计算机函数调用方面的一个标准。但是SOAP非常复杂,其完整的规范篇幅很长,而且内容仍然在增加。Go语言是以简单著称,所以我们不会介绍SOAP这样复杂的东西。而Go语言提供了一种天生性能很不错,开发起来很方便的RPC机制,我们将会在8.4小节详细介绍如何使用Go语言来实现RPC。 + +Go语言是21世纪的C语言,我们追求的是性能、简单,所以我们在8.1小节里面介绍如何使用Socket编程,很多游戏服务都是采用Socket来编写服务段,因为HTTP协议相对而言比较耗费性能,让我们看看Go语言如何来Socket编程。目前随着HTML5的发展,webSockets也逐渐的成为很多页游公司接下来开发的一些手段,我们将在8.2小节里面讲解Go语言如何编写webSockets的代码。 ## 目录 - * 1. [webSockets](8.1.md) - * 2. [Socket编程](8.2.md) + * 1. [Socket编程](8.1.md) + * 2. [webSockets](8.2.md) * 3. [REST](8.3.md) * 4. [RPC](8.4.md) * 5. [小结](8.5.md) @@ -11,7 +21,7 @@ ## links * [目录]() * 上一章: [第七章总结](<7.5.md>) - * 下一节: [webSockets](<8.1.md>) + * 下一节: [Socket编程](<8.1.md>) ## LastModified * $Id$ \ No newline at end of file diff --git a/images/8.1.socket.png b/images/8.1.socket.png new file mode 100644 index 00000000..e7fff9fc Binary files /dev/null and b/images/8.1.socket.png differ diff --git a/preface.md b/preface.md index fa992c6b..46f23590 100644 --- a/preface.md +++ b/preface.md @@ -47,8 +47,8 @@ - 7.4 [模板处理](7.4.md) - 7.5 [小结](7.5.md) * 8.[Web服务](8.md) - - 8.1 [webSockets](8.1.md) - - 8.2 [Socket编程](8.2.md) + - 8.1 [Socket编程](8.1.md) + - 8.2 [webSockets](8.2.md) - 8.3 [REST](8.3.md) - 8.4 [RPC](8.4.md) - 8.5 [小结](8.5.md)