Go语言之Socket网络编程

Posted 程序彤

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Go语言之Socket网络编程相关的知识,希望对你有一定的参考价值。

Go网络编程

server.go

package main

import (
	"fmt"
	"net"
)

func main() {
	fmt.Println("服务器开始监听")
	listen,err:=net.Listen("tcp","127.0.0.1:8888")
	if err!=nil{
		fmt.Printf("listen err=",err)
		return
	}
	defer listen.Close() // 延时关闭listen
	for  {
		fmt.Println("等待客户端连接...")
		conn,err := listen.Accept() // 等待客户端连接
		if err!= nil{
			fmt.Println("accept(),err=",err)
		}else {
			fmt.Printf("accept() con=%v,客户端ip=%v\\n",conn,conn.RemoteAddr().String())
		}
		// 这里启动协程为客户端服务
		go process(conn)

	}
	fmt.Printf("listen %v\\n",listen)

}

func process(conn net.Conn){
	defer conn.Close()
	for{ // 不停地窥探等待
		buf := make([]byte,1024)
		n,err:=conn.Read(buf)
		//fmt.Println("服务器在等待客户端发来的信息ing"+conn.RemoteAddr().String())
		if err != nil {
			fmt.Println("服务器端的Read() err",err)
			return
		}
		// 显示客户端发来的数据
		fmt.Print(string(buf[:n]))
	}
}

client.go

package main

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

func main() {
	conn,err:=net.Dial("tcp","127.0.0.1:8888") // 核心1
	if err != nil {
		fmt.Println("client err=",err)
		return
	}
	fmt.Println("conn成功=",conn)

	for{
		// 功能1:客户端发送单行数据,就退出
		reader := bufio.NewReader(os.Stdin) // Stdin标准输入
		line,err:=reader.ReadString('\\n') // 从终端读取一行用户的输入,并发送给服务器
		if err!=nil{
			fmt.Println("readString err=",err)
		}
		// for循环退出的基准条件
		line = strings.Trim(line," \\r\\n")
		if  line=="exit"{
			fmt.Println("客户端已退出")
			break
		}
		_,err = conn.Write([]byte(line+"\\n"))  // 核心2
		if err != nil {
			fmt.Println("Write()err=",err)
		}
		//fmt.Printf("客户端发送了%d字节的数据,并退出\\n",n)
	}
}

以上是关于Go语言之Socket网络编程的主要内容,如果未能解决你的问题,请参考以下文章

Go 语言网络编程系列— Socket 编程入门:Dial 函数及其使用

Python 之 Socket编程(TCP/UDP)

go语言网络编程(Socket编程)

go语言快速入门 IPC之Socket 9

Go语言系列- Socket编程和Redis

Go语言 之Socket简单C/S模型通信