Go语言TCP/UDP Socket编程
1. TCP编程
TCPClient
// TCPClient project main.go
package main import (
"fmt"
"net"
"os"
) func main() {
var buf []byte
if len(os.Args) != {
fmt.Fprintf(os.Stderr, "Usage: %s host:port ", os.Args[])
os.Exit()
}
service := os.Args[]
tcpAddr, err := net.ResolveTCPAddr("tcp4", service)
checkErr(err)
conn, err := net.DialTCP("tcp", nil, tcpAddr)
defer conn.Close()
checkErr(err)
rAddr := conn.RemoteAddr()
n, err := conn.Write([]byte("Hello server!"))
checkErr(err)
n, err = conn.Read(buf[:])
checkErr(err)
fmt.Println("Reply from server ", rAddr.String(), string(buf[:n]))
os.Exit()
} func checkErr(err error) {
if err != nil {
fmt.Fprintf(os.Stderr, "Fatal error: %s", err.Error())
os.Exit()
}
}
TCPServer
// TCPServer project main.go
package main import (
"fmt"
"net"
"os"
) func main() {
service := ":5000"
tcpAddr, err := net.ResolveTCPAddr("tcp4", service)
checkErr(err)
listener, err := net.ListenTCP("tcp", tcpAddr)
checkErr(err)
for {
conn, err := listener.Accept()
if err != nil {
continue
}
go handleClient(conn)
}
} func checkErr(err error) {
if err != nil {
fmt.Fprintf(os.Stderr, "Fatal error: %s", err.Error())
os.Exit()
}
} func handleClient(conn net.Conn) {
defer conn.Close()
var buf []byte
for {
n, err := conn.Read(buf[:])
if err != nil {
return
}
rAddr := conn.RemoteAddr()
fmt.Println("Receive from client", rAddr.String(), string(buf[:n]))
_, err2 := conn.Write([]byte("Welcome client!"))
if err2 != nil {
return
}
}
}
2. UDP编程
UPDClient
// UDPClient project main.go
package main import (
"fmt"
"net"
"os"
) func main() {
var buf []byte
if len(os.Args) != {
fmt.Fprintf(os.Stderr, "Usage: %s host:port ", os.Args[])
os.Exit()
}
service := os.Args[]
udpAddr, err := net.ResolveUDPAddr("udp4", service)
checkErr(err)
conn, err := net.DialUDP("udp", nil, udpAddr)
defer conn.Close()
checkErr(err)
rAddr := conn.RemoteAddr()
n, err := conn.Write([]byte("Hello server!"))
checkErr(err)
n, err = conn.Read(buf[:])
checkErr(err)
fmt.Println("Reply from server ", rAddr.String(), string(buf[:n]))
os.Exit()
} func checkErr(err error) {
if err != nil {
fmt.Fprintf(os.Stderr, "Fatal error: %s", err.Error())
os.Exit()
}
}
UDPServer
// UDPServer project main.go
package main import (
"fmt"
"net"
"os"
) func main() {
service := ":5000"
udpAddr, err := net.ResolveUDPAddr("udp4", service)
checkErr(err)
conn, err := net.ListenUDP("udp", udpAddr)
checkErr(err)
for {
handleClient(conn)
}
} func checkErr(err error) {
if err != nil {
fmt.Fprintf(os.Stderr, "Fatal error: %s", err.Error())
os.Exit()
}
} func handleClient(conn *net.UDPConn) {
defer conn.Close()
var buf []byte
for {
n, rAddr, err := conn.ReadFromUDP(buf[:])
if err != nil {
return
}
fmt.Println("Receive from client", rAddr.String(), string(buf[:n]))
_, err2 := conn.WriteToUDP([]byte("Welcome client!"), rAddr)
if err2 != nil {
return
}
}
}
Go语言TCP/UDP Socket编程的更多相关文章
- tcp/udp socket编程异同
一.TCP与UDP的区别 基于连接与无连接 对系统资源的要求(TCP较多,UDP少) UDP程序结构较简单 流模式与数据报模式 TCP保证数据正确性,UDP可能丢包 TCP保证数据顺序,UDP不保证 ...
- tcp udp socket编程
http://blog.csdn.net/ns_code/article/details/14128987
- TCP&UDP&Socket讲解(上)
这两天我将整理TCP&UDP&Socket,大约花大家10-15分钟之间,希望本篇文章让大家对TCP使用的理解提高一个层次. 建议大家拿出纸和笔,画一下!!! 一.TCP 1. TCP ...
- TCP UDP socket http webSocket 之间的关系
---恢复内容开始--- OSI&TCP/IP模型 要弄清tcp udp socket http websocket之间的关系,首先要知道经典的OSI七层模型,与之对应的是TCP/IP的四层模 ...
- TODO:Golang语言TCP/UDP协议重用地址端口
TODO:Golang语言TCP/UDP协议重用地址端口 这是一个简单的包来解决重用地址的问题. go net包(据我所知)不允许设置套接字选项. 这在尝试进行TCP NAT时尤其成问题,其需要在同一 ...
- 三十天学不会TCP,UDP/IP编程--MAC地址和数据链路层
这篇文章主要是来做(da)推(guang)介(gao)的!由于这两年接触到了比较多的这方面的知识,不想忘了,我决定把他们记录下来,所以决定在GitBook用半年时间上面写下来,这是目前写的一节,后面会 ...
- TCP/UDP,SOCKET,HTTP,FTP 简析
(一)TCP/UDP,SOCKET,HTTP,FTP简析 TCP/IP是个协议组,可分为三个层次:网络层.传输层和应用层: 网络层:IP协议.ICMP协议.ARP协议.RARP协议和BOOTP协议 传 ...
- Bash Shell 下打开一个TCP / UDP SOCKET
Bash Shell 下打开一个TCP / UDP SOCKET http://jingyan.baidu.com/article/636f38bb6166c3d6b84610d1.html
- TCP/UDP网络编程的基础知识与基本示例(windows和Linux)
一.TCP编程的一般步骤 服务器端: 1.创建一个socket,用函数socket() 2.绑定IP地址.端口等信息到socket上,用函数bind() 3.开启监听,用函数listen() 4.接收 ...
随机推荐
- django with mysql (part-3)
step01: write second view-function vim views.py step02: configure your ( urls.py ) vim urls.py step0 ...
- 使用bee自动生成api文档
beego中的bee工具可以方便的自动生成api文档,基于数据库字段,自动生成golang版基于beego的crud代码,方法如下: 1.进入到gopath目录的src下执行命令: bee api a ...
- iOS-图片拉伸技巧
iOS开发中我们会遇到渐变的背景,内容可变的流式标签,聊天气泡(QQ聊天气泡),由于内容是可变的,宽度和高度同样可变,这样就是导致每次出现的尺寸与之前不一样.如果是需要设置的比较的多,估计美工会烦死, ...
- python数据持久存储:pickle模块的使用
python的pickle模块实现了基本的数据序列和反序列化.通过pickle模块的序列化操作我们能够将程序中运行的对象信息保存到文件中去,永久存储:通过pickle模块的反序列化操作,我们能够从文件 ...
- HTML、XHTML XML和DHTML的区别
XML与HTML的设计区别是:XML是用来存储数据的,重在数据本身.而HTML是用来定义数据的,重在数据的显示模式 XHTML(The Extensible HyperText Markup Lang ...
- C# 热敏打印机 Socket 网络链接 打印 图片
C# 热敏打印机 Socket 网络链接 打印 图片 (一) http://www.cnblogs.com/rinack/p/4838211.html C# 热敏打印机 Socket 网络链接 打印 ...
- AndroidStudio使用第三方jar包报错(Error: duplicate files during packaging of APK)
http://www.kwstu.com/ArticleView/android_201410252131196692 错误描述: Error: duplicate files during pack ...
- Cocos2dx.3x入门三部曲-软件环境配置(一)
一.环境: Win7 32位 二.必备软件: l Java JDK 下载地址:http://www.oracle.com/technetwork/java/javase/downloads/inde ...
- ios相关手册、图表等综合
Objective-C初学者速查表(来源:http://www.cocoachina.com/applenews/devnews/2013/1115/7362.html) iOS UIKit类图 (来 ...
- Docker实践(5)—资源隔离
Docker使用cgroup实现CPU,内存和磁盘IO等系统资源的限制. CPU Docker现在有2个与CPU资源相关的参数,-c可以指定CPU的占比,--cpuset可以绑定CPU.例如,指定容器 ...