首页 > 编程语言 >Go语言网络编程示例

Go语言网络编程示例

时间:2023-07-26 22:57:17浏览次数:55  
标签:err 示例 fmt 编程 Println Go net 连接 客户端

1. 简单示例

  • 以下是一个使用 Go 语言标准库 net 实现的简单的客户端和服务器端示例。
  • 服务器端监听本地的 8080 端口,并在接收到客户端连接后,向客户端发送一条欢迎消息。
  • 客户端通过 Dial 方法连接服务器,并接收服务器发送的欢迎消息。

服务器端代码:

package main

import (
    "fmt"
    "net"
)

func main() {
    // 监听端口
    listener, err := net.Listen("tcp", "localhost:8080")
    if err!= nil {
        fmt.Println("服务器监听端口错误: ", err)
        return
    }
    defer listener.Close()

    fmt.Println("服务器已启动,正在等待连接...")

    for {
        // 接收客户端的连接
        coon, err := listener.Accept()
        if err!= nil {
            fmt.Println("接收客户端连接时发生的错误: ", err)
            continue
        }

        // 开启一个 goroutine 处理客户端连接
        go handleConnection(coon)
    }
}

func handleConnection(coon net.Conn) {
    defer coon.Close()

    fmt.Println("客户端已连接...")
    fmt.Println("客户端地址: ", coon.RemoteAddr().String())
    fmt.Println()

    // 向客户端发送欢迎消息
    message := "欢迎来到服务器"
    coon.Write([]byte(message))
}

客户端代码:

package main

import (
    "fmt"
    "net"
)

func main() {
    // 连接服务器
    conn, err := net.Dial("tcp", "localhost:8080")
    if err!= nil {
        fmt.Println("错误的连接: ", err)
        return
    }
    defer conn.Close()

    // 读取服务器发送的欢迎消息
    buffer := make([]byte, 1024)
    n, err := conn.Read(buffer)
    if err!= nil {
        fmt.Println("读取错误: ", err)
        return
    }

    // 打印欢迎消息
    message := string(buffer[:n])
    fmt.Println("从服务器接收到的欢迎消息: ", message)
}

2. HTTP 请求和响应的示例

以下是一个使用 Go 语言标准库 net 实现的简单的客户端和服务器端示例,用于发送 HTTP 请求并接收 HTTP 响应。

服务器代码:

package main

import (
     "fmt"
     "net"
     "bufio"
)

func main() {
     // 监听端口
     listener, err := net.Listen("tcp", "localhost:8080")
     if err!= nil {
          fmt.Println("无法监听端口:", err)
          return
     }
     defer listener.Close()
     fmt.Println("服务器已启动,等待客户端连接...")

     for {
          // 接受连接
          conn, err := listener.Accept()
          if err!= nil {
               fmt.Println("接收连接失败:", err)
               continue
          }

          // 处理连接
          go handleConnection(conn)
     }
}

func handleConnection(conn net.Conn) {
     defer conn.Close()

     // 读取请求数据
     reader := bufio.NewReader(conn)
     request, err := reader.ReadString('\n')      // 只读取请求行(不读取请求头和请求体)
     if err!= nil {
          fmt.Println("读取请求失败:", err)
          return
     }
     fmt.Println("收到请求:\n", request)

     // 响应客户端
     response := "HTTP/1.1 200 OK\r\nContent-Type: text/plain\r\n\r\nHello World"
     conn.Write([]byte(response))
     fmt.Println("发送响应:\n", response)
}

客户端代码:

package main

import (
    "fmt"
    "net"
)

func main() {
    // 连接服务器
    conn, err := net.Dial("tcp", "127.0.0.1:8080")
    if err!= nil {
        fmt.Println("无法连接到服务器:", err)
        return
    }
    defer conn.Close()

    // 向服务器发送 http 请求信息
    request := "GET / HTTP/1.1\r\nHost: 127.0.0.1\r\n\r\n"
    conn.Write([]byte(request))
    fmt.Println("发送请求:\n", request)

    // 读取服务器发送过来的响应信息
    buffer := make([]byte, 1024)
    n, err := conn.Read(buffer)
    if err!= nil {
        fmt.Println("读取响应失败:", err)
        return
    }

    // 打印响应消息
    response := string(buffer[:n])
    fmt.Println("接收到响应:\n", response)
}
  1. 在上述示例中,服务器端使用 net.Listen 方法监听本地的 8080 端口,并等待客户端连接。一旦有客户端连接,就会启动一个新的 goroutine 来处理连接。

  2. 服务器端通过 bufio.NewReader 从连接中读取 HTTP 请求字符串,然后发送一个包含 HTTP 响应字符串的 TCP 连接。

  3. 客户端使用 net.Dial 方法连接到服务器端的地址,然后发送一个包含 HTTP 请求字符串的 TCP 连接。接着,客户端从连接中读取服务器端返回的 HTTP 响应字符串,并打印到控制台上。

  4. 请注意,这只是一个简单的示例,没有对 HTTP 请求进行解析和处理,也没有处理连接的错误和关闭连接的情况。在实际应用中,你可能需要使用更复杂的库,如 net/http 来处理 HTTP 请求和响应。

3. 标准库文档

Go 语言标准库文档-中文版

标签:err,示例,fmt,编程,Println,Go,net,连接,客户端
From: https://www.cnblogs.com/wanghuizhao/p/17583734.html

相关文章

  • 在GO语言中项目中使用zap日志库
    在GO语言中项目中使用zap日志库本文先介绍了GO语言中原生的日志库中使用,然后想继续介绍了非常流行的Uber开源的zap日志库,同时介绍了如何搭配Lumberjack实现日志的切割和归档。在GO语言项目中使用zap日志库介绍在许多go语言项目中,我们需要一个好的日志记录器能够提供下面这些功......
  • go基础-依赖管理
    有些不可思议,简洁、优雅的go语言依赖管理如此混乱,发布多年也没有可靠的依赖管理机制,官方先后推出了多种依赖管理机制gopath、vender、dep等,没有一个顺手,直到在Go1.11推出gomod才有所缓解,也谈不上优秀,相比maven弱爆了。主流语言都有官方依赖包站点,如maven、pip、npm等。奇葩的是......
  • java RDM协议编程
    JavaRDM协议编程指南1.简介RDM(ReutersDataModel)是一种用于金融市场数据的标准化消息格式。在Java中,我们可以使用RDM协议来编写程序,实现金融市场数据的读取、解析和处理。本文将指导您如何使用Java编写RDM协议相关的代码。2.步骤下面是使用RDM协议编写Java程序的基本步骤:......
  • go语言基础一(包、变量和函数)
    包go程序由一个个不同的包组成,程序的入口是名为main的包,比如我们创建一个main文件main.gopackagemainimport"fmt"funcmain(){fmt.Println("hello")}go要求每一个go文件的非注释开头必须是```packagexxx``,也就是声明该文件属于哪个包导出方式首先我们创如下......
  • Go语言初始化数组的方式
    在Go语言中,数组的初始化有多种方法,我会一一为你列举如下:基本初始化:可以在声明数组时直接指定元素的初始值,由编译器自动推断数组的长度。//方法1:使用数组字面值初始化arr1:=[3]int{1,2,3}//方法2:使用自动推断数组长度arr2:=[...]int{4,5,6}指定索引初始化:可......
  • 第一章 Linux系统编程
    Linux基础命令ctrl+l//快速清屏rm文件名//删除文件,rm*.o表示删除所有.o后缀的文件mkdir目录名//创建一个目录touch文件名//创建一个文件tree//查看文件目录树,但要sudoaotinstalltreell//查看所有文件cp–......
  • Django框架的学习,主要文件介绍,应用,小白必会三板斧
    今日内容详细MySQL数据库、前端我们之前学习了数据库、前端、Python基础等三大部分,但是,他们三块的内容没有串在一起,也就没办法开发出一个完成的web项目出来,因此,我们通过Django框架把这三者融合在一起,以后我们就可以很方便的开发出各种各样的项目.web应用的简介"""是因为Dja......
  • 关于context的用法示例
    1.示例代码ser=self.get_serializer(context={'request':request},data=request.data)以上代码使用了context的方法将request传入到序列化类中 2.另一种写法ser=self.get_serializer(data=request.data)ser.aaa=request 这样也可以向序列化类传入request,如果序列化类......
  • Python基础day53 Django
    web应用的简介因为Django框架是一个专门用来开发web项目的框架1.web应用程序是什么?web应用程序是一种可以通过web访问的应用程序,也就是说只需要一个浏览器即可,不需要其他软件了2.应用程序与有两种模式Django就是开发的B/S应用程序,所以,我们就认为浏览器就是我们......
  • Django基础介绍
    web应用简介Django框架是一个专门用来开发web项目的框架1.web应用程序是什么web应用程序是一种可以通过web访问的应用程序,也就是说只需要一个浏览器即可,不需要其他软件2.应用程序又两种模式c/s、b/sDjango就是开发b/s程序的,所依,我们就认为浏览器是客户端,Django框架就......