## 一、概念
* Socket又稱“套接字”,應用程序通常通過“套接字”向網絡發出請求或者應答網絡請求
* 常用的Socket類型有兩種:流式Socket和數據報式Socket,流式是一種面向連接的Socket,針對于面向連接的TCP服務應用,數據報式Socket是一種無連接的Socket,針對于無連接的UDP服務應用
* IP是數字型,是32位整數,4個8位2進制數,每8位用圓點隔開,每個8位整數可以轉換為0~255的十進制整數
* 端口號:0~65535
## 二、TCP服務端代碼
~~~
package main
import (
"net"
"fmt"
"strings"
)
func main() {
//創建監聽,socket
listener, err := net.Listen("tcp", "127.0.0.1:8888")
if err != nil {
fmt.Println(err)
}
defer listener.Close()
//死循環,等待請求
for {
//等待客戶端連接
conn, err := listener.Accept()
if err != nil {
fmt.Println(err)
continue
}
//每次開啟一個子協程處理客戶端請求
go ClientConn(conn)
}
}
func ClientConn(conn net.Conn) {
defer conn.Close()
//取連接地址
ipAddr := conn.RemoteAddr().String()
fmt.Println(ipAddr, "連接成功")
//緩沖區用于讀寫
buf := make([]byte, 1024)
for {
//等待用戶發送的數據
//n 接收數據長度
n, err := conn.Read(buf)
if err != nil {
fmt.Println(err)
return
}
//截取客戶端發送的有效數據
result := buf[:n]
fmt.Printf("接收到數據來自[%s]==>[%d]:%s\n", ipAddr, n, string(result))
if "exit" == string(result) {
fmt.Println(ipAddr, "退出連接")
return
}
//給客戶端回應
conn.Write([]byte(strings.ToUpper(string(result))))
}
}
~~~
## 三、 TCP客戶端代碼
~~~
package main
import (
"net"
"fmt"
)
func main() {
//客戶端主動連接服務端
conn, err := net.Dial("tcp", "127.0.0.1:8888")
if err != nil {
fmt.Println(err)
return
}
defer conn.Close()
//緩沖區
buf := make([]byte, 1024)
for {
fmt.Printf("請輸入發送的內容:")
fmt.Scan(&buf)
fmt.Printf("發送的內容:%s\n", string(buf))
//發送數據
conn.Write(buf)
//讀數據
n, err := conn.Read(buf)
if err != nil {
fmt.Println(err)
return
}
//截取數據
result := buf[:n]
fmt.Printf("接收到數據[%d]:%s\n", n, string(result))
}
}
~~~
- 一、數組
- 二、切片
- 三、copy
- 四、MAP
- 五、結構體
- 六、結構體參數
- 七、面向”對象“
- 1、匿名字段
- 2、方法
- 3、包和封裝
- 4、接口
- 5、異常處理
- 八、Json
- 九、文件操作
- 1、寫文件
- 2、讀取文件內容
- 3、拷貝文件
- 十、反射
- 1、查看類型,字段和方法
- 2、查看匿名字段
- 3、修改基本類型的值
- 4、修改結構體的值
- 5、調用方法
- 十一、并發編程
- 1、并行和并發
- 2、協程
- 3、runtime包
- 5、channel的使用
- 6、close
- 7、定時器
- 8、select
- 9、協程同步鎖
- 十二、socket編程
- 十三、Http編程
- 十四、并發爬蟲和數據處理
- 1、簡易爬蟲實例
- 2、并發爬取圖片
- 3、讀文件中的數據
- 4、數據清洗
- 其他
- 1、推薦文章