简单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
   }
}
                    
                    
                    
                
          
培训-golang-高级编程
            
            
                关于 LearnKu
              
                    
                    
                    
 
推荐文章: