golang 实现tcp server端和client端,并计算RTT时间操作
作者:YMY_mine 发布时间:2023-08-30 14:12:49
标签:golang,tcp,server,client,RTT
server端代码:
package main
import (
"fmt"
"net"
"log"
"os"
)
func main() {
addr := "0.0.0.0:8787"
tcpAddr, err := net.ResolveTCPAddr("tcp",addr)
if err != nil {
log.Fatalf("net.ResovleTCPAddr fail:%s", addr) //等价于print err后,再os.Exit(1)
}
listener, err := net.ListenTCP("tcp", tcpAddr)
if err != nil {
log.Fatalf("listen %s fail: %s", addr, err)
}else {
log.Println("rpc listening", addr)
}
for {
conn, err := listener.Accept()
if err != nil {
log.Println("listener.Accept error:", err)
continue
}
go handle_Client(conn)
}
}
func handle_Client(conn net.Conn) {
defer conn.Close()
var write_buffer []byte = []byte("ok")
read_buffer := make([]byte, 128)
n, err1 := conn.Read(read_buffer)
if err1 != nil {
fmt.Println("ser Read failed:", err1)
os.Exit(1)
}
m, err2 := conn.Write(write_buffer)
if err2 != nil {
fmt.Println("ser send error:", err2)
os.Exit(1)
}
fmt.Println("ser read cli send data count:", n, "msg:", string(read_buffer))
fmt.Println("ser send data to cli count:", m, "msg:", string(write_buffer))
fmt.Println("********one connetion end*********")
}
client端代码:
package main
import (
"fmt"
"net"
"os"
"time"
)
func main() {
conn, err := net.Dial("tcp", "127.0.0.1:8787")
if err != nil {
fmt.Println("dial failed:", err)
os.Exit(1)
}
defer conn.Close()
var write_buffer []byte = []byte("Hi,server. I'm client.")
read_buffer := make([]byte, 128)
start_time := time.Now()
n, err2 := conn.Write(write_buffer)
if err2 != nil {
fmt.Println("cli send error:", err2)
os.Exit(1)
}
m, err1 := conn.Read(read_buffer)
if err1 != nil {
fmt.Println("cli Read failed:", err1)
os.Exit(1)
}
response_time := time.Since(start_time)
RTT_time := float64(response_time.Nanoseconds()) / 1e+06 //ns-->ms
fmt.Println(RTT_time)
fmt.Println("cli send data to ser count:", n, "msg:", string(write_buffer))
fmt.Println("cli read ser data count:", m, "msg:", string(read_buffer))
}
补充:go 语言 TCP服务器接受客户端字符串信息
我就废话不多说了,大家还是直接看代码吧~
func hand_conn(conn net.Conn) ([]byte){
defer conn.Close()
//clientarr := conn.RemoteAddr() //获取连接到的对像的IP地址
result := bytes.NewBuffer(nil)
var buf [512]byte
for {
n, err := conn.Read(buf[0:])
result.Write(buf[0:n])
if err != nil {
if err == io.EOF {
break
}
}
}
//explan_rec_infos(string(result.Bytes()))
return result.Bytes()
}
func main() {
fmt.Println("Hello World! go server")
server, err := net.Listen("tcp", ":9993")
if err == nil { //若果err为nil,则成功创建
index := 1
for {
index++
con, _ := server.Accept()
fmt.Println("有一个客户连接" , index)
hand_conn(con)
}
} else {
return
}
}
以上为个人经验,希望能给大家一个参考
来源:https://blog.csdn.net/YMY_mine/article/details/87720736
0
投稿
猜你喜欢
- 有时需要获取远程网站的某些信息,而服务器又限制了GET方式,只能通过POST数据提交,这个时候我们可以通过asp来实现模拟提交post数据,
- 本文列出了一些asp编程种可能会用到的正则表达式例子,大家可以方便的调用!如果您对asp种的正则表达式不是很了解可以看看这篇文章《ASP中R
- 先废话几句,这第23篇教程一直没有翻译出来,直到今天我看到待审评论里面有这么一条超长的评论,结果一看,居然是这篇教程的翻译稿。
- Declaring class members or methods as st
- Go 中接口也是一个使用得非常频繁的特性,好的软件设计往往离不开接口的使用,比如依赖倒置原则(通过抽象出接口,分离了具体实现与实际使用的耦合
- 如何正确显示数据库里同时存在的GB码和BIG5码? Public Function CheckBIG(strS
- <!--模板--> <table width="100%" borde
- 一般的防止被框架方式或者被框架后自动转向,方法如下: if (top.location != self.loc
- django静态文件配置原理静态文件配置就是为了让用户请求时django服务器能找到静态文件返回。首先要理解几个概念:媒体文件:用户上传的文
- osql 工具是一个 Microsoft Windows 32 命令提示符工具,您可以使用它运行 Transact-SQL 语句和脚本文件。
- 1、之前那个说淘宝交易评价“有问题”的文章已经有了一百多个评论。(某些开口就骂的评论已被删除)近期去评论的人都是从搜索引擎过来的,他们不是产
- 1.尽量不要对列名进行函数处理。而是针对后面的值进行处理例如where col1 = -5的效率比where -col1=5的效率要高因为后
- 阅读上一节:美化段落文本 Ⅰweb标准知识——美化段落文本 Ⅱ懒,可能是唯一解释为什么这么长时间才写这一篇的主要原因。不述详情,以此责心。上
- 当你的查询相对简单的时候,每次从头开始创建SQL语句也不费什么工夫,不过,复杂的查询就不同了,每次都从头来会产生很多开发错误。因此,一旦让S
- 可以说,互联网就是由一个个链接进行信息流通的。没有连接的网站如同一潭死水,毫无生气。当一个访客进入你的网站,在浏览的过程中,如果你的内容不引
- Session 对象 可以使用 Session 对象存储特定用户会话所需的信息。这样,当用户在应用程序的 Web 页之间跳转时,存储在 Se
- 页面加载loading效果, 这个挺好玩的!用setTimeout实现的!可以和服务端整合弄一些生成HTML或者上传文件等应用!
- 前端的小伙伴们在babel等的加持下,已经可以愉快的使用es6来写代码了。然后对于服务端的nodejs就有点坑爹了,虽然原生支持了es6,但
- 如何制作一个从Access数据库中读取记录的下拉菜单?看看这个例子:<% SQL = "SEL
- 如何使DIV居中,div垂直居中,div水平居中.这个问题在用CSS来设计网页的时候经常会遇到,如果用传统的表格来布局是很简单的,CSS里就