ソケットプログラミング
ソケットは一般に「ソケット」と呼ばれる、BSD UNIXプロセス間通信機構であるが、IPアドレスとポートを記述するために使用され、ハンドルは、通信チェーンです。ソケットは、APIのTCP / IPネットワークとして理解することができ、それはプログラマがTCP / IPネットワーク上でアプリケーションを開発するために使用できる関数またはルーチンの数を定義します。コンピュータ上で実行するアプリケーションは、一般的に「ソケット」ネットワーク要求や応答を介してネットワークに要求を送信します。
ソケット・ソフトウェア・アプリケーションは、抽象化層を通信するための中間層とTCP / IPプロトコルスイートです。デザインモードでは、ソケットは、実際にファサードパターンであり、それはTCP / IPプロトコルスイートは、ソケットの背後に隠されているの複雑さで、ユーザーが唯一の関連機能ソケットの規定を呼び出す必要があり、ソケットの組織が指定されたプロトコルデータは、その後で満たして行きましょう通信。
GO言語のTCP通信
TCPプロトコル
TCP / IP(伝送制御プロトコル/インターネットプロトコル)伝送制御プロトコル/インターネットプロトコルであるように、接続(コネクション型)配向し、信頼性の高いバイトストリームトランスポート層(トランスポート層)ベースの通信プロトコルでありますコネクション指向のプロトコル、水と同じ送信データは、問題スティッキーパッケージが存在します。
TCPサーバ
TCPサーバは、それは非常に便利である複数のゴルーチンの同時実行性と効率的な移動の言語を作成し、多くのクライアントを接続することができ、それぞれに対処するためのゴルーチンを作成するためのリンクを確立することが可能です。
TCPサーバプログラムのプロセスフロー:
- リスニングポート
- リンクを確立するために、受信したクライアント要求
- ゴルーチンハンドルリンク作成した
TCPサーバー:
//TCP server端
func process(conn net.Conn) {
defer conn.Close() //关闭连接
for {
reader := bufio.NewReader(conn)
var buf [128]byte
n,err := reader.Read(buf[:]) //读取数据
if err != nil{
fmt.Println("连接客户端失败,错误信息:",err)
}
recvStr := string(buf[:n])
fmt.Println("收到客户端信息:",recvStr)
conn.Write([]byte(recvStr)) //发送数据
}
}
func main() {
listen,err := net.Listen("tcp","127.0.0.1:8888")
if err != nil{
fmt.Println("监听失败,错误:",err)
return
}
for {
conn,err := listen.Accept() //建立连接
if err!= nil{
fmt.Println("建立连接失败,错误:",err)
continue
}
go process(conn) //启动一个goroutine处理连接
}
}
TCPクライアント
次のようにTCPクライアントTCP通信プロセスは、次のとおりです。
- リンクは、サーバとの間で確立されています
- データを送受信します
- 閉じるリンク
TCPクライアント:
//客户端
func main() {
conn ,err := net.Dial("tcp","127.0.0.1:8888")
if err != nil {
fmt.Println("连接失败,错误:",err)
return
}
defer conn.Close()
inputReader := bufio.NewReader(os.Stdout)
for {
input, _ := inputReader.ReadString('\n') //读取用户输入
inputInfo := strings.Trim(input,"\r\n")
if strings.ToUpper(inputInfo) == "q"{
return //如果输入q就退出
}
_,err = conn.Write([]byte(inputInfo)) //发送数据
if err != nil{
return
}
buf := [512]byte{}
n,err := conn.Read(buf[:])
if err != nil{
fmt.Println("接受失败,错误:",err)
return
}
fmt.Println(string(buf[:n]))
}
}
まず、クライアントを開始した後、サーバーを起動します。
$go run main.go
我是客户端
我是客户端
$go run main.go
收到客户端信息: 我是客户端
GO言語のUDP通信
UDP合意
UDPプロトコル(ユーザ・データグラム・プロトコル)は、ユーザデータグラムプロトコルの中国名であり、OSI(開放型システム間相互接続、Open Systems Interconnection)参照モデルは、接続を確立し、データを直接送信することができずに、非トランスポート層プロトコル接続でありますレセプションには、何の通信タイミング信頼できないではないが、一般的にライブ映像関連分野に使用リアルタイムUDPプロトコルは、より良いです。
UDPサーバー
//服务端
func main() {
listen,err := net.ListenUDP("udp",&net.UDPAddr{
IP:net.IPv4(0,0,0,0),
Port:8888,
})
if err != nil{
fmt.Println("监听失败,错误:",err)
return
}
defer listen.Close()
for {
var data [1024]byte
n,addr,err := listen.ReadFromUDP(data[:])
if err != nil{
fmt.Println("接收udp数据失败,错误:",err)
continue
}
fmt.Printf("data:%v addr:%v count:%v\n", string(data[:n]), addr, n)
_ ,err = listen.WriteToUDP(data[:n],addr) //发送数据
if err != nil{
fmt.Println("发送数据失败,错误:",err)
continue
}
}
}
UDPクライアント
//客户端
func main() {
socket,err := net.DialUDP("udp",nil,&net.UDPAddr{
IP:net.IPv4(0,0,0,0),
Port:8888,
})
if err != nil{
fmt.Println("连接服务器失败,错误:",err)
return
}
defer socket.Close()
sendData := []byte("hello world!")
_,err = socket.Write(sendData)
if err != nil{
fmt.Println("发送数据失败,错误:",err)
return
}
data := make([]byte,4096)
n,remoteAddr,err := socket.ReadFromUDP(data)
if err != nil{
fmt.Println("接受数据失败,错误:",err)
return
}
fmt.Printf("recv:%v addr:%v count:%v\n", string(data[:n]), remoteAddr, n)
}
まず、クライアントを開始した後、サーバーを起動します。
$go run main.go
recv:hello world! addr:127.0.0.1:8888 count:12
$go run main.go
data:hello world! addr:127.0.0.1:51222 count:12
HTTPクライアントとサーバー
HTTPプロトコル
ハイパーテキスト転送プロトコル(HTTP、ハイパーテキスト転送プロトコル)伝送プロトコルのインターネットで最も広く使用されている方法で、すべてのWWW文書は、この規格に準拠しなければなりません。HTTPは元々の目的は、HTMLページを公開し、受信するための方法を提供することにある設計されました。
HTTPサーバ
ネット/ HTTPパケットは、さらにネットにパケットをカプセル化され、データがHTTPプロトコルの処理専用します。
// http server
func sayHi(w http.ResponseWriter,r *http.Request) {
fmt.Fprintln(w,"你好,ares!")
}
func main() {
http.HandleFunc("/",sayHi)
err := http.ListenAndServe(":8888",nil)
if err != nil{
fmt.Println("Http 服务建立失败,err:",err)
return
}
}

HTTPクライアント
func main() {
resp, err := http.Get("https://www.baidu.com/")
if err != nil {
fmt.Println("get failed, err:", err)
return
}
defer resp.Body.Close()
body, err := ioutil.ReadAll(resp.Body)
fmt.Printf("%T\n",body)
fmt.Println(string(body))
}
ターミナルで実行した後、出力www.baidu.comホームコンテンツのことができるようになります。