首页 > 编程语言 >go语言tcp编程学习

go语言tcp编程学习

时间:2023-06-18 13:00:14浏览次数:35  
标签:err fmt 编程 tcp Println go conn 客户端

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)
		}
	}
}

标签:err,fmt,编程,tcp,Println,go,conn,客户端
From: https://www.cnblogs.com/ua-21/p/17488992.html

相关文章

  • 模板元编程之类模板(一)
    一、类模板Stack的实现#include<iostream>#include<vector>template<typenameT>classStack{private:std::vector<T>elems;//存储元素的容器public:voidpush(Tconst&);//压入元素voidpop();//弹出元素Ttop()const;//返回栈顶元素......
  • 【C】专家编程 (Expert C Programming) 阅读笔记
      第一章C:穿越时空的迷雾  1p22~24 ANSIC有此问题。“安静”的类型转换原则:当执行算术运算时,操作数的类型如果不同,就会发生转换。数据类型一般朝着浮点精度更高,长度更长的方向转换,整形术如果转换为singed不会丢失信息,就转换为signed,否则转换为unsign......
  • 关于如何使用C++进行编程(不使用数据库的情况下)
    问题描述对于一个长期使用Java连接数据库,实现javaweb编程的软工友友来说,突然在编程任务中不允许连接数据库,就有一点的蒙圈,没有办法,只能去查阅资料啦!问题解决不出意外的话,这次我们就需要使用文件操作来存储数据啦!(然后另外一种方法时json,显然,文件操作更加简单一点、也是更加熟悉......
  • 【雕爷学编程】Arduino动手做(114)---US-015高分辨超声波模块
    37款传感器与执行器的提法,在网络上广泛流传,其实Arduino能够兼容的传感器模块肯定是不止这37种的。鉴于本人手头积累了一些传感器和执行器模块,依照实践出真知(一定要动手做)的理念,以学习和交流为目的,这里准备逐一动手尝试系列实验,不管成功(程序走通)与否,都会记录下来---小小的进步或是......
  • C语言基础教程(宏的使用和多文件编程)
    (文章目录)前言这篇文章来给大家讲解一下C语言中的多文件编程,在C语言开发项目的过程中使用多文件编程是必不可少的,使用多文件编程可以方便我们代码的管理和编写,让我们的代码可读性和移植性更高。一、宏的定义和使用在C语言中,宏(Macro)是一种预处理指令,用于在编译阶段进行文本......
  • Go 中的格式化字符串`fmt.Sprintf()` 和 `fmt.Printf()`
    在Go中,可以使用fmt.Sprintf()和fmt.Printf()函数来格式化字符串,这两个函数类似于C语言中的scanf和printf函数。fmt.Sprintf()fmt.Sprintf()函数返回一个格式化后的字符串,而不是将其打印到标准输出流中。下面是一个例子:packagemainimport"fmt"funcmain(){......
  • go 接口循环方法
    typeCallinterface{String()string}typeCnstruct{}typeEnstruct{}funcNewcn()Call{return&Cn{}}func(c*Cn)String()string{b,_:=json.Marshal(c)fmt.Println(b)returnstring(b)}funcNewen()Call{return&En{}}func(e*E......
  • 【技术学习】网络学习--简单tcp服务器
    这是一个用AI生成的简单的tcp服务器代码,我稍微改动了一下命名啥的。可以看到代码非常简短,不过却没什么问题,人工智能还是很强的。#include<iostream>#include<sys/socket.h>#include<netinet/in.h>#include<cstring>#include<unistd.h>#defineMAXLNE4096intmai......
  • Springboot整合mongodb
    入门案例创建工程,导入依赖导入依赖点击查看代码<dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-data-mongodb</artifactId><version>2.3.9.RELEASE</version>......
  • Go语言学习总结
    1.跳出/执行下一次循环。{标签名}:fortrue{...fortrue{...break/continue{标签名}//默认不加标签,则跳出最近一层循环。加了标签可以跳出标签定义处所在循环}}2.map的使用注意项。因为map是指针,作为参数传递时,在函数内部对map作的修改......