go语言网络编程之tcp
时间:2022-05-05
本文章向大家介绍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
}
}
- 使用 XML 内部实体绕过 Chrome 和 IE 的 XSS 过滤器
- 响应式编程的实践
- S2-045 原理初步分析(CVE-2017-5638)
- 如何在HDFS上查看YARN历史作业运行日志
- 面向流的设计思想
- 天才第一步 Docker 纸尿裤
- 如何迁移Kudu1.2的WAL和Data目录
- WordPress REST API 内容注入漏洞分析
- 如何为Kerberos环境的CDH集群在线扩容数据节点
- WinDbg 漏洞分析调试(一)
- MySQL MVCC(多版本控制)
- 如何在集群外节点跨网段向HDFS写数据
- 如何使用HAProxy实现Kerberos环境下的Impala负载均衡
- Hue中使用Oozie创建Shell工作流在脚本中切换不同用户
- 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 数组属性和方法