您当前的位置: 首页 > 

慕晨sekurlsa

暂无认证

  • 5浏览

    0关注

    82博文

    0收益

  • 0浏览

    0点赞

    0打赏

    0留言

私信
关注
热门博文

Go语言实现TCP通信

慕晨sekurlsa 发布时间:2022-07-27 23:45:53 ,浏览量:5

Go语言实现TCP通信 TCP协议

TCP/IP协议是一种面向连接的、可靠的、基于字节流的传输层通信协议,因为是面向连接的协议,数据像水流一样传输,会存在黏包问题。

TCP服务端
  • 一个TCP服务端可以同时连接很多个客户端。
  • 因为Go语言中创建多个goroutine实现并发非常方便和高效,所以我们可以每建立一次连接就创建一个goroutine去处理。

TCP服务端程序的处理流程:

  1. 监听端口
  2. 接收客户端请求建立连接
  3. 创建goroutine处理连接
package main

import (
	"fmt"
	"net"
	"os"
)

//处理错误的函数
func ServerHandlerErr(err error, where string){
	if err != nil{
		fmt.Println(err,where)
		os.Exit(1)
	}
}

func ProcessMsg(conn net.Conn){

	//创建消息缓冲区
	buff := make([]byte, 1024)

	//接收消息
	for{

		//读取客户端的消息,发送缓冲区
		n, readerr := conn.Read(buff)

		//处理可能出现的错误
		ServerHandlerErr(readerr, "conn.Read")

		//转换称字符串打印出来
		receivedmsg := string(buff[0:n])
		fmt.Println(receivedmsg, "from ",conn.RemoteAddr())

		if receivedmsg == "exit"{
			break
		}
	}
	conn.Close()
	fmt.Println("Connection Closed From ", conn.RemoteAddr())
}

func main(){
	listen, err := net.Listen("tcp", "127.0.0.1:8888")

	//处理可能出现的错误
	ServerHandlerErr(err, "net.Listen")
	fmt.Println("Start listening at ", listen.Addr())

	//循环接入所有客户端
	for{
		conn, accepterr := listen.Accept()
		ServerHandlerErr(accepterr, "listen.Accept")

		//一个客户端用一个协程接收数据
		go ProcessMsg(conn)
	}

}
TCP客户端

TCP客户端程序的处理流程:

  1. 连接服务端
  2. 发送数据
  3. 结束连接
package main

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

//处理错误的函数
func ClientHandlerErr(err error, where string){
	if err != nil{
		fmt.Println(err, where)
		os.Exit(1)
	}
}

func main(){

	//与服务端建立连接
	conn, err := net.Dial("tcp", "127.0.0.1:8888")

	//处理可能出现的错误
	ClientHandlerErr(err, "net.Dial")

	fmt.Println("Please say...")

	//消息缓冲区
	//buff := make([]byte, 1024)

	//从命令行标准输入中获取数据
	reader := bufio.NewReader(os.Stdin)

	//循环发送数据
	for{
		linemsg, _, _ := reader.ReadLine()
		conn.Write(linemsg)

		if string(linemsg) == "exit"{
			break
		}
	}
	conn.Close()
}

关注
打赏
1663680270
查看更多评论
立即登录/注册

微信扫码登录

0.0471s