golang net package simulation

Let‘s make some fun to simulation  Server - Client.

1.  socket

I implement a echo server and use telnet to simulate the socket client.

in this way,  we don‘t need to implement our socket client but can test our client server in a standard way.

It can support multiple telnet clients concurrently. The behavior is as bellow.

when user input "BYE",  the connect to server shuts down.

code snippet:

 1 package main
 2
 3 import (
 4     "bufio"
 5     "fmt"
 6     "io"
 7     "log"
 8     "net"
 9     "strings"
10 )
11
12 func main() {
13     // Listen on TCP port 2000 on all interfaces.
14     l, err := net.Listen("tcp", ":2000")
15     if err != nil {
16         log.Fatal(err)
17     }
18     defer l.Close()
19
20     for {
21         // Wait for a connection.
22         conn, err := l.Accept()
23         if err != nil {
24             log.Fatal(err)
25         }
26         fmt.Println("INFO: accept a client")
27
28         // Handle the connection in a new goroutine.
29         go func(c net.Conn) {
30             defer c.Close()
31
32             rd := bufio.NewReader(c)
33             for {
34                 line, _, err := rd.ReadLine()
35                 if err != nil && err != io.EOF {
36                     log.Fatal(err)
37                 }
38
39                 s := string(line)
40                 fmt.Println("LOG:", s)
41
42                 //since rd.ReadLine() has trimed last "\n", append here to echo
43                 _, err = conn.Write([]byte("ECHO:" + s + "\r\n"))
44                 if err != nil {
45                     log.Fatal(err)
46                 }
47
48                 if strings.ToLower(s) == "bye" {
49                     fmt.Println("INFO: client closed")
50                     break
51                 }
52             }
53         }(conn)
54     }
55 }

2. http.Client

时间: 2024-08-07 23:42:42

golang net package simulation的相关文章

golang的哪些坑爷事: package实践

在golang中package是个困惑的概念, 特别是package还可以与folder不同名, 委实让我恶心了一把. 关于golang的package的最佳实践: package is folder. package name is folder name. package path is folder path. 信耶稣得永生! 1. 同一个folder存在不同package, 编译错误: D:/go/bin/go.exe build [E:/cgss/src/pkg01] can't lo

C/C++调用Golang 二

C/C++调用Golang 二 <C/C++调用Golang 一>简单介绍了C/C++调用Golang的方法步骤,只涉及一个简单的函数调用.本文总结具体项目中的使用场景,将介绍三种较复杂的调用方式:一,C++向golang传入复杂结构体:二,C++向golang传入回调函数,在golang中调用C++函数:三,C++调用golang函数,返回复杂的结构体. (本文后面涉及三个例子,省略了编译步骤,仅展示关键代码.具体操作步骤参考<C/C++调用Golang 一>) 一 C++向go

使用Golang编写优化算法 (1)

动手写点东西是学习新知识很重要的一个阶段.之前用 Python 和 JavaScript 实现优化算法,现在用 Golang 来实现.语法上略有不爽,某些C语言的思维又回来了. - Golang 用 package 来组织代码,同一 package 下不同文件之间的标识符是共享的,不能包含两个相同名称的函数.而且只有 package main 能够包含 main 函数.所以将公用的函数提取出来,放在package common.同时,每种例子程序移动到 examples 目录下. - 在 Cle

[golang note] 工程组织

golang项目目录结构 <golang_proj> ├─README                 ├─AUTHORS                 ├─<bin>                 ├─<pkg>                 ├─<src> golang工程不需要任何的工程文件,一个完整的工程通常会在项目根目录下放置上面所示的文件或目录.它们的作用如下: √ README : 简单介绍本项目的目标和主要注意事项,通常第一次使用时应该

golang http 学习

断断续续学习golang 已经有大半年了. 几次涉猎过golang net package, 去年也用过Beego,但是总觉得自己只知皮毛,不能精通.所以,这次誓将其一举拿下.达到知道其宏观组织结构,又了解实现细节,甚至设计时各种考虑以及折中. 目标树立好了,后面的就靠实践了.学习也要有计划,有条理.规划一个好的学习顺序和学习策略,可以节节高升,事半功倍. 那下面就简单规划一下学习路径.本着先易后难,既注重实用,又兼顾细节的原则,规划如下. 1. learn http package struc

Golang 效率初(粗)测

从接触 Golang 开始,断断续续已有差不多一年左右的时间了,都是业余自己学学看看,尚主要限于语法及语言特性,还没有用它写过实际的项目. 关于 Golang 的语法及语言特性,网上有很多资源可以学习.后面某个时间,我也许会写一篇粗浅的文章,来比较一下 Golang 和 C++.Delphi 甚至 C# 等语言语法方面的特性. 我算是个急性子的人(当然,现在好一些了),于是作为码农,显而易见会对“效率”比较敏感.这里的效率不单单指编译器生成的机器码优化程度,也包括编译器的编译速度,所以我对 C+

golang 数组反转

我做hackerearth上题目记录,具体的题目描述是这样的: Given the size and the elements of array A, print all the elements in reverse order. Input: First line of input contains, N - size of the array. Following N lines, each contains one integer, i{th} element of the array

Python 程序员的 Golang 学习指南(III): 入门篇

基础语法 类型和关键字 类型 // 基础类型 布尔类型: bool 整型: int8,uint8,int16,uint16,int32,uint32,int64,uint64,int,rune,byte,complex128, complex64,其中,byte 是 int8 的别名 浮点类型: float32 . float64 复数类型: complex64 . complex128 字符串: string 字符类型: rune(int32的别名) 错误类型: error // 复合类型 指

golang pipe

===============golang pipe============== package main import ( "fmt" "io" ) func main() { reader, writer := io.Pipe() inputData := []byte("1234567890ABCD") go writer.Write(inputData) outputData := make([]byte, 11) n, _ := rea