ソケットプログラミング
エンドサービスプロセスフロー
- A。リスニングポート(通常はなぜ、デフォルトは80であるので、非表示)
- B。クライアントのリンクを受け取ります
- C。ゴルーチンを作成し、リンク処理
クライアントのプロセスフロー
- 。リンクサーバー側の確立
- B。メイクのデータトランシーバ
- C。閉じるリンク
ネットワークプロトコル
TCP / IPプロトコル
デフォルトでは、できる典型的には4層:リンク層、ネットワーク層、トランスポート層、アプリケーション層
链路层:处理MAC地址,设备到设备
网络层:处理IP地址,主机到主机
传输层:处理数据传输,进程到进程
应用层:处理应用,应用程序
レイヤーとプロトコル
各層独自のプロトコル
链路层
ARP:设备到设备(网卡、MAC),通过ip找mac
网络层
ping 172.0.0.1
传输层
TCP:文件传输、安全、慢
UPD:例如聊天相关、不安全、快
知識レビュー
- NIC:NICは、ネットワークカードのアドレスに識別される - >物理アドレス(MAC)を、ブロードキャストストーム放送を避けるために、IPによると、唯一の現在のローカルネットワークアドレス、MAC内のオブジェクトを見つけるために
梱包および開梱
C / Sモデル
- クライアント - サービス機械モデル
サーバーの例
package main
import (
"fmt"
"net"
)
func main() {
// 监听
listener, err := net.Listen("tcp", "192.0.0.1:8000")
if err != nil {
fmt.Println("err:", err)
}
defer listener.Close()
// 阻塞等待用户链接
conn, err := listener.Accept()
if err != nil {
fmt.Println("err:", err)
return
}
// 接受用户的请求
buf := make([]byte, 1024)
n, err := conn.Read(buf)
if err != nil {
fmt.Println("err:", err)
return
}
fmt.Printf("%s", string(buf[:n]))
}
UEの例
package main
import (
"fmt"
"net"
)
func main() {
// 连接到服务器
conn, err := net.Dial("tcp", "127.0.0.1:8000")
if err != nil {
fmt.Println("err:", err)
return
}
defer conn.Close()
// 发送数据
conn.Write([]byte("Are you ok?"))
}