go语言tcp编程学习

TCP编程

1、网络编程分类

包括TCPsocket编程(底层基于tcp/ip协议)和b/s结构的http编程(使用的是http协议,但是底层是tcp socket实现的)

资料:尚硅谷的TCP资料(3卷),可以咸鱼找下资料看下

2 TCPsocket编程

windows查看端口密码:netstat -anb; netstat -an

  • 服务器端的处理流程
    • 监听端口;接受客户端的tcp链接;建立客户端和服务端的链接;创建goroutine,处理该链接的请求
  • 客户端的处理流程
    • 建林与服务器的链接
    • 发送请求数据【终端】,即可收服务端返回的结果数据
    • 关闭链接

服务端代码

package main

import (
	"fmt"
	"net"
)

func process(conn net.Conn){
	//循环接受客户端发送的数据
	defer conn.Close() 	//关闭conn
	for {
		//创建一个新的切片
		buf := make([]byte, 1024)
		//conn.Read(buf)
		//1、等待客户端通过conn发送信息
		//2、如果客户端没有wirte,那么协程就阻塞在这里
		//fmt.Printf("服务器在等待客户端 %v 发送信息\n", conn.RemoteAddr().String())
		n, err :=conn.Read(buf)	//从conn读取数据
		if err != nil{
			fmt.Println("服务器的Read err=", err)
			return
		}
		//3、显示客户端发送的内容到服务器的终端
		fmt.Print(string(buf[:n]))
	}
}

func main() {
	fmt.Println("服务器开始监听...")
	listen, err := net.Listen("tcp", "0.0.0.0:9988")
	if err != nil {
		fmt.Println("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() suc=%v 客户端IP=%v\n", conn, conn.RemoteAddr().String())
		}
		//准备起一个客户端为客户端服务
		go process(conn)
	}
	//fmt.Printf("listen=%v\n", listen)
}

客户端代码

package main

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

func main() {
	conn, err := net.Dial("tcp", "127.0.0.1:9988")
	if err != nil {
		fmt.Println("client dial err=", err)
		return
	}
	//功能1:客户端发送单行数据,然后退出
	reader := bufio.NewReader(os.Stdin)

	for {
		//从终端读取用户输入,发送给服务器
		line, err := reader.ReadString('\n')
		if err != nil {
			fmt.Println("readingstring err=", err)
		}
		//如果用户输入exit就退出
		line = strings.Trim(line," \r\n")
		if line== "exit"{
			fmt.Println("客户端退出...")
			break
		}
		//再将line发送给服务器
		_, err = conn.Write([]byte(line + "\n"))
		if err != nil {
			fmt.Println("conn.Write err=", err)
		}
	}
}

posted @   qwaszx1!  阅读(23)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 无需6万激活码!GitHub神秘组织3小时极速复刻Manus,手把手教你使用OpenManus搭建本
· Manus爆火,是硬核还是营销?
· 终于写完轮子一部分:tcp代理 了,记录一下
· 别再用vector<bool>了!Google高级工程师:这可能是STL最大的设计失误
· 单元测试从入门到精通
HTML
点击右上角即可分享
微信分享提示