TCP 和 UDP 服務(wù)端隨處可見,它們基于 TCP/IP 協(xié)議棧,通過網(wǎng)絡(luò)為客戶端提供服務(wù)。在這篇文章中,我將介紹如何使用 Go 語言開發(fā)一個用于返回隨機數(shù)、支持并發(fā)的 TCP 服務(wù)端。對于每一個來自 TCP 客戶端的連接,它都會啟動一個新的 goroutine(輕量級線程)來處理相應(yīng)的請求。

創(chuàng)新互聯(lián)建站是專業(yè)的綏化網(wǎng)站建設(shè)公司,綏化接單;提供成都做網(wǎng)站、網(wǎng)站建設(shè)、外貿(mào)營銷網(wǎng)站建設(shè),網(wǎng)頁設(shè)計,網(wǎng)站設(shè)計,建網(wǎng)站,PHP網(wǎng)站建設(shè)等專業(yè)做網(wǎng)站服務(wù);采用PHP框架,可快速的進行綏化網(wǎng)站開發(fā)網(wǎng)頁制作和功能擴展;專業(yè)做搜索引擎喜愛的網(wǎng)站,專業(yè)的做網(wǎng)站團隊,希望更多企業(yè)前來合作!
你可以在 GitHub 上找到本項目的源碼:concTcp.go。
這個程序的主要邏輯在 handleConnection 函數(shù)中,具體實現(xiàn)如下:
在 main 函數(shù)的實現(xiàn)部分,每當 TCP 服務(wù)端收到 TCP 客戶端的連接請求,它都會啟動一個新的 goroutine 來為這個請求提供服務(wù)。
首先, main 確保程序至少有一個命令行參數(shù)。注意,現(xiàn)有代碼并沒有檢查這個參數(shù)是否為有效的 TCP 端口號。不過,如果它是一個無效的 TCP 端口號, net.Listen 就會調(diào)用失敗,并返回一個錯誤信息,類似下面這樣:
net.Listen 函數(shù)用于告訴 Go 接受網(wǎng)絡(luò)連接,因而承擔了服務(wù)端的角色。它的返回值類型是 net.Conn ,后者實現(xiàn)了 io.Reader 和 io.Writer 接口。此外, main 函數(shù)中還調(diào)用了 rand.Seed 函數(shù),用于初始化隨機數(shù)生成器。最后, for 循環(huán)允許程序一直使用 Accept 函數(shù)來接受 TCP 客戶端的連接請求,并以 goroutine 的方式來運行 handleConnection(c) 函數(shù),處理客戶端的后續(xù)請求。
net.Listen 函數(shù)的第一個參數(shù)定義了使用的網(wǎng)絡(luò)類型,而第二個參數(shù)定義了服務(wù)端監(jiān)聽的地址和端口號。第一個參數(shù)的有效值為 tcp 、 tcp4 、 tcp6 、 udp 、 udp4 、 udp6 、 ip 、 ip4 、 ip6 、 Unix (Unix 套接字)、 Unixgram 和 Unixpacket ,其中: tcp4 、 udp4 和 ip4 只接受 IPv4 地址,而 tcp6 、 udp6 和 ip6 只接受 IPv6 地址。
concTCP.go 需要一個命令行參數(shù),來指定監(jiān)聽的端口號。當它開始服務(wù) TCP 客戶端時,你會得到類似下面的輸出:
netstat 的輸出可以確認 congTCP.go 正在為多個 TCP 客戶端提供服務(wù),并且仍在繼續(xù)監(jiān)聽建立連接的請求:
在上面輸出中,最后一行顯示了有一個進程正在監(jiān)聽 8001 端口,這意味著你可以繼續(xù)連接 TCP 的 8001 端口。第一行和第二行顯示了有一個已建立的 TCP 網(wǎng)絡(luò)連接,它占用了 8001 和 62556 端口。相似地,第三行和第四行顯示了有另一個已建立的 TCP 連接,它占用了 8001 和 62554 端口。
下面這張圖片顯示了 concTCP.go 在服務(wù)多個 TCP 客戶端時的輸出:
類似地,下面這張圖片顯示了兩個 TCP 客戶端的輸出(使用了 nc 工具):
你可以在 維基百科上找到更多關(guān)于 nc (即 netcat )的信息。
現(xiàn)在,你學(xué)會了如何用大約 65 行 Go 代碼來開發(fā)一個生成隨機數(shù)、支持并發(fā)的 TCP 服務(wù)端,這真是太棒了!如果你想要讓你的 TCP 服務(wù)端執(zhí)行別的任務(wù),只需要修改 handleConnection 函數(shù)即可。
via:
作者:Mihalis Tsoukalos選題:lkxed譯者:lkxed校對:wxy
#include stdio.h
#include stdlib.h
#include time.h //用到了time函數(shù)
int main()
{ int i,number;
srand((unsigned) time(NULL)); //用時間做種,每次產(chǎn)生隨機數(shù)不一樣
for (i=0; i50; i++)
{
number = rand() % 101; //產(chǎn)生0-100的隨機數(shù)
printf("%d ", number);
}
return 0;
}
了解如何使用Go加密和解密數(shù)據(jù)。 請記住,這不是一門關(guān)于密碼學(xué)的課程,而是一門用Go語言實現(xiàn)的課程。
你有一個文件和一個密碼,并且想要使用密碼對文件進行加密。
有很多加密算法。
本章介紹如何在GCM模式下使用對稱算法AES(高級加密標準)。
GCM模式同時提供加密和身份驗證。
未經(jīng)身份驗證,攻擊者可能會更改加密字節(jié),這將導(dǎo)致解密成功但數(shù)據(jù)損壞。 通過添加身份驗證,GCM模式可以檢測到加密數(shù)據(jù)已損壞。
對稱意味著我們可以使用相同的密碼來加密和解密數(shù)據(jù)。
AES使用16個字節(jié)的密鑰作為密碼。 人類喜歡任意長度的密碼。
為了支持人類,我們需要從人類密碼派生AES密鑰。 這比看起來要難,因此應(yīng)該使用經(jīng)過充分研究并被認為是加密安全的方法之一。 這些方法之一是scrypt密鑰派生功能。
加密是一個棘手的主題,犯一個錯誤就會使攻擊者破壞加密并解密文件。
將人可讀的密碼轉(zhuǎn)換為隨機加密密鑰非常重要。
人傾向于只使用可能的字節(jié)子集作為密碼,這使得它們更容易破解。
Scrypt被認為是一種通過人工密碼生成加密密鑰的好算法。 可見,它還使用了一個鹽值,你應(yīng)該對其保密。
AES算法有多種變體。 我們之所以選擇GCM,是因為它結(jié)合了身份驗證和加密功能。 身份驗證檢測加密數(shù)據(jù)的修改。
為了使加密更強,GCM模式需要額外的隨機字節(jié)。 我們選擇為每個文件生成唯一的隨機數(shù),并將其存儲在加密數(shù)據(jù)的開頭(隨機數(shù)不必是秘密的)。
一種替代方法是僅生成一個隨機數(shù)并將其用于所有文件。
package?main
import?(
"fmt"
"math/rand"
"time"
)
func?main()?{
for?i?:=?0;?i??20;?i++?{
r?:=?rand.New(rand.NewSource(time.Now().UnixNano()))
//rand.Seed(time.Now().UnixNano())?//以當前納秒數(shù)作為隨機數(shù)種子
n?:=?r.Int63()
fmt.Println(n)
}
}
查了下這樣可以
不知道他內(nèi)部怎么實現(xiàn)的 ? unixnano
const NUM int = 100
for i := 0; i NUM; i += 1 {
rand.Seed(int64(i))
fmt.Printf("%d\t", rand.Int63n(int64(NUM)))
}
其實在循環(huán)里面這點時間間隔,納秒也是跟不上的。
還有,你用sleep的方法肯定是不能接受的!!!
math/rand 中的所有整數(shù)函數(shù)都生成非負數(shù).
示例 main.go
執(zhí)行
同理,需要int64 int32類型的隨機數(shù)只要修改隨機函數(shù)
但是需要注意 math/rand 幾個函數(shù)的取值區(qū)間!如Intn的范圍[0, n)。[0,20),20會取不到
我自己的需求這樣寫已足夠
當前文章:go語言隨機數(shù) go語言生成隨機數(shù)
本文路徑:http://chinadenli.net/article48/hippep.html
成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供Google、外貿(mào)建站、云服務(wù)器、響應(yīng)式網(wǎng)站、服務(wù)器托管、微信小程序
聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請盡快告知,我們將會在第一時間刪除。文章觀點不代表本網(wǎng)站立場,如需處理請聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時需注明來源: 創(chuàng)新互聯(lián)