首页 > 其他分享 >golang 使用 net包实现 tcp server 示例

golang 使用 net包实现 tcp server 示例

时间:2023-04-26 10:23:42浏览次数:51  
标签:err 示例 fmt tcp server golang net conn

之前用到 golang 进行网络编程时,主要就是使用 net/httpweb 框架 gin,这些网络库的底层其实也还是用的标准库自带的 net包,很多是对路由或者其他做封装,而且 golang 本身的长处之一也是网络IO的处理,这也得益于其底层的 IO模型,今天我们分享的是基于 TCP server/client 的简单实现,后面将分享相关源码分析。

TCP server,显然这在网络模型中属于四层模型,指的是最终通过 tcp协议 进行通信,http server 则是再其之上的封装,按照 tcp socket 的连接建立流程,我们可以分为以下:

server:

  • bind
  • listen
  • accept
  • read/write
  • close

client:

  • connect
  • write/read
  • close

golang 中,利用 协程 我们可以便捷地对每个连接开启新的协程进行处理,达到并发处理的效果。

接下来看看相关的 server、client 的简单实现吧。

server

package main

import (
	"fmt"
	"net"
)

func main()  {
	lis, err := net.Listen("tcp", ":8000")
	if err != nil {
		fmt.Println(err)
		return
	}

	fmt.Println("server is up now...")
	for {
		conn, err := lis.Accept()
		if err != nil {
			fmt.Println(err)
			return
		}
		clientAddr := conn.RemoteAddr()
		fmt.Printf("recv client [%s] connection...\n", clientAddr)
		go serve(conn)
	}
}

func serve(conn net.Conn)  {
	defer conn.Close()
	buf := make([]byte, 64)
	n, _ := conn.Read(buf)
	conn.Write([]byte("pong: "))
	conn.Write(buf[:n])
}

在代码中,我们首先通过 net.Listen() 创建 server 监听对象,接着通过 loop 对每个客户端连接都新建 goroutine 进行处理。

client

package main

import (
	"fmt"
	"net"
)

func main()  {
	conn, err := net.Dial("tcp", ":8000")
	if err != nil {
		panic(err)
	}
	conn.Write([]byte("hello world\n"))
	i := 0
	buf := make([]byte, 128)
	for i < 2 {
		n, _ := conn.Read(buf)
		fmt.Println(string(buf[:n]))
		i++
	}
}

client 也很简单,只需要通过 net.Dial 即可创建一个连接,然后进行通信。

代码实现简单,但作为 coder,还是要了解更要理解 golang 的网络编程实现原理,比如为何 golang 简单的 server 就可以实现 高并发,内部是怎么实现的呢,后面我们将继续分享。

标签:err,示例,fmt,tcp,server,golang,net,conn
From: https://www.cnblogs.com/davis12/p/17354834.html

相关文章

  • [SQL Server 2008R2] 有关于判断表、字段、存过等元素是否存在相关SQL写法
    表相关普通表查询普通表是否存在可以使用object_id函数,下面的例子是查询表“t_test”是否存在之后从而进行其他的DLL操作:ifobject_id('t_test')isnotnullbegin--如果表存在这段里面写相关逻辑select1end 临时表临时表同样可以用object_id但......
  • 40 个简单又有效的 Linux Shell 脚本示例 转载
    1.HelloWorld程序员经常通过学习helloworld程序来学习新语言。这是一个简单的程序,将字符串“HelloWorld”打印到标准输出中。然后,使用vim或nano等编辑器创建hello-world.sh文件,并将以下行复制到其中。#!/bin/bashecho "Hello World"保存并退出文件。接下来,您需要......
  • SQL Server实现group_concat功能的详细实例
    目录一、实现二、原理分析2.1、FOR XML PATH的作用2.2、STUFF函数2.2.1、STUFF函数在本SQL的作用2.2.2、STUFF函数语法2.3、sql语分分析2.3.1、一个简单的group by2.3.2、在select语句后面加上子查询2.3.3、去掉子查询结果集的第一个分隔符总结一、实......
  • Geoserver使用rest接口发布图层
    Geoserver提供一系列rest接口,发布图层也可以通过rest接口进行图层发布接口post请求/rest/workspaces/{workspaceName}/datastores/{storeName}/featuretypes请求参数(主要参数)参数类型描述必填workspaceNamestring工作空间truestoreNamestring储存仓库t......
  • 【Azure 应用服务】启用 Managed Identity 登录 SQL Server 报错 Managed Identity au
    问题描述在AppService中启用Identity后,使用系统自动生成Identity。使用如下代码连接数据库SQLServer:SQLServerDataSourcedataSource=newSQLServerDataSource();dataSource.setServerName("yoursqlservername.database.chinacloudapi.cn");//Replacewit......
  • okhttp3的基本使用(post发送json示例)
    依赖<!--https://mvnrepository.com/artifact/com.squareup.okhttp3/okhttp--><dependency><groupId>com.squareup.okhttp3</groupId><artifactId>okhttp</artifactId><ve......
  • hello flume (Ubuntu 下 flume1.5单机版安装以及简单入门示例)
    1,下载最新的flume安装包:wgethttp://www.apache.org/dist/flume/stable/apache-flume-1.5.2-bin.tar.gz2,在安装目录解压:tar-zxvfapache-flume-1.5.2-bin.tar.gz3,设置环境变量exportJAVA_HOME=/usr;exportFLUME_HOME=/home/joeyon/apache-flume-1.5.2-bin;exportPATH=$PAT......
  • CS144 计算机网络 Lab2:TCP Receiver
    前言Lab1中我们使用双端队列实现了字节流重组器,可以将无序到达的数据重组为有序的字节流。Lab2将在此基础上实现TCPReceiver,在收到报文段之后将数据写入重组器中,并回复发送方。实验要求TCP接收方除了将收到的数据写入重组器中外,还需要告诉发送发送方:下一个需要的但是还......
  • GB/T28181-2022相对2016版“基于TCP协议的视音频媒体传输要求“规范解读和技术实现
    规范解读GB/T28181-2022和GB/T28181-2016规范,有这么一条“更改了附录D基于TCP协议的视音频媒体传输要求(见附录D,2016年版的附录L)。”。本文主要是针对GB/T28181-2022里面提到的“基于TCP协议的视音频媒体传输要求”做相应的接口适配,在此之前,我们先回顾下规范里面针对这部分......
  • jenkins 用法示例
    示例1:根据参数进行构建  根据参数的值进行不同的操作。#!/bin/bashecho"获取值"echo$Deploycase$Deployin"deploy1")echo123>>/opt/script/aa.log;;"rollback1")echo456>>/opt/script/aa.log;;esac ......