Golang基於TCP協議實現簡單的server和client聊天


server.go

package main

import (
	"fmt"
	"net" // socket開發時很重要
)

func Process(conn net.Conn){
	// 循環接收客戶端發送的數據
	client := conn.RemoteAddr().String()// 客戶端IP:port
	defer conn.Close()// 關閉conn
	for{
		// 創建一個新的切片
		buf := make([]byte, 1024)
		// fmt.Printf("服務器在等待客戶端%s發送信息\n", conn.RemoteAddr().String())
		n, err := conn.Read(buf)// 從conn中讀取
		// 等待客戶端通過conn發送信息,
		// 如果客戶端沒有發送(write),就會阻塞在這里
		if err!=nil{
			// 一般為這個err
			fmt.Printf("客戶端%s已退出..\n", client)
			return
		}
		// 顯示客戶端發送的內容到服務器的終端
		fmt.Printf("%s: %s", client, string(buf[:n]))// 讀到了n個數據
	}
}

func main(){
	fmt.Println("服務器開始監聽...")
	// tcp表示使用的網絡協議
	// 127.0.0.1:8888表示監聽的IP:port
	listen, err := net.Listen("tcp", "127.0.0.1:8888")
	if err!=nil{
		fmt.Println("listen err =", err)
		return
	}
	defer listen.Close()// 延時關閉listen
	fmt.Println("listening success:", listen.Addr())
	
	// 循環等待客戶端來連接
	fmt.Println("等待客戶端來連接..")
	for{
		conn, err := listen.Accept()
		if err!=nil{
			fmt.Println("Accept() err =", err)
		}else{
			fmt.Printf("客戶端%s已連接..\n", conn.RemoteAddr().String())
		}
		// 准備一個協程,為客戶端服務
		go Process(conn)
	}
	
}

client.go

package main

import (
	"fmt"
	"net"
	"bufio"
	"os"
	"strings"
)

func main()  {
	conn, err := net.Dial("tcp", "127.0.0.1:8888")
	if err!=nil{
		fmt.Println("client dial err =", err)
		return
	}
	defer conn.Close()// 關閉連接
	
	// 客戶端發送單行數據,然后就退出
	reader := bufio.NewReader(os.Stdin)// 標准輸入(終端)

	for{
		// 從終端讀取一行用戶輸入,並發送給服務器
		fmt.Print(">")
		line, err := reader.ReadString('\n')
		if err!=nil{
			fmt.Println("reading string err =", err)
		}
		
		// 如果用戶輸入的是exit,客戶端就退出
		line = strings.Trim(line, "\r\n")
		if line=="exit"{
			return
		}
		
		// 再將line發送給服務器
		_, err = conn.Write([]byte(line+"\n"))
		if err!=nil{
			fmt.Println("conn write err =", err)
		}
		// fmt.Printf("客戶端發送了%d字節", n)
	}

效果

服務端

客戶端


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM