Golang中socket套接字

简介: Golang中socket套接字

server与client基础通信

1. 网络分层

2.socket

socket-server DEMO

只能接收一次连接,只能发送一次数据

package main 
import (
  "fmt"
  "net"
  "strings"
)
func main(){
  // 创建监听
  ip := "127.0.0.1"
  port := 8800
  address := fmt.Sprintf("%s:%d",ip,port)
  // func Listen(network,address string) (Listener,error){
  // net.Listen("tcp","8800") // 简写,冒号前面是本机 127.0.0.1
  listener,err := net.Listen("tcp",address)
  if err != nil{
    fmt.Println("net.Listen err:",err)
    return 
  }
  fmt.Println("监听中...")
  // Accept() (Conn,error)
  conn,err := listener.Accept()
  if err != nil{
    fmt.Println("listener.Accept err:",err)
    return
  }
  fmt.Println("连接建立成功!")
  // 创建一个容器,用于接收读取到的数据
  buf := make([]byte,1024) // 使用make来创建字节切片,type ==>uint8
  // Read(b []byte) (n int,err error)
  // cnt:真正读取client发来的数据的长度
  cnt,err := conn.Read(buf)
  if err != nil{
    fmt.Println("conn.Read err:",err)
    return
  }
  fmt.Println("Client =======> Server,长度",cnt,",数据:",string(buf[0:cnt]))
  // 服务器对客户端请求进行相应,将数据转换成大写 “hello" ==> HELLO
  // func ToUpper(s string) string {
  upperData := strings.ToUpper(string(buf[0:cnt]))
  // Write(b []byte) (n int,err error)
  cnt,err = conn.Write([]byte(upperData))
  fmt.Println("Client <======== Server,长度:",cnt,",数据:",upperData)
  // 关闭连接
  conn.Close()
}

client DEMO

package main 
import (
  "fmt"
  "net"
)
func main(){
  conn,err := net.Dial("tcp",":8800")
  if err != nil{
    fmt.Println("net.Dial err: ",err)
    return
  }
  fmt.Println("cliet与server连接建立成功!")
  sendData := []byte("helloworld")
  // 向服务器发送数据
  cnt,err := conn.Write(sendData)
  if err != nil {
    fmt.Println("conn.Write err:",err)
    return
  }
  fmt.Println("Client ===> Server cnt:",cnt,",data:",string(sendData))
  // 接收服务器返回的数据
  // 创建buf,用于接收服务器返回的数据
  buf := make([]byte,1024)
  cnt,err = conn.Read(buf)
  if err != nil{
    fmt.Println("conn.Read err:",err)
    return
  }
  fmt.Println("Client <==== Server,cnt:",cnt,",data:",string(buf[0:cnt]))
  conn.Close()
}

处理多次连接

package main 
import (
  "fmt"
  "net"
  "strings"
)
func main(){
  // 创建监听
  ip := "127.0.0.1"
  port := 8800
  address := fmt.Sprintf("%s:%d",ip,port)
  // func Listen(network,address string) (Listener,error){
  // net.Listen("tcp","8800") // 简写,冒号前面是本机 127.0.0.1
  listener,err := net.Listen("tcp",address)
  if err != nil{
    fmt.Println("net.Listen err:",err)
    return 
  }
  // 需求:server可以接收多个连接 ===> 主go程负责监听,子go程负责数据处理
  // 每个连接可以接收处理多伦数据请求
    for {
      fmt.Println("监听中...")
    // Accept() (Conn,error)
    conn,err := listener.Accept()
    if err != nil{
      fmt.Println("listener.Accept err:",err)
      return
    }
    fmt.Println("连接建立成功!")
        go handleFunc(conn)
    
  }
  
}
// 处理具体业务的逻辑,需要将conn传递进来,每一新连接,conn是不同的
func handleFunc(conn net.Conn){
  for {
      // 创建一个容器,用于接收读取到的数据
      buf := make([]byte,1024) // 使用make来创建字节切片,type ==>uint8
      // Read(b []byte) (n int,err error)
      // cnt:真正读取client发来的数据的长度
      cnt,err := conn.Read(buf)
      if err != nil{
        fmt.Println("conn.Read err:",err)
        return
      }
      fmt.Println("Client =======> Server,长度",cnt,",数据:",string(buf[0:cnt]))
      // 服务器对客户端请求进行相应,将数据转换成大写 “hello" ==> HELLO
      // func ToUpper(s string) string {
      upperData := strings.ToUpper(string(buf[0:cnt]))
      // Write(b []byte) (n int,err error)
      cnt,err = conn.Write([]byte(upperData))
      fmt.Println("Client <======== Server,长度:",cnt,",数据:",upperData)
    }
    // 关闭连接
    _ = conn.Close()
}

