服務(wù)端
服務(wù)端的處理流程
- 監(jiān)聽端口8888
- 接收客戶端的tcp連接
- 創(chuàng)建gorountine,處理該鏈接的請(qǐng)求(通??蛻舳藭?huì)通過鏈接發(fā)送請(qǐng)求包)
客戶端
客戶端的處理流程
- 建立與服務(wù)端的鏈接
- 發(fā)送請(qǐng)求數(shù)據(jù) (終端),接收服務(wù)器端返回的結(jié)果數(shù)據(jù)
- 關(guān)閉鏈接
簡(jiǎn)單的程序示意圖

服務(wù)端與客戶端的關(guān)系
服務(wù)端功能
- 編寫一個(gè)服務(wù)端程序,在8888端口監(jiān)聽
- 可以和多個(gè)客戶端創(chuàng)建鏈接
- 鏈接成功后,客戶端可以發(fā)送數(shù)據(jù),服務(wù)端接收數(shù)據(jù),并且顯示在終端上
- 先可以使用talnet來測(cè)試,然后編寫客戶端程序來測(cè)試
package main
import (
"fmt"
"io"
"net"
)
func process(conn net.Conn) {
defer conn.Close()
for {
buf := make([]byte, 1024)
//等待客戶端通過conn發(fā)送信息
//如果客戶端沒有Write[發(fā)送],那么協(xié)程就阻塞在這里
//fmt.Printf("服務(wù)器在等待客戶端%s, 發(fā)送信息\n", conn.RemoteAddr().String())
n, err := conn.Read(buf)
if err == io.EOF {
fmt.Println("客戶端退出")
return
}
if err != nil {
fmt.Println("服務(wù)器Read err", err)
return
}
//顯示客戶端發(fā)送的內(nèi)容到服務(wù)器的終端
fmt.Println(string(buf[:n]))
}
}
func Server() {
//Listen函數(shù)創(chuàng)建的服務(wù)器
//頭層皮:網(wǎng)絡(luò)協(xié)議
//127.0.0.1:8888 8888本機(jī)ip和端口
l, err := net.Listen("tcp", "127.0.0.1:8888")
if err != nil {
fmt.Println("error:", err)
return
}
defer l.Close()
//循環(huán)等待客戶端訪問
for {
conn, err := l.Accept()
if err != nil {
fmt.Println("accept error", err)
}
fmt.Printf("訪問客戶端信息:con = %v 客戶端ip=%v\n", conn, conn.RemoteAddr())
go process(conn)
}
}
func main() {
Server()
}
客戶端功能
- 編寫一個(gè)客戶端程序,能鏈接到服務(wù)端的8888窗口
- 客戶端可以發(fā)送單行數(shù)據(jù),然后就退出
- 能通過終端輸入數(shù)據(jù)( 輸入一行發(fā)送一行),并發(fā)送給服務(wù)器端
- 在終端輸入exit,表示退出程序
import (
"bufio"
"fmt"
"net"
"os"
"strings"
)
func main() {
con, err := net.Dial("tcp", "0.0.0.0:8888")
if err != nil {
fmt.Println("connect err", err)
return
}
fmt.Println("con 成功=", con)
for {
//客戶端可以發(fā)送單行數(shù)據(jù),然后就退出
reader := bufio.NewReader(os.Stdin) //os.Stdin代表標(biāo)準(zhǔn)輸入[終端]
//從終端讀取一行用戶輸入,并準(zhǔn)備發(fā)送給服務(wù)端
line, err := reader.ReadString('\n')
if err != nil {
fmt.Println("readstring err = ", err)
}
line = strings.Trim(line, " \r\n")
if line == "exit" {
break
}
//再將line發(fā)送給服務(wù)器
n, err := con.Write([]byte(line))
if err != nil {
fmt.Println("con.write err = ", err)
}
fmt.Printf("發(fā)送了%d字節(jié)到服務(wù)器\n", n)
}
fmt.Println("程序退出")
}