@(go語言 黑馬)[GO語言]
簡單版TCP服務(wù)器
- 題目:搭建一個(gè)簡單版TCP服務(wù)器
- 知識點(diǎn):TCP通信
- 邏輯:
_1. 創(chuàng)建服務(wù)器的IP+port(端口號)
_2. 創(chuàng)建通信socket
_3. 讀寫客戶端數(shù)據(jù)
- 代碼如下:
package main
import "fmt"
func main() {
listener, err := net.Listen("tcp", ":8000") //創(chuàng)建服務(wù)器的IP+port(端口號)
if err != nil {
fmt.Println("Listen err:", err)
return
}
defer listener.Close() //不要忘了結(jié)束關(guān)閉
conn, err := listener.Accept() //conn是與客戶端通信的socket诗充,用于接收和發(fā)送數(shù)據(jù)
fmt.Println("成功連接!")
if err != nil {
fmt.Println("Accept err:", err)
return
}
//讀取客戶端發(fā)來的請求
buf := make([]byte, 4096)
n, err := conn.Read(buf)
if n == 0 {
return
}
if err != nil {
fmt.Println("conn.Read err:", err)
return
}
fmt.Println("收到客戶端的請求:", string(buf[:n]))
conn.Write([]byte(strings.ToUpper(string(buf[:n])))) //處理數(shù)據(jù),并返回給客戶端峦睡,ToUpper()是轉(zhuǎn)大寫的意思
}
簡單版TCP客戶端
- 題目:搭建一個(gè)簡單版TCP客戶端
- 知識點(diǎn):TCP通信
- 邏輯:
_1. 與服務(wù)器建立連接
_2. 發(fā)送請求
_3. 接收客戶端數(shù)據(jù)
- 代碼如下:
package main
import "fmt"
func main() {
conn, err := net.Dial("tcp", "127.0.0.1:8000")//建立連接
if err != nil {
fmt.Println("net.Dial err:", err)
return
}
conn.Write([]byte("Are you ready?"))//發(fā)送請求
buf := make([]byte, 4096)
n, err01 := conn.Read(buf)//讀取服務(wù)器回發(fā)的數(shù)據(jù)
if err01 != nil {
fmt.Println("conn.Read err:", err01)
return
}
fmt.Println("讀到服務(wù)器發(fā)送的數(shù)據(jù):", string(buf[:n]))
}
并發(fā)服務(wù)器
- 題目:搭建一個(gè):可以連接多個(gè)客戶端宴合,能夠重復(fù)與每個(gè)客戶端通信瞎饲,并且能夠識別客戶端發(fā)送的exit請求的服務(wù)器
- 知識點(diǎn):TCP通信值漫,go并發(fā)
- 邏輯:
_1. 寫出單個(gè)通信服務(wù)器
_2. 完善重復(fù)通信功能
_3. 完善連接多個(gè)客戶端功能
- 代碼如下:
package main
import "fmt"
func main() {
listener, err := net.Listen("tcp", "127.0.0.1:8001")
if err != nil {
fmt.Println("net.Listen err:", err)
return
}
defer listener.Close()
for {
fmt.Println("等待客戶端連接...")
conn, err := listener.Accept()
if err != nil {
fmt.Println("listener.Accept err:", err)
return
}
go commu(conn)
}
}
func commu(conn net.Conn) {
defer conn.Close()
for {
buf := make([]byte, 4096)
n, err := conn.Read(buf)
if err != nil {
fmt.Println("conn.Read err:", err)
return
}
if string(buf[:n]) == "exit\n" || string(buf[:n]) == "exit\r\n" {
fmt.Println("客戶端請求斷開")
return
}
if n == 0 {
return
}
fmt.Println("讀到客戶端請求:", string(buf[:n]))
conn.Write([]byte(strings.ToUpper(string(buf[:n]))))
}
}
并發(fā)客戶端
- 題目:搭建一個(gè):能夠不斷地向服務(wù)器發(fā)送請求伯诬,每發(fā)送一次請求讀取回復(fù)一次晚唇,能夠判斷出客戶端是否關(guān)閉的客戶端
- 知識點(diǎn):TCP通信,go并發(fā)
- 邏輯:
_1. 寫出簡單版服務(wù)器
_2. 完善重復(fù)通信功能
_3. 完善識別服務(wù)器是否關(guān)閉功能
- 代碼如下:
package main
import "fmt"
func main() {
conn,err:=net.Dial("tcp","127.0.0.1:8001")
if err != nil {
fmt.Println("net.Dial err:", err)
return
}
defer conn.Close()
for {
buf := make([]byte, 4096)
n, err := os.Stdin.Read(buf)
if err != nil {
fmt.Println("os.Stdin.Read err:", err)
return
}
conn.Write([]byte(string(buf[:n])))
sli := make([]byte, 4096)
n, err = conn.Read(sli)
if err != nil {
fmt.Println("conn.Read err:", err)
return
}
if n == 0 {
fmt.Println("檢測到服務(wù)器關(guān)閉")
return
}
fmt.Println("讀到服務(wù)器回發(fā)的數(shù)據(jù):", string(sli[:n]))
}
}