go语言网络编程之tcp
go语言网络编程需要导入包 net如下 import ( "fmt" "net" ) 重要函数 func Listen(net, laddr string) (Listener, error) func Accept() (c Conn, err error) func Read(b []byte) (n int, err error) 好,我们先写一个go服务器端。 编程之前,先来了解下go语法,熟悉的跳过此段。 go的变量声明比较怪,和c的声明“相反” c语言的声明是这样的 int a; go语言的声明是这样的 var a int; 如果无视var这个标志,你会就是“相反”。 而且你声明不使用会报错,在go中。 go语言的多变量赋值, i:=1 等价于刚才说明的 var i int = 1,下面的i,j赋值会自动匹配 i=1,j=1 i, j := 1, 1 i = i + j 恩,这个多变量赋值的这个东西,在函数返回值有多变量的用上。对,go语言函数可以返回多个值⊙﹏⊙ 和lua语言相似。 go语言的函数实现如下所示,函数形参的声明不用带上var func test(r string, err string){ return r err } i,j:=test("1","2"); go语言的for和if if和for 一样,可以在条件之前执行一个简单的语句,用分号相隔,由这个语句定义的变量的作用域仅在 if 范围之内。 如下所示 if y:=5;y==5 {//如果y=5则输出y fmt.Println(y) } go语言defer的使用,代码例子如下 file.Open("C:/test.txt") defer file.Close() 作用:在函数退出时调用,这样就有效避免了C语言中的内存泄露问题. 下面大家可以看看超级简单的tcp服务器端的代码
package main
import (
"net"
"fmt"
)
func main() {
server, err := net.Listen("tcp", ":7777")
if err == nil { //若果err为nil,则成功创建
for {
con, error_ := server.Accept()
fmt.Println("有一个客户连接n")
if error_ == nil {
con.Write([]byte("hello world!"))
}
}
} else {
return
}
}
下面则是客户端的代码
conn, err := net.Dial("tcp", "127.0.0.1:7777")
if err == nil {
for {
buf := make([]byte, 1024)
if length, err := conn.Read(buf); err == nil {
if length > 0 {
buf[length] = 0
fmt.Printf("%s", string(buf[0:length]))
}
}
}
} else {
return
}
整合在一起就是以下代码
if os.Args[1] == "server" {
server, err := net.Listen("tcp", ":7777")
if err == nil { //若果err为nil,则成功创建
for {
con, error_ := server.Accept()
fmt.Println("有一个客户连接n")
if error_ == nil {
con.Write([]byte("hello world!"))
}
}
} else {
return
}
} else {
conn, err := net.Dial("tcp", "127.0.0.1:7777")
if err == nil {
for {
buf := make([]byte, 1024)
if length, err := conn.Read(buf); err == nil {
if length > 0 {
buf[length] = 0
fmt.Printf("%s", string(buf[0:length]))
}
}
}
} else {
return
}
}
- WinDbg调试.NET程序入门
- Release编译模式下,事件是否会引起内存泄漏问题初步研究 疑问:
- 10种简单的Java性能优化学习
- 巧用枚举类型,实现项目的多语言切换
- 影响Java调用性能有哪些因素
- 如何为可扩展系统进行Java Socket编程
- 如何使用Windows卷影拷贝服务恢复文件和文件夹
- .net字符串数组查找方式效率比较
- 使用Ring Buffer构建高性能的文件写入程序
- 一行代码调用实现带字段选取+条件判断+排序+分页功能的增强ORM框架
- PDF.NET数据开发框架实体类操作实例
- 利用Burp Suite对OWASP Juice Shop进行渗透测试
- Java同步问题面试知识学习
- Android UI控件系列:LinearLayout(线性布局)
- JavaScript 教程
- JavaScript 编辑工具
- JavaScript 与HTML
- JavaScript 与Java
- JavaScript 数据结构
- JavaScript 基本数据类型
- JavaScript 特殊数据类型
- JavaScript 运算符
- JavaScript typeof 运算符
- JavaScript 表达式
- JavaScript 类型转换
- JavaScript 基本语法
- JavaScript 注释
- Javascript 基本处理流程
- Javascript 选择结构
- Javascript if 语句
- Javascript if 语句的嵌套
- Javascript switch 语句
- Javascript 循环结构
- Javascript 循环结构实例
- Javascript 跳转语句
- Javascript 控制语句总结
- Javascript 函数介绍
- Javascript 函数的定义
- Javascript 函数调用
- Javascript 几种特殊的函数
- JavaScript 内置函数简介
- Javascript eval() 函数
- Javascript isFinite() 函数
- Javascript isNaN() 函数
- parseInt() 与 parseFloat()
- escape() 与 unescape()
- Javascript 字符串介绍
- Javascript length属性
- javascript 字符串函数
- Javascript 日期对象简介
- Javascript 日期对象用途
- Date 对象属性和方法
- Javascript 数组是什么
- Javascript 创建数组
- Javascript 数组赋值与取值
- Javascript 数组属性和方法
- 分布式系统的概念都搞懂了吗?(上)
- Kafka-manager部署与使用简单介绍
- 面向对象的7种设计原则(5)-里氏代换原则
- CentOS7下利用Google Authenticator实现SSH登录的二次身份验证
- 满分室间质评之GATK Somatic SNV+Indel+CNV+SV(下)性能优化
- poiAndEasyExcel学习(六)
- C++ 模板沉思录(上)
- Python 为什么会有个奇怪的“...”对象?
- 老板让我从几百个Excel中查找数据,我用Python一分钟搞定!
- 爬取B站20万+条弹幕,我学会了如何成为B站老司机
- Pytorch实现卷积神经网络训练量化(QAT)
- VBA解压缩ZIP文件11——存在问题
- 算法集锦(14)|图像识别| 图像识别算法的罗夏测试
- CenterNet骨干网络之hourglass
- 语音识别中的声学特征提取:梅尔频率倒谱系数MFCC | 老炮儿改名PPLOVELL | 5th