简单C/S模型通信

未匹配的标注

简单C/S模型通信

TCP的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创建的。隶属于服务器端。

Socket编程

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
   }
}

本文章首发在 LearnKu.com 网站上。

上一篇 下一篇
讨论数量: 0
发起讨论 只看当前版本


暂无话题~