go语言socket编程
go语言socket编程
用go写socket非常简单,如果你了解其他语言的socket的话一看便知,如果想深入的话,个人建议看uninx网络编程套接字联网API这本书。
在go中,网络协议被封装的非常完好了,我们并不需要像其他语言那样需要socket、bind、listen、receive、connect等一系列的操作,只需要go中自带的net包就可以很方便的完成socket编程。
server.go
package main
import ( "fmt" "net" "log" "os"
) func main() { //建立socket,监听端口 netListen, err := net.Listen("tcp", "localhost:1024") CheckError(err) defer netListen.Close() Log("Waiting for clients") for { conn, err := netListen.Accept() if err != nil { continue } Log(conn.RemoteAddr().String(), " tcp connect success") handleConnection(conn) }
}
//处理连接
func handleConnection(conn net.Conn) { buffer := make([]byte, 2048) for { n, err := conn.Read(buffer) if err != nil {Log(conn.RemoteAddr().String(), " connection error: ", err) return } Log(conn.RemoteAddr().String(), "receive data string:\n", string(buffer[:n])) }
}func CheckError(err error) { if err != nil { fmt.Fprintf(os.Stderr, "Fatal error: %s", err.Error()) os.Exit(1) }
}
client.go
这里客户端使用stdin读取输入,具体情况请大家自己运行实例中的代码即可
package main import ( "fmt" "net" "os" "bufio"
) func sender(conn net.Conn) {r := bufio.NewReader(os.Stdin) /*使用bufio缓冲器*/for{rawLine, _, _ := r.ReadLine()line := string(rawLine)conn.Write([]byte(line)) fmt.Println("send over") }
} func main() { tcpAddr, err := net.ResolveTCPAddr("tcp4", "127.0.0.1:1024") if err != nil { fmt.Fprintf(os.Stderr, "Fatal error: %s", err.Error()) os.Exit(1) } conn, err := net.DialTCP("tcp", nil, tcpAddr) if err != nil { fmt.Fprintf(os.Stderr, "Fatal error: %s", err.Error()) os.Exit(1) } fmt.Println("connect success") sender(conn)
}
大家看看,是不是很简单呢。server端主要用到Listen、Accept、Read三个主要的函数
netListen, err := net.Listen("tcp", "localhost:1024") conn, err := netListen.Accept() n, err := conn.Read(buffer)
client端就用到DialTCP这个主要的api,请大家自行查阅这个函数的用法.
Go语言中通过net包中的DialTCP函数建议一个TCP连接,返回一个TCPConn类型,客户端和服务器段通过这个类型来进行数据交换。一般而言,客户端通过TCPConn写入请求信息发送到服务器端,读取服务器端反馈的信息。这个链接只有当任意一遍关闭了连接之后才失效,不然我们都可以一直使用。函数定义
func DialTCP(net string, laddr, raddr *TCPAddr) (c *TCPConn, err os.Error)
- net参数是”tcp4”、”tcp6”、”tcp”中的任意一个,分别表示TCPv4、TCPv6或者任意
- laddr表示本机地址,一般设置为nil
- addr表示远程的服务地址 例如127.0.0.1:9000
net包中有一个类型TCPConn,这个类型可以用来作为客户端和服务器端交互的通道,他有两个主要的函数:
func (c *TCPConn) Write(b []byte) (n int, err os.Error)
func (c *TCPConn) Read(b []byte) (n int, err os.Error)
通过以上这个例子我们就可以搭建一个socket的server-clinet框架。
如果在handleConnection(conn net.Conn)这句前面加一个go就可以让服务端并发的出来不同的client了,其中go是go语言中的关键字,go语言中支持轻量级线程(协程)goroutine
go语言socket编程相关推荐
- c语言soket编程,C语言socket编程使用方法
C语言socket编程使用方法 C语言是一门通用计算机编程语言,应用广泛.C语言的设计目标是提供一种能以简易的方式编译.处理低级存储器.产生少量的机器码以及不需要任何运行环境支持便能运行的编程语言.以 ...
- C语言SOCKET编程指南
转载自:http://blog.sina.com.cn/s/blog_79b01f66010163q3.html 这篇文章完全可以作为c语言socket编程指南,无论在任何系统下.感谢作者fenglo ...
- 钻星图的c语言的编程,C 语言Socket编程教程 pdf
南漳谬悠情节层析德雅青豆丹佛脉理密封.夺理秋月弹流清切壳菜夺得沙梨.临朐硕壮着迷僚婿母权欣欣气急波器,倒把迟迟供肥东辽电学片盘挂钟劈胸麦片!龙乡足板比美性病内屏:涣然树立马具闹哄啪唧每场水力儒艮: 励 ...
- 【go语言 socket编程系列】net.DialTCP、net.DIalUDP与net.Dial
[函数原型] func DialTCP(network string, laddr, raddr *TCPAddr) (*TCPConn, error) func DialUDP(network s ...
- C语言 socket编程实例
C语言 socket编程实例 一. 面向连接的流式套接字 C/S 例子 二. 非阻塞的多人聊天服务器端例子 三. 简单的 IPv6 UDP socket编程 四.使用wireshark抓包分析tcp协 ...
- C语言Socket编程为什么要将sockaddr_in强制转换成sockaddr?
在阅读尹圣雨<TCP/IP网络编程>(C语言示例)的时候,看到将sockaddr_in类型的struct的指针强制转换成了sockaddr类型的指针. 比如hello_client.c: ...
- linux C语言 socket编程教程(附两个例子)(socket教程)
文章目录 1.网络中进程之间如何通信? 2.什么是Socket? 3.socket的基本操作 3.1.socket()函数 3.2.bind()函数 网络字节序与主机字节序 3.3.listen(). ...
- C语言socket编程中关于read()和write()的思考
最近开始学习C的socket编程,教材上有一处依照我对IO函数的理解,我感觉有点问题,故而研究了一下.学的很浅,可能有错漏. 1.socket编程中read()和write()内部原理 每个socke ...
- c语言socket教学视频,C语言—— socket编程
前不久刚看完<c primer plus>,收获颇丰,对于C语言也有了更全面的认识,对于模块化和数据结构也有了更多的想法,之前学过C语言,但很多已经记不起了,知识很零散,这也是我看这本书的 ...
最新文章
- Linux C编程之二:Linux基础
- orbeon form 的日志处理
- Javascript第五章location对象第五课
- Ubuntu 14.04 java环境安装配置(不是openJAVA)
- 耐思尼克域名注册:通过icann之后和之前的那些小故事
- 凸优化第四章凸优化问题 4.3线性规划问题
- 快速西门子PLC入门(零基础心得版)
- Lemon OA_Lemon OA(开源OA系统)
- iozone文件系统性能评测工具
- AGI STK使用本地地形和地图
- python心得总结知识点和收获,千锋Python培训学员心得 在总结中收获提升
- MT6589下载工具,MT6589刷机工具
- 蓝牙开发那些事儿(3)——看看空中包
- python必背100源代码-100行Python代码实现一款高精度免费OCR工具
- 【学习打卡 Free-Excel 】Task4 表合并
- 用selenium爬取拉勾网职位信息及常见问题处理
- 1036. 跟奥巴马一起编程(15)
- 十个句型令你职场平步青云[转]
- 新高考选科 计算机科学,上海交通大学新高考选科指南
- 妥妥解决MySqL中文乱码问题,就这么任性