Golang网络编程

目录

前言

net包中关于tcp开发的方法

 服务端代码

客户端代码

运行结果

服务端

客户端


前言

Go作为一门“新兴”语言,凭借其简单易学和优越的性能,以及原生的goroutine并发模型,在网络服务器编程方面有其不可替代的位置,下面就来记录使用go从简单的tcp服务到逐渐完善的服务端开发过程,在此过程中我们将用到:

  1. net包中关于tcp的方法;
  2. goroutine和channel的并发编程;
  3. golang的异常处理;

net包中关于tcp开发的方法

 服务端代码

package main

import (
	"fmt"
	"net"
)

func main() {
	// listen监听TCP
	addr := "0.0.0.0:12345"
	lsr, err := net.Listen("tcp", addr)
	if err != nil {
		fmt.Println("failed listen", addr, err)
		return
	}
	defer lsr.Close()
	// accept同步等待客户端连接
	// conn客户端新建连接
	conn, err := lsr.Accept()
	if err != nil {
		fmt.Println("failed accept", err)
		return
	}
	defer conn.Close()
	fmt.Println("new tcp connection")
	fmt.Println("connection local address", conn.LocalAddr())
	fmt.Println("connection remote address", conn.RemoteAddr())
	// read同步等待客户端发送数据包
	// readBuffer预分配读取空间
	var readBuffer = make([]byte, 1024)
	readBytes, err := conn.Read(readBuffer)
	if err != nil {
		fmt.Println("failed read", err)
		return
	}
	fmt.Println("read", readBytes, string(readBuffer[:readBytes]))
	// 业务逻辑处理
	sendBuffer := []byte("Hello " + string(readBuffer[:readBytes]))
	// 网络应答
	sendBytes, err := conn.Write(sendBuffer)
	if err != nil {
		fmt.Println("failed write", err)
		return
	}
	fmt.Println("send", sendBytes, string(sendBuffer))
	// 完毕
}

客户端代码

package main

import (
	"fmt"
	"net"
)

func main() {
	// dial客户端连接到服务端
	addr := "0.0.0.0:12345"
	conn, err := net.Dial("tcp", addr)
	if err != nil {
		fmt.Println("failed connect to server", addr, err)
		return
	}
	defer conn.Close()
	fmt.Println("new tcp connection")
	fmt.Println("connection local address", conn.LocalAddr())
	fmt.Println("connection remote address", conn.RemoteAddr())
	// 业务逻辑
	var sendBuffer = []byte("tcpclient")
	// write发送请求包
	sendBytes, err := conn.Write(sendBuffer)
	if err != nil {
		fmt.Println("failed send", addr, err)
		return
	}
	fmt.Println("send", sendBytes, string(sendBuffer))
	// read同步等待服务端应答
	// readBuffer预分配读取空间
	var readBuffer = make([]byte, 1024)
	readBytes, err := conn.Read(readBuffer)
	if err != nil {
		fmt.Println("failed read", err)
		return
	}
	fmt.Println("read", readBytes, string(readBuffer[:readBytes]))
}

运行结果

服务端

new tcp connection
connection local address 127.0.0.1:12345
connection remote address 127.0.0.1:63549
read 9 tcpclient
send 15 Hello tcpclient

客户端

new tcp connection

connection local address 127.0.0.1:63549

connection remote address 127.0.0.1:12345

send 9 tcpclient

read 15 Hello tcpclient

当然,这仅仅是最基础的tcp网络应用示例,服务端仅能处理一次请求,明天我们继续完善:

  1. 服务端如何处理多tcp客户端链接;
  2. 非阻塞服务端如何开发;
  3. 服务端如何退出;
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值