北京列举网 > 教育培训 > 电脑/网络 > 兄弟连Go语言培训之基础编程Socket编程
北京
[切换城市]

兄弟连Go语言培训之基础编程Socket编程

更新时间:2018-08-15 16:35:53 浏览次数:89次
区域: 北京 > 昌平 > 回龙观
类别:软件工程师培训
地址:文化西路育荣教育园区
  “区块链+时代无疑会是下一个风口,然而现在的区块链行业专业型人才正在遭遇瓶颈”兄弟连教育区块链学院院长尹成表示,“希望能通过兄弟连教育区块链培训学院为社会为企业培养并输送更多优质的区块链高精尖型技术人才。

1什么是Socket

Socket起源于Unix,而Unix基本哲学之一就是“一切皆文件”,都可以用“打开open –> 读写write/read –> 关闭close”模式来操作。Socket就是该模式的一个实现,网络的Socket数据传输是一种特殊的I/O,Socket也是一种文件描述符。Socket也具有一个类似于打开文件的函数调用:Socket(),该函数返回一个整型的Socket描述符,随后的连接建立、数据传输等操作都是通过该Socket实现的。

常用的Socket类型有两种:流式Socket(SOCK_STREAM)和数据报式Socket(SOCK_DGRAM)。流式是一种面向连接的Socket,针对于面向连接的TCP服务应用;数据报式Socket是一种无连接的Socket,对应于无连接的UDP服务应用。

2 TCP的C/S架构

这里写图片描述

3示例程序

3.1服器代码

package main

import (

  "fmt"

  "log"

  "net"

  "strings"

)

func dealConn(conn ne***nn) {

defer conn.Close() //此函数结束时,关闭连接套接字

//conn.RemoteAddr().String():连接客服端的网络地址

  ipAddr := conn.RemoteAddr().String()

fmt.Println(ipAddr "连接成功")

buf := make([]byte 1024) //缓冲区,用于接收客户端发送的数据

  for {

//阻塞等待用户发送的数据

n err := conn.Read(buf) //n代码接收数据的长度

    if err != nil {

        fmt.Println(err)

        return

    }

//切片截取,只截取有效数据

    result := buf[:n]

fmt.Printf("接收到数据来自[%s]==>[%d]:%s\n" ipAddr n string(result))

if "exit" == string(result) { //如果对方发送"exit",退出此链接

fmt.Println(ipAddr "退出连接")

        return

    }

//把接收到的数据转换为大写,再给客户端发送

    conn.Write([]byte(strings.ToUpper(string(result))))

  }

}

func main() {

//创建、socket

  listenner err := net.Listen("tcp" "127.0.0.1:8000")

  if err != nil {

log.Fatal(err) //log.Fatal()会产生panic

  }

  defer listenner.Close()

  for {

conn err := listenner.Accept() //阻塞等待客户端连接

    if err != nil {

        log.Println(err)

        continue

    }

    go dealConn(conn)

  }

}

3.2客服端代码

package main

import (

  "fmt"

  "log"

  "net"

)

func main() {

//客户端主动连接服务器

  conn err := net.Dial("tcp" "127.0.0.1:8000")

  if err != nil {

log.Fatal(err) //log.Fatal()会产生panic

    return

  }

defer conn.Close() //关闭

buf := make([]byte 1024) //缓冲区

  for {

fmt.Printf("请输入发送的内容:")

    fmt.Scan(&buf)

fmt.Printf("发送的内容:%s\n" string(buf))

//发送数据

    conn.Write(buf)

//阻塞等待服务器回复的数据

n err := conn.Read(buf) //n代码接收数据的长度

    if err != nil {

        fmt.Println(err)

        return

    }

//切片截取,只截取有效数据

    result := buf[:n]

fmt.Printf("接收到数据[%d]:%s\n" n string(result))

  }

}
北京电脑/网络相关信息
4月23日
办公软件培训
平谷-平谷城区
4月19日
办公软件培训
平谷-平谷城区
4月11日
办公软件培训
平谷-平谷城区
4月9日
办公软件培训
平谷-平谷城区
4月7日
4月1日
注册时间:2017年04月13日
UID:381360
---------- 认证信息 ----------
手机已认证
查看用户主页