当前位置: 首页 > news >正文

网站免费正能量小说爱网之家

网站免费正能量小说,爱网之家,常见网站图标,长春业之峰装饰公司怎么样在TCP/IP协议中,“IP地址TCP或UDP端口号”唯一标识网络通讯中的一个进程。 因此可以用Socket来描述网络连接的一对一关系。 常用的Socket类型有两种:流式Socket(SOCK_STREAM)和数据报式Socket(SOCK_DGRAM&#xff09…

在TCP/IP协议中,“IP地址+TCP或UDP端口号”唯一标识网络通讯中的一个进程。

因此可以用Socket来描述网络连接的一对一关系。

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

1 TCP的C/S架构

1.1 单服务版本

服务端代码:

package main  import (  "fmt"  "net")  func main() {  // 创建监控  listener, err := net.Listen("tcp", "localhost:8000")  if err != nil {  fmt.Println("listen err:", err)  return  }  defer listener.Close()  // 主协程结束时,关闭listener  fmt.Println("服务器等待客户端建立连接...")  // 等待客户端连接请求  conn, err := listener.Accept()  if err != nil {  fmt.Println("accpet err:", err)  return  }  defer conn.Close()  // 使用结束,断开与客户端链接  fmt.Println("客户端与服务器连接建立成功...")  // 接收客户端数据  buf := make([]byte, 1024)  // 创建1024大小的缓冲区,用于read  n, err := conn.Read(buf)  // 读取到n个大小的数据  if err != nil {  fmt.Println("read err:", err)  return  }  fmt.Println("服务器读到:", string(buf[:n])) // 读多少,打印多少  
}

如图,在整个通信过程中,服务器端有两个socket参与进来,但用于通信的只有 conn 这个socket。它是由 listener创建的。隶属于服务器端。

客户端代码:

package main  import (  "fmt"  "net")  func main() {  // 主动发送连接请求  conn, err := net.Dial("tcp", "localhost:8000")  if err != nil {  fmt.Println("Dial err", err)  }  defer conn.Close()  // 结束时,关闭连接  // 发送数据  _, err = conn.Write([]byte("Are u ready?"))  if err != nil {  fmt.Println("Write err:", err)  return  }  
}

1.2 并发服务

并发服务端:

Accept()函数的作用是等待客户端的链接,如果客户端没有链接,该方法会阻塞。如果有客户端链接,那么该方法返回一个Socket负责与客户端进行通信。所以,每来一个客户端,该方法就应该返回一个Socket与其通信,因此,可以使用一个死循环,将Accept()调用过程包裹起来。

需要注意的是,实现并发处理多个客户端数据的服务器,就需要针对每一个客户端连接,单独产生一个Socket,并创建一个单独的goroutine与之完成通信。

在判断客户端数据是否为“exit”字符串时,要注意,客户端会自动的多发送2个字符:KaTeX parse error: Undefined control sequence: \n at position 4: “\r\̲n̲”(这在windows系统下代表回车、换行)

服务端代码:

package main  import (  "fmt"  "net"   "strings")  func main() {  // 创建监控  listener, err := net.Listen("tcp", "localhost:8000")  if err != nil {  fmt.Println("listen err:", err)  return  }  defer listener.Close()  // 主协程结束时,关闭listener  for {  // 等待客户端连接请求  conn, err := listener.Accept()  if err != nil {  fmt.Println("accpet err:", err)  return  }  // 处理用户请求,新建一个协程  go HandleConn(conn)  }  
}  // 处理用户请求  
func HandleConn(conn net.Conn) {  // 函数调用完毕,自动关闭conn  defer conn.Close()  // 获取客户端发过来的网址信息  addr := conn.RemoteAddr().String()  fmt.Println(addr, "connect successful")  buf := make([]byte, 2048)  for {  // 读取用户数据  n, err := conn.Read(buf)  if err != nil {  fmt.Println("err=", err)  return  }  fmt.Printf("[%s]: %s\n",  addr,  string(buf[:n]))  fmt.Println("len = ", len(string(buf[:n])))  //if string(buf[:n-1]) == "exit" // nc测试,发送时,只有/n  if string(buf[:n-2]) == "exit" {  fmt.Println(addr, "exit")  return  }  // 将数据转化为大写,再给用户发送  conn.Write([]byte(strings.ToUpper(string(buf[:n]))))  }  
}

并发客户端:

客户端不仅需要持续的向服务端发送数据,同时也要接收从服务端返回的数据。因此可将发送和接收放到不同的协程中。

主协程循环接收服务器回发的数据(该数据应已转换为大写),并打印至屏幕;子协程循环从键盘读取用户输入数据,写给服务器。读取键盘输入可使用 os.Stdin.Read(str)。定义切片str,将读到的数据保存至str中。

这样,客户端也实现了多任务。

package main  import (  "fmt"  "net"   "os")  func main() {  // 主动发送连接请求  conn, err := net.Dial("tcp", "localhost:8000")  if err != nil {  fmt.Println("Dial err", err)  }  defer conn.Close()  // 客户端终止时,关闭于服务器通讯的socket  // 启动子协程: 接受用户键盘输入发送给服务端  go func() {  // 创建用于存储用户键盘输入数据的切片缓冲区str := make([]byte, 1024)    for {  // 反复读取  n, err := os.Stdin.Read(str)  // 获取用户键盘输入(阻塞)  if err != nil {  fmt.Println("os.Stdin.Read err:", err)  return  }  // 从键盘读到的数据,发送给服务端  _, err = conn.Write(str[:n])  if err != nil {  fmt.Println("conn.Write err:", err)  return  }  }  }()  // 主协程: 接受服务端数据,进行打印输出  buf := make([]byte, 1024)  // 定义用于存储服务器回发数据的切片缓冲区  for {  n, err := conn.Read(buf)  // 从通信socket中读数据,存入切片缓冲区(阻塞)  if err != nil {  fmt.Println("conn.Read err:", err)  return  }  fmt.Printf("服务器回发: %s\n", string(buf[:n]))  }  }

http://www.dtcms.com/a/488342.html

相关文章:

  • 网站建设数据库系统网站开发api平台
  • 信管女生做网站开发兰州大学网页与网站设计
  • Unet-初探
  • 小鱼儿网站做啥用的悬赏做海报的网站
  • 如何做网站数据库关于网站运营
  • 免费培训seo网站找人做的网站怎么运行
  • 织梦网站空间如何清理长沙网站建设公司排名
  • 网站开发 自我评价wordpress搭建群空间
  • 高效构建AI智能体的上下文工程
  • 网站被墙 做301跳转企业网站制作免费下载
  • 网站建设性能指标做游戏交易网站有哪些内容
  • dirsearch工具的使用
  • 网站素材 图标新零售分销系统开发
  • 无忧seo博客关键词优化排名易下拉软件
  • 网站开发+进度表图片免费转链接
  • 计算机毕设选题推荐:基于Java和SpringBoot技术的停车场管理系统
  • 做网站设计用什么软件最好wordpress add_option内容被转义
  • 网站开发属于哪个部门云服务器和普通服务器的区别
  • 做网站什么空间比较好pc网站如何做seo
  • 【408计组】2.3扩展 各码的作用
  • ui设计师个人网站建设学做网站网
  • 免费网站管理软件erp软件多少钱
  • 制作网站要花多少钱网络营销课程感悟
  • 汕头市企业网站建设教程东营建设信息网招聘
  • HiRAG问答流程深入分析
  • 凤城网站建设违规网站开发 开发者如何规避风险
  • 对接空间站西双版纳傣族自治州傣医医院
  • EtherNet/IP转DeviceNet工业PLC网关:打通电网调度全链路控制
  • 国内外高校门户网站建设的成功经验与特色分析沈阳手机端建站模板
  • 邢台高端网站建设单片机培训