讓我們先看一下socket的程式設計模型:
以上來自此文
和c語言不同的是,go語言在底層幫我們封裝了socket,listentcp的時候建立,繫結,並監聽;dialtcp的時候,建立並連線 。具體可以看此文,或者用除錯模式跟蹤一下。下面讓我們用**來看清伺服器只能有65536個最大鏈結的謬論吧。
server.go
package main
import (
"fmt"
"net"
"os"
)func main()
//建立tcp協議
tcpaddr, err := net.resolvetcpaddr("tcp4", os.args[1]) //tcp4 是協議版本,還有tcp6 如果只有埠的話預設繫結127.0.0.1
checkerror(err)
//建立、繫結、監聽socket
listener, err := net.listentcp("tcp4", tcpaddr)
checkerror(err)
for
//處理連線
go handleclient(conn) }}
func handleclient(conn net.conn)
func checkerror(err error)
}
package main
import (
"fmt"
"net"
"os"
"time"
)func main()
tcpaddr, err := net.resolvetcpaddr("tcp4", os.args[1])
checkerror(err)
//建立socket並連線伺服器
conn, err := net.dialtcp("tcp4", nil, tcpaddr)
checkerror(err)
fmt.printf("client address %s\n",conn.localaddr().string())
defer conn.close()
var buf [512]byte
for
checkerror(err)
fmt.printf("receive %s from server\n",string(buf[0:n])) }}
func checkerror(err error)
}
需要兩台電腦測試,這裡使用虛擬機器
啟動服務端
go run server.go 0.0.0.0:7777 ,這裡在虛擬機器上執行服務端
這裡0.0.0.0 的意思是允許來自外部的鏈結
啟動客戶端
檢視埠服務端
客戶端
從上圖我們可以看到:
看一下socket的程式設計模型,我估計在與服務端的accept這個環節。其實這個環節並沒有另外去繫結乙個埠來和客戶端通訊。
擴充套件一下,其實對於服務端來說,埠數並不能限制(因為只繫結乙個埠),那麼連線客戶端的總數限制就在於記憶體、cpu和網路頻寬了。
對於客戶端呢,連線同乙個服務端時,都要占用乙個埠,對同一臺電腦,限制可以執行的客戶端總數就在於埠數、記憶體、cpu和網路頻寬。
另外65535這個數目實際上是可以更改的。
這裡的虛擬機器使用的vagrant,乙個方便的虛擬機器管理軟體,
最大連線數 Linux的檔案最大連線數
too many open files 檢視當前作業系統連線數設定 ulimit a修改伺服器最大連線數 vim etc security limits.conf新增 soft nofile 65535 hard nofile 65535 soft nproc 65535 hard nproc 65...
MYSQL 檢視最大連線數和修改最大連線數
mysql檢視最大連線數和修改最大連線數 1 檢視最大連線數 show variables like max connections 2 修改最大連線數 set global max connections 200 以下的文章主要是向大家介紹的是mysql最大連線數的修改,我們大家都知道mysql最...
MYSQL 檢視最大連線數和修改最大連線數
mysql檢視最大連線數和修改最大連線數 1 檢視最大連線數 show variables like max connections 2 修改最大連線數 set global max connections 200 以下的文章主要是向大家介紹的是mysql最大連線數的修改,我們大家都知道mysql最...