北京

点击搜索

发布

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

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

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月2日 刷新
平谷-平谷城区
4月1日
查看更多北京电脑/网络信息

免责声明:此信息系发布者(UID:381360)自行发布,本站是服务平台,仅提供信息存储空间服务,该信息内容的真实性及合法性由该发布者完全负责。

© lieju.com 联系我们