Web服務
Web服務可以讓你在HTTP協議的基礎上通過XML或者JSON來交換資訊,如果你想知道上海的天氣預報、中國石油的股價或者淘寶商家的一個商品資訊,你可以撰寫一段簡短的代碼,通過抓取這些資訊然后通過標準的介面開放出來,就如同你呼叫一個本地函式并回傳一個值,
Web服務背后的關鍵在于平臺的無關性,你可以運行你的服務在Linux系統,可以與其他Windows的asp.net程式互動,同樣的,也可以通過同一個介面和運行在FreeBSD上面的JSP無障礙地通信,
目前主流的有如下幾種Web服務:REST、SOAP,
Socket編程
在很多底層網路應用開發者的眼里一切編程都是Socket,話雖然有點夸張,但卻也幾乎如此了,現在的網路編程幾乎都是用Socket來編程,你想過這些情景么?我們每天打開瀏覽器瀏覽網頁時,瀏覽器行程怎么和Web服務器進行通信的呢?當你用QQ聊天時,QQ行程怎么和服務器或者是你的好友所在的QQ行程進行通信的呢?當你打開PPstream觀看視頻時,PPstream行程如何與視頻服務器進行通信的呢? 如此種種,都是靠Socket來進行通信的,以一斑窺全豹,可見Socket編程在現代編程中占據了多么重要的地位,這一節我們將介紹Go語言中如何進行Socket編程,
什么是Socket?
Socket起源于Unix,而Unix基本哲學之一就是“一切皆檔案”,都可以用“打開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協議的應用程式通常采用應用編程介面:UNIX BSD的套接字(socket)和UNIX System V的TLI(已經被淘汰),來實作網路行程之間的通信,就目前而言,幾乎所有的應用程式都是采用socket,而現在又是網路時代,網路中行程通信是無處不在,這就是為什么說“一切皆Socket”,
Socket基礎知識
通過上面的介紹我們知道Socket有兩種:TCP Socket和UDP Socket,TCP和UDP是協議,而要確定一個行程的需要三元組,需要IP地址和埠,
IPv4地址
目前的全球因特網所采用的協議族是TCP/IP協議,IP是TCP/IP協議中網路層的協議,是TCP/IP協議族的核心協議,目前主要采用的IP協議的版本號是4(簡稱為IPv4),發展至今已經使用了30多年,
IPv4的地址位數為32位,也就是最多有2的32次方的網路設備可以聯到Internet上,近十年來由于互聯網的蓬勃發展,IP位址的需求量愈來愈大,使得IP位址的發放愈趨緊張,前一段時間,據報道IPV4的地址已經發放完畢,我們公司目前很多服務器的IP都是一個寶貴的資源,
地址格式類似這樣:127.0.0.1 172.122.121.111
IPv6地址
IPv6是下一版本的互聯網協議,也可以說是下一代互聯網的協議,它是為了解決IPv4在實施程序中遇到的各種問題而被提出的,IPv6采用128位地址長度,幾乎可以不受限制地提供地址,按保守方法估算IPv6實際可分配的地址,整個地球的每平方米面積上仍可分配1000多個地址,在IPv6的設計程序中除了一勞永逸地解決了地址短缺問題以外,還考慮了在IPv4中解決不好的其它問題,主要有端到端IP連接、服務質量(QoS)、安全性、多播、移動性、即插即用等,
地址格式類似這樣:2002:c0e8:82e7:0:0:0:c0e8:82e7
這一節講了tcp編程,幸好我之前學習過一點tcp編程的知識,不然又是啥都不知道~~~~
WebSocket
WebSocket是HTML5的重要特性,它實作了基于瀏覽器的遠程socket,它使瀏覽器和服務器可以進行全雙工通信,許多瀏覽器(Firefox、Google Chrome和Safari)都已對此做了支持,
在WebSocket出現之前,為了實作即時通信,采用的技術都是“輪詢”,即在特定的時間間隔內,由瀏覽器對服務器發出HTTP Request,服務器在收到請求后,回傳最新的資料給瀏覽器重繪,“輪詢”使得瀏覽器需要對服務器不斷發出請求,這樣會占用大量帶寬,
WebSocket采用了一些特殊的報頭,使得瀏覽器和服務器只需要做一個握手的動作,就可以在瀏覽器和服務器之間建立一條連接通道,且此連接會保持在活動狀態,你可以使用JavaScript來向連接寫入或從中接收資料,就像在使用一個常規的TCP Socket一樣,它解決了Web實時化的問題,相比傳統HTTP有如下好處:
- 一個Web客戶端只建立一個TCP連接
- Websocket服務端可以推送(push)資料到web客戶端.
- 有更加輕量級的頭,減少資料傳送量
WebSocket URL的起始輸入是ws://或是wss://(在SSL上
Go實作WebSocket
WebSocket分為客戶端和服務端,接下來我們將實作一個簡單的例子:用戶輸入資訊,客戶端通過WebSocket將資訊發送給服務器端,服務器端收到資訊之后主動Push資訊到客戶端,然后客戶端將輸出其收到的資訊,客戶端的代碼如下:
<html>
<head></head>
<body>
<script type="text/javascript">
var sock = null;
var wsuri = "ws://127.0.0.1:1234";
window.onload = function() {
console.log("onload");
sock = new WebSocket(wsuri);
sock.onopen = function() {
console.log("connected to " + wsuri);
}
sock.onclose = function(e) {
console.log("connection closed (" + e.code + ")");
}
sock.onmessage = function(e) {
console.log("message received: " + e.data);
}
};
function send() {
var msg = document.getElementById('message').value;
sock.send(msg);
};
</script>
<h1>WebSocket Echo Test</h1>
<form>
<p>
Message: <input id="message" type="text" value=https://www.cnblogs.com/ygjzs/p/"Hello, world!">
