服务器循环接收客户端消息|学习笔记

简介: 快速学习服务器循环接收客户端消息

开发者学堂课程【Go 语言核心编程 - 面向对象、文件、单元测试、反射、TCP 编程:服务器循环接收客户端消息】学习笔记,与课程紧密联系,让用户快速学习知识。

课程地址:https://developer.aliyun.com/learning/course/626/detail/9781


服务器循环接收客户端消息

 

内容介绍

一、具体完善内容

二、注意事项

 

一、具体完善内容

将作业:要求在之前的基础上完成可以循环地输入内容,能够通过终端输入数据(输入一行送一行),并发送给服务端[],在终端输入 exit,表示退出程序进行完善,让其在客户端不再退出而是做 for 循环。打开 client.go,ReadString 应该进行 for 循环,将fmt.Printf(“客户端发送了%d 字节的数据,并退出“,n)删除,再将其包裹调整,如下:

for {

//从终端读取一行用户输入,并准备发送给服务器

line, err : = reader.Readstring("\n')

if err != nil {

fmt.Println("readString err=", err)

}

//再将 line 发送给 服务器

_,err = conn.Write([ ]byte(line))

if err != nil {

fmt.Println("conn.write err=", err)

}

}

在发送时并没有办法退出,所以要做一个判断,如下:

// 如果用户输入的是 exit 就退出

if line ==“exit“ {

fmt.Println(客户端退出..”)

break

}

但此时是不正确的,本身是存在\n 的,进行比较时要将 line 进行处理,将其除去,如下:

strings.Trim(line,”\r\n”)

但如果进行这样的操作,需要引入包,如下:

package main

import (

"fmt"

"net"

"bufio"

"os"

"strings"

)

此时,要同时考虑到服务端 server,在以上运行中,循环服务器的情况如下:

image.png

但此时如果不回车则会一直等待,要将 server 提示信息去除后循环结果如下:image.png

此时并没有进行换行,要_,err = conn.Write([ ]byte(line))后加入_,err = conn.Write([ ]byte(line + “\n”)),再进行运行,进入到客户端,进入到 cmd,写入go run client.go 进行连接,则循环结果如下:image.png

而切换为两个客户端连接时,是可以进行区分的,如下:

image.png

此时已经完成两个客户端到一个服务器端,而一个服务器端可以协程两个客户端进行服务,在进行退出时也可以捕获到客户端的退出。

此时的模式是 A 客户端与服务器端进行交互,如果 A 客户端与B客户端要进行交互,则服务器端的内容与功能要增加,可以在协程中拿到 B 客户端的连接。

对 client.go 进行了改进,划线区域如下:

for {

//从终端读取一行用户输入,并准备发送给服务器

line, err : = reader.Readstring("\n')

if err != nil {

fmt.Println("readString err=", err)

}

// 如果用户输入的是 exit 就退出

line = strings.Trim(line,”\r\n”)

if line ==“exit“ {

fmt.Println(客户端退出..”)

break

}

//再将 line 发送给服务器

_,err = conn.Write([ ]byte(line + “\n”))

if err != nil {

fmt.Println("conn.write err=", err)

}

}

 

二、注意事项

如果写为 fmt.Print(string(buf)),会出现一些错误,字节里可能预先有一些内容,buf 后面的内容可会会导致其出现一些问题,如下:

image.png

此时内容会出现空格而排在后面,写为 fmt.Print(string(buf[:n]))是正确的。

相关文章
|
16天前
|
存储 开发工具 git
[Git] 深入理解 Git 的客户端与服务器角色
Git 的核心设计理念是分布式,每个仓库既可以是客户端也可以是服务器。通过 GitHub 远程仓库和本地仓库的协作,Git 实现了高效的版本管理和代码协作。GitHub 作为远程裸仓库,存储项目的完整版本历史并支持多客户端协作;本地仓库则通过 `.git` 文件夹独立管理版本历史,可在离线状态下进行提交、回滚等操作,并通过 `git pull` 和 `git push` 与远程仓库同步。这种分布式特性使得 Git 在代码协作中具备强大的灵活性和可靠性。
45 18
[Git] 深入理解 Git 的客户端与服务器角色
|
2月前
|
存储 人工智能 自然语言处理
ChatMCP:基于 MCP 协议开发的 AI 聊天客户端,支持多语言和自动化安装 MCP 服务器
ChatMCP 是一款基于模型上下文协议(MCP)的 AI 聊天客户端,支持多语言和自动化安装。它能够与多种大型语言模型(LLM)如 OpenAI、Claude 和 OLLama 等进行交互,具备自动化安装 MCP 服务器、SSE 传输支持、自动选择服务器、聊天记录管理等功能。
246 15
ChatMCP:基于 MCP 协议开发的 AI 聊天客户端,支持多语言和自动化安装 MCP 服务器
|
3月前
|
开发框架 .NET C#
在 ASP.NET Core 中创建 gRPC 客户端和服务器
本文介绍了如何使用 gRPC 框架搭建一个简单的“Hello World”示例。首先创建了一个名为 GrpcDemo 的解决方案,其中包含一个 gRPC 服务端项目 GrpcServer 和一个客户端项目 GrpcClient。服务端通过定义 `greeter.proto` 文件中的服务和消息类型,实现了一个简单的问候服务 `GreeterService`。客户端则通过 gRPC 客户端库连接到服务端并调用其 `SayHello` 方法,展示了 gRPC 在 C# 中的基本使用方法。
61 5
在 ASP.NET Core 中创建 gRPC 客户端和服务器
|
4月前
|
网络协议 Ubuntu Linux
gpg从公钥服务器接收失败(gpg: keyserver receive failed: Server indicated a failure)
通过上述步骤,大多数情况下应该能够解决GPG从公钥服务器接收失败的问题。如果问题依旧存在,可能需要进一步调查与公钥服务器相关的更深层次的技术问题,或者考虑在相关社区论坛寻求帮助。
754 1
|
4月前
|
网络协议 Unix Linux
一个.NET开源、快速、低延迟的异步套接字服务器和客户端库
一个.NET开源、快速、低延迟的异步套接字服务器和客户端库
120 4
|
4月前
|
安全 区块链 数据库
|
29天前
|
弹性计算 数据挖掘 应用服务中间件
阿里云轻量应用服务器68元与云服务器99元和199元区别及选择参考
目前阿里云有三款特惠云服务器,第一款轻量云服务器2核2G68元一年,第二款经济型云服务器2核2G3M带宽99元1年,第三款通用算力型2核4G5M带宽199元一年。有的新手用户并不是很清楚他们之间的区别,因此不知道如何选择。本文来介绍一下它们之间的区别以及选择参考。
416 87
|
22天前
|
存储 弹性计算 应用服务中间件
阿里云轻量应用服务器出新品通用型实例了,全球26个地域可选
近日,阿里云再度发力,推出了首款全新升级的轻量应用服务器——通用型实例。这款服务器实例不仅标配了200Mbps峰值公网带宽,更在计算、存储、网络等基础资源上进行了全面优化,旨在为中小企业和开发者提供更加轻量、易用、普惠的云计算服务,满足其对于通用计算小算力的迫切需求。目前,这款新品已在全球26个地域正式上线,为全球用户提供了更加便捷、高效的上云选择。
137 27
|
13天前
|
机器学习/深度学习 人工智能 弹性计算
阿里云AI服务器价格表_GPU服务器租赁费用_AI人工智能高性能计算推理
阿里云AI服务器提供多种配置,包括CPU+GPU、FPGA等,适用于人工智能、机器学习和深度学习等计算密集型任务。本文整理了阿里云GPU服务器的优惠价格,涵盖NVIDIA A10、V100、T4等型号,提供1个月、1年和1小时的收费明细。具体规格如A10卡GN7i、V100-16G卡GN6v等,适用于不同业务场景,详情见官方页面。
84 11
|
13天前
|
存储 弹性计算 数据挖掘
阿里云服务器ECS通用算力型u1和ECS经济型e实例性能特点、使用及常见问题解答FAQ
阿里云ECS云服务器的经济型e实例和通用算力型u1实例深受开发者和中小企业青睐。e实例适合中小型网站、开发测试等轻量级应用,采用共享CPU调度模式,性价比高;u1实例则适用于中小型企业级应用,提供更高的性能保障和稳定性,支持固定CPU调度模式,计算性能更稳定。同等配置下,u1实例在网络带宽、IOPS等方面表现更优,价格也相对较高。个人用户可选择e实例,中小企业建议选择u1实例以确保业务稳定性。