go语言网络编程TCP和UDP

go语言网络编程TCP和UDP,第1张

TCP和UDP属于网络七层模型中传输层

TCP协议

TCP/IP(Transmission Control Protocol/Internet Protocol) 即传输控制协议/网间协议,是一种面向连接(连接导向)的、可靠的、基于字节流的传输层(Transport layer)通信协议,因为是面向连接的协议,数据像水流一样传输,会存在黏包问题。

UDP协议

Go语言实现TCP通信

一个TCP服务端可以同时连接很多个客户端,多个客户端可以同时像服务端发送消息,go语言中我们也可以使用线程来处理模拟多个客户端发送服务端处理请求

Go语言可以使用net包代码实现TCP服务端代码
步骤:
1 启动监听端口
2 服务端响应返回消息


一个TCP客户端进行TCP通信的流程如下:

1 建立与服务端的链接
2 进行数据收发
3 关闭链接

package main

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

//tcp  服务端
//网络编程 go语言中net包提供了很多接口
func main() {

	//服务端启动tcp 并且监听 88888端口
	tcp, err := net.Listen("tcp", "127.0.0.1:8989")
	if err!= nil {
		fmt.Println("网络错误")
		return
	}

	//defer tcp.Close()

	//获取连接 多个客户端连接
	for  {
		conn, err := tcp.Accept()
		if err!= nil {
			fmt.Println("Accept error : ", err)
		}

		//使用线程去处理每一个客户端请求
		go process(conn)
	}


}


//处理每一个连接
func process(conn net.Conn) {
	for {
		//关闭连接
		defer conn.Close()

		reader := bufio.NewReader(conn)

		var b [1024]byte
		//读取消息
		n, err := reader.Read(b[:])
		if err != nil {
			fmt.Println("读消息 失败", err)
			break
		}

		//获取到的消息
		fmt.Printf("服务端接收到消息:%s  \n ", string(b[:n]))

		conn.Write([]byte("收到了信息了,你好啊哈哈哈哈哈"))

	}
}

启动服务端和客户端

发送消息

服务端接收消息

Go语言实现UDP通信

UDP协议(User Datagram Protocol)中文名称是用户数据报协议,是OSI(Open System Interconnection,开放式系统互联)参考模型中一种无连接的传输层协议,不需要建立连接就能直接进行数据发送和接收,是不可靠的、没有时序的通信,但是UDP协议的实时性比较好,通常用于视频直播等场景。

还是使用Go语言的net包实现的UDP服务端代码

服务端

package main

import (
	"fmt"
	"net"
)


//服务端接收信息
func main() {

	udp, err := net.ListenUDP("udp", &net.UDPAddr{
		IP: net.IPv4(0, 0, 0, 0),
		Port: 9999,
	})

	if err!=nil {
		fmt.Println("网络错误")
		return

	}

	defer udp.Close()
	for  {

		var b[1024] byte
		n, addr, err := udp.ReadFromUDP(b[:])
		if err!=nil {
			fmt.Println("读取数据错误 : ", err)
			continue
		}

		fmt.Printf(" %s 客户端发送的信息 : %s \n ",addr, string(b[:n]))

		udp.WriteTo([]byte("收到了"),addr)

	}


}

客户端

package main

import (
	"fmt"
	"net"
)

func main() {

	dial, err := net.Dial("udp", "0.0.0.0:9999")


	if err!=nil {
		fmt.Println("网络错误")
		return

	}

	defer dial.Close()

	_, err = dial.Write([]byte("hello...."))
	if err!=nil {
		fmt.Println("发送数据失败")
		return
	}

	//接收数据
	var b[1024]byte

	n, err := dial.Read(b[:])

	if err!=nil {
		fmt.Println("接收数据失败")
		return
	}
	fmt.Println("接收的消息:", string(b[:n]))

}

启动服务端,客户端

服务端接收到消息

客户端发送消息

欢迎分享,转载请注明来源:内存溢出

原文地址: http://www.outofmemory.cn/langs/995416.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-05-21
下一篇 2022-05-21

发表评论

登录后才能评论

评论列表(0条)

保存