golang實現tcp客戶端服務端程式
服務端程式碼:
package main
import (
"bufio"
"errors"
"flag"
"fmt"
"net"
"os"
"strconv"
)
// 指定一個命令列引數的名字
var port int
func Init() {
flag.IntVar(&port, "port", 8081, "set your server port")
}
func main() {
// 初始化命令列變數
Init()
flag.Parse()
// 監聽埠
portStr := strconv.Itoa(port)
if portStr == "" {
fmt.Println("埠不正確,請確認")
return
}
listen, err := net.Listen("tcp", ":" + portStr)
if err != nil {
fmt.Println("監聽埠" + portStr + "失敗", err)
}
fmt.Println("監聽" + portStr + "成功!")
for {
// 等待連線
conn, err := listen.Accept()
if err != nil {
fmt.Println("建立連線失敗了")
}
fmt.Println("建立連線成功了")
// STEP - 1 處理髮送訊息
go func(conn net.Conn) {
handleSend(conn)
}(conn)
// STEP - 2 處理接收訊息
// 必須要這個for 保持程式一直處於喚醒狀態,一直讀取conn裡面的流
var receiveError error
for {
//go func(conn net.Conn) {
receiveError= handleReceive(conn)
if receiveError !=nil {
break
}
//}(conn)
}
if receiveError != nil {
break
}
}
}
func handleReceive(conn net.Conn) error{
//fmt.Println("handleReceive Method")
buff := make([]byte, 4096)
cnt, err := conn.Read(buff)
if cnt == 0 || err != nil {
fmt.Println("[WARN]-----斷開連線------")
fmt.Println("[WARN]------END--------")
return errors.New("連線錯誤")
}
receiveData := string(buff)
fmt.Println("你收到了訊息:", receiveData)
return nil
}
func handleSend(conn net.Conn) {
// 讀取命令列裡面的字元
//fmt.Println("handleSend Method")
r := bufio.NewReader(os.Stdin)
var line string
for {
fmt.Println("Send Message->")
rawLineBytes, _, _ := r.ReadLine()
line = string(rawLineBytes)
if len(line) < 1 {
continue
}
// 傳送
fmt.Println("你傳送了資料: [YOU]:" + line)
//conn.Write([]byte("[SERVER]: " + line))
_, err := fmt.Fprintf(conn, "[SERVER]: " + line)
if err != nil {
fmt.Println("傳送資料失敗")
}
}
}
啟動程式碼:
```go
go run main.go -port=8081
客戶端程式碼:
package main
import (
"bufio"
"errors"
"flag"
"fmt"
"io"
"net"
"os"
"time"
)
var serverPort int
var serverIP string
func Init() {
flag.IntVar(&serverPort, "serverPort", 8081, "set the server PORT you connect with")
flag.StringVar(&serverIP, "serverIP", "127.0.0.1", "set the server IP you will connect with")
}
func main() {
// 初始化命令列引數
Init()
flag.Parse()
// 連線server端
serverAddress := fmt.Sprintf("%s:%d", serverIP, serverPort)
conn, err := net.DialTimeout("tcp", serverAddress, time.Second * 3)
// 連線失敗
if err != nil {
fmt.Println(fmt.Sprintf("連線[%s]失敗了", serverAddress))
return
}
// 連線成功
fmt.Println(fmt.Sprintf("建立連線成功了[%s] !", serverAddress))
// 往conn這個寫一個訊息
fmt.Fprintf(conn, "HEAD / HTTP/1.0\r\n\r\n")
// STEP - 1 處理髮送訊息
go func(conn net.Conn) {
handleSend(conn)
}(conn)
// STEP - 2 處理接收訊息
// 必須要這個for 保持程式一直處於喚醒狀態,一直讀取conn裡面的流
for {
err := handleReceive(conn)
if err != nil {
break
}
}
}
func handleReceive(conn net.Conn) error {
//fmt.Println("handleReceive Method")
buff := make([]byte, 4096)
cnt, err := conn.Read(buff)
// 收到的資料長度為0
//if cnt == 0 || err != nil {
if err != nil {
fmt.Println("斷開連線")
fmt.Println("----------END-----------")
fmt.Println(err, cnt, err == io.EOF)
return errors.New("斷開連線了")
}
fmt.Println("你收到了訊息:", string(buff))
return nil
}
func handleSend(conn net.Conn) {
//fmt.Println("handleSend Method")
r := bufio.NewReader(os.Stdin)
var line string
for {
fmt.Println("Send Message->")
rawLineBytes, _, _ := r.ReadLine()
line = string(rawLineBytes)
if len(line) < 1 {
continue
}
fmt.Println("你傳送了資料: [YOU]:" + line)
_, err := fmt.Fprintf(conn, "[CLIENT]: " + line)
if cnt == 0||err != nil {
fmt.Println("傳送資料失敗")
}
}
}
啟動程式碼:
go run main.go -serverPort=8081 -serverIp=127.0.0.1
tips:
1, 這個簡單的網路應用有幾個關鍵點
A : for 迴圈 等待連線/ 等待使用者從命令列輸入
B :go routine 協程處理髮送或者接受訊息,因為這兩個動作,都是需要程式block住,所以必須 要用go routine
2,注意啟動的時候埠占用情況,也許8081被佔用
3,go build 的時候,windows/mac/linux平臺有不同的命令。(自行搜尋下
相關文章
- 001 Rust 網路程式設計,實現 TCP 服務端和客戶端程式Rust程式設計TCP服務端客戶端
- python建立tcp服務端和客戶端PythonTCP服務端客戶端
- TCP通訊客戶端和服務端簡單程式碼實現TCP客戶端服務端
- 客戶端,服務端客戶端服務端
- 服務端,客戶端服務端客戶端
- TCP程式設計之服務端和客戶端的開發TCP程式設計服務端客戶端
- Android實現Thrift服務端與客戶端Android服務端客戶端
- 實現客戶端與服務端的HTTP通訊客戶端服務端HTTP
- ZooKeeper服務發現客戶端客戶端
- 基於c語言的TCP客戶端、服務端基礎程式碼C語言TCP客戶端服務端
- Qt實現網路聊天室(客戶端,服務端)QT客戶端服務端
- Java建立WebService服務及客戶端實現JavaWeb客戶端
- TCP/UDP簡易通訊框架原始碼,支援輕鬆管理多個TCP服務端(客戶端)、UDP客戶端TCPUDP框架原始碼服務端客戶端
- Go基於gRPC實現客戶端連入服務端GoRPC客戶端服務端
- Java的oauth2.0 服務端與客戶端的實現JavaOAuth服務端客戶端
- Android-TCP客戶端的實現AndroidTCP客戶端
- 模板,從服務端到客戶端服務端客戶端
- 服務端渲染和客戶端渲染服務端客戶端
- Java建立WebService服務及客戶端實現(轉)JavaWeb客戶端
- TCP協議服務端和客戶端的連線與通訊TCP協議服務端客戶端
- HTML轉PDF的純客戶端和純服務端實現方案HTML客戶端服務端
- php原生socket實現客戶端與服務端資料傳輸PHP客戶端服務端
- SSLSocket實現服務端和客戶端雙向認證的例子服務端客戶端
- Spring Boot 整合 WebSocket 實現服務端推送訊息到客戶端Spring BootWeb服務端客戶端
- socket實現服務端多執行緒,客戶端重複輸入服務端執行緒客戶端
- 「iOS」行車服務app 「客戶端、後端思路+程式碼」iOSAPP客戶端後端
- TCP服務端TCP服務端
- OSSEC服務端配置客戶端批次部署方案服務端客戶端
- python 實現 TCP、UDP 客戶端最簡流程PythonTCPUDP客戶端
- C語言透過socket實現TCP客戶端C語言TCP客戶端
- 使用 Golang 實現 appium/WebDriverAgent 的客戶端庫GolangAPPWeb客戶端
- macOS 自帶的ftp服務端&vnc客戶端MacFTP服務端VNC客戶端
- MQTT伺服器搭建服務端和客戶端MQQT伺服器服務端客戶端
- .Net Remoting服務端與客戶端呼叫示例REM服務端客戶端
- Rest Post示例(java服務端、python客戶端)RESTJava服務端Python客戶端
- rsync備份【基於客戶端與服務端】客戶端服務端
- 使用多種客戶端消費WCF RestFul服務(一)——服務端客戶端REST服務端
- ZooKeeper服務發現客戶端--重連認證客戶端