简单C/S模型通信
简单C/S模型通信
Server端:
Listen函数:
func Listen(network, address string) (Listener, error)
network:选用的协议:TCP、UDP, 如:“tcp”注意:只支持小写字母
address:IP地址+端口号, 如:“127.0.0.1:8000”或 “:8000”
Listener 接口:
type Listener interface {
Accept() (Conn, error)
Close() error
Addr() Addr
}
Conn 接口:
type Conn interface {
Read(b []byte) (n int, err error)
Write(b []byte) (n int, err error)
Close() error
LocalAddr() Addr
RemoteAddr() Addr
SetDeadline(t time.Time) error
SetReadDeadline(t time.Time) error
SetWriteDeadline(t time.Time) error
}
参看 studygolang.com/pkgdoc 中文帮助文档中的demo:
示例代码:
TCP服务器.go
**package **main
**import **(
**"net"
"fmt"
**)
**func **main() {
// 创建监听
listener, err:= net.Listen(**"tcp"**, **":8000"**) // tcp 不能使用大写
**if **err != nil {
fmt.Println(**"listen err:"**, err)
**return
**}
**defer **listener.Close() // 主go程结束时,关闭listener
fmt.Println(**"****服务器等待客户端建立连接..."**)
// 等待客户端连接请求
conn, err := listener.Accept()
**if **err != nil {
fmt.Println(**"accept err:"**, err)
**return
**}
**defer **conn.Close() // 使用结束,断开与客户端链接
fmt.Println(**"****客户端与服务器连接建立成功..."**)
// 接收客户端数据
buf := make([]byte, 1024) // 创建1024大小的缓冲区,用于read
n, err := conn.Read(buf)
**if **err != nil {
fmt.Println(**"read err:"**, err)
**return
**}
fmt.Println(**"****服务器读到:"**, string(buf[:n])) // 读多少,打印多少。}
如图,在整个通信过程中,服务器端有两个socket参与进来,但用于通信的只有 conn 这个socket。它是由 listener创建的。隶属于服务器端。
Client 端:
Dial函数:
func Dial(network, address string) (Conn, error)
network:选用的协议:TCP、UDP,如:“tcp”或 “udp”
address:服务器IP地址+端口号, 如:“121.36.108.11:8000”或 “www.itcast.cn:8000”
Conn 接口:
type Conn interface {
Read(b []byte) (n int, err error)
Write(b []byte) (n int, err error)
Close() error
LocalAddr() Addr
RemoteAddr() Addr
SetDeadline(t time.Time) error
SetReadDeadline(t time.Time) error
SetWriteDeadline(t time.Time) error
}
package main
import (
"net"
"fmt"
)
func main() {
// 主动发起连接请求
conn, err := net.Dial("tcp", "127.0.0.1:8000") // tcp 不能使用大写
if err != nil {
fmt.Println("Dial err:", err)
return
}
defer conn.Close() // 结束时,关闭连接
// 发送数据
_, err = conn.Write([]byte("Are u ready?"))
if err != nil {
fmt.Println("Write err:", err)
return
}
}