发送多次请求

package main 
import (
  "fmt"
  "net"
  "time"
)
func main(){
  conn,err := net.Dial("tcp",":8800")
  if err != nil{
    fmt.Println("net.Dial err: ",err)
    return
  }
  fmt.Println("cliet与server连接建立成功!")
  sendData := []byte("helloworld")
  for {
    // 向服务器发送数据
    cnt,err := conn.Write(sendData)
    if err != nil {
      fmt.Println("conn.Write err:",err)
      return
    }
    fmt.Println("Client ===> Server cnt:",cnt,",data:",string(sendData))
    // 接收服务器返回的数据
    // 创建buf,用于接收服务器返回的数据
    buf := make([]byte,1024)
    cnt,err = conn.Read(buf)
    if err != nil{
      fmt.Println("conn.Read err:",err)
      return
    }
    fmt.Println("Client <==== Server,cnt:",cnt,",data:",string(buf[0:cnt]))
    time.Sleep(1 * time.Second)
  }
  conn.Close()
}

感谢大家观看,我们下次见

目录
相关文章
|
7月前
|
网络协议 安全 网络安全
Python网络编程详解:Socket套接字的使用与开发
探索Python网络编程:本文详述Socket套接字,关键组件用于设备间通信。理解Socket类型(TCP/UDP),学习创建、绑定、监听、发送/接收数据步骤。示例展示服务端和客户端实现,及Socket聊天室应用。了解并发处理、错误处理和网络安全。通过学习,提升网络应用开发技能。参考书籍深入学习。
180 2
|
7月前
套接字(socket)的端点表示
套接字(socket)的端点表示
76 8
|
7月前
|
网络协议 安全 Unix
UNIX域套接字(Unix Domain Socket,UDS)之所以高效
UNIX域套接字(Unix Domain Socket,UDS)之所以高效
523 3
|
7月前
|
监控 安全 Unix
UNIX域套接字(Unix Domain Socket)在安全性和隐私性
UNIX域套接字(Unix Domain Socket)在安全性和隐私性
302 2
|
7月前
|
网络协议 Java Unix
套接字(Socket)
套接字(Socket)
82 3
|
7月前
|
算法 Unix
socket套接字选项getsockopt&setsockopt
setsockopt()函数用于任意类型、任意状态套接口的设置选项值。尽管在不同协议层上存在选项,但本函数仅定义了最高的“套接口”层次上的选项。在Unix网络编程中通常用到getsockopt和setsockopt两个函数来获取和设置套接口的选项。getsockopt()函数用于获取任意类型、任意状态套接口的选项当前值,并把结果存入optval。
102 0
|
存储 网络协议 Unix
网络基础:socket套接字
网络基础:socket套接字
100 0
|
2月前
|
Java
[Java]Socket套接字(网络编程入门)
本文介绍了基于Java Socket实现的一对一和多对多聊天模式。一对一模式通过Server和Client类实现简单的消息收发;多对多模式则通过Server类维护客户端集合,并使用多线程实现实时消息广播。文章旨在帮助读者理解Socket的基本原理和应用。
30 1
|
3月前
|
网络协议
关于套接字socket的网络通信。&聊天系统 聊天软件
关于套接字socket的网络通信。&聊天系统 聊天软件
|
4月前
|
网络协议 Java
一文讲明TCP网络编程、Socket套接字的讲解使用、网络编程案例
这篇文章全面讲解了基于Socket的TCP网络编程,包括Socket基本概念、TCP编程步骤、客户端和服务端的通信过程,并通过具体代码示例展示了客户端与服务端之间的数据通信。同时,还提供了多个案例分析,如客户端发送信息给服务端、客户端发送文件给服务端以及服务端保存文件并返回确认信息给客户端的场景。
一文讲明TCP网络编程、Socket套接字的讲解使用、网络编程案例