go语言中net包tcp socket的使用

一、通过socket我们模拟请求网易

package main;

import (
	"net"
	"log"
	"io/ioutil"
	"fmt"
)

func chkError(err error) {
	if err != nil {
		log.Fatal(err);
	}
}

func main() {
	//我们模拟请求网易的服务器
	//ResolveTCPAddr用于获取一个TCPAddr
	//net参数是"tcp4"、"tcp6"、"tcp"
	//addr表示域名或IP地址加端口号
	tcpaddr,err := net.ResolveTCPAddr("tcp4","www.163.com:80");
	chkError(err);

	//DialTCP建立一个TCP连接
	//net参数是"tcp4"、"tcp6"、"tcp"
	//laddr表示本机地址,一般设为nil
	//raddr表示远程地址
	tcpconn,err2 := net.DialTCP("tcp",nil,tcpaddr);
	chkError(err2);

	//向tcpconn中写入数据
	_,err3 := tcpconn.Write([]byte("GET / HTTP/1.1 \r\n\r\n"));
	chkError(err3);

	//读取tcpconn中的所有数据
	data,err4 := ioutil.ReadAll(tcpconn);
	chkError(err4);

	//打印出数据
	fmt.Println(string(data));
}

 

二、通过socket创建简单的服务端

package main;

import (
	"net"
	"log"
)

func chkError(err error) {
	if err != nil {
		log.Fatal(err);
	}
}

func main() {
	//创建一个TCP服务端
	tcpaddr,"127.0.0.1:8080");
	chkError(err);
	//监听端口
	tcplisten,err2 := net.ListenTCP("tcp",tcpaddr);
	chkError(err2);
	//死循环的处理客户端请求
	for {
		//等待客户的连接
		//注意这里是无法并发处理多个请求的
		conn,err3 := tcplisten.Accept();
		//如果有错误直接跳过
		if err3 != nil {
			continue;
		}

		//向客户端发送数据,并关闭连接
		conn.Write([]byte("hello,client \r\n"));
		conn.Close();
	}
}

通过xshell的telnet方法测试。

三、改进上面的代码,使用goroutine来处理用户的请求

package main;

import (
	"log"
	"net"
	"time"
)

func chkError(err error) {
	if err != nil {
		log.Fatal(err);
	}
}

//单独处理客户端的请求
func clientHandle(conn net.Conn) {
	defer conn.Close();

	conn.Write([]byte("hello " + time.Now().String()));
}

func main() {
	//创建一个TCP服务端
	tcpaddr,tcpaddr);
	chkError(err2);
	//死循环的处理客户端请求
	for {
		//等待客户的连接
		conn,err3 := tcplisten.Accept();
		//如果有错误直接跳过
		if err3 != nil {
			continue;
		}

		//通过goroutine来处理用户的请求
		go clientHandle(conn);
	}
}

 

四、连续的处理客户端发送的请求,根据cmd命令不同,返回不同数据。

package main;

import (
	"net"
	"time"
	"log"
	"strings"
)

func chkError(err error) {
	if err != nil {
		log.Fatal(err);
	}
}

//单独处理客户端的请求
func clientHandle(conn net.Conn) {
	//设置当客户端3分钟内无数据请求时,自动关闭conn
	conn.SetReadDeadline(time.Now().Add(time.Minute * 3));
	defer conn.Close();

	//循环的处理客户的请求
	for {
		data := make([]byte,256);
		//从conn中读取数据
		n,err := conn.Read(data);
		//如果读取数据大小为0或出错则退出
		if n == 0 || err != nil {
			break;
		}
		//去掉两端空白字符
		cmd := strings.TrimSpace(string(data[0:n]));
		//发送给客户端的数据
		rep := "";
		if(cmd == "string") {
			rep = "hello,client \r\n";
		} else if (cmd == "time") {
			rep = time.Now().Format("2006-01-02 15:04:05");
		}
		//发送数据
		conn.Write([]byte(rep));
	}
}

func main() {
	tcpaddr,"127.0.0.1:8080");
	chkError(err);
	tcplisten,tcpaddr);
	chkError(err2);
	for {
		conn,err3 := tcplisten.Accept();
		if err3 != nil {
			continue;
		}
		go clientHandle(conn);
	}
}

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐


Golang的文档和社区资源:为什么它可以帮助开发人员快速上手?
Golang:AI 开发者的实用工具
Golang的标准库:为什么它可以大幅度提高开发效率?
Golang的部署和运维:如何将应用程序部署到生产环境中?
高性能AI开发:Golang的优势所在
本篇文章和大家了解一下go语言开发优雅得关闭协程的方法。有一定的参考价值,有需要的朋友可以参考一下,希望对大家有所帮助。1.简介本文将介绍首先为什么需要主...
这篇文章主要介绍了Go关闭goroutine协程的方法,具有一定借鉴价值,需要的朋友可以参考下。下面就和我一起来看看吧。1.简介本文将介绍首先为什么需要主动关闭gor...
本篇文章和大家了解一下go关闭GracefulShutdown服务的几种方法。有一定的参考价值,有需要的朋友可以参考一下,希望对大家有所帮助。目录Shutdown方法Regi...
这篇文章主要介绍了Go语言如何实现LRU算法的核心思想和实现过程,具有一定借鉴价值,需要的朋友可以参考下。下面就和我一起来看看吧。GO实现Redis的LRU例子常
今天小编给大家分享的是Go简单实现多租户数据库隔离的方法,相信很多人都不太了解,为了让大家更加了解,所以给大家总结了以下内容,一起往下看吧。一定会...
这篇“Linux系统中怎么安装NSQ的Go语言客户端”文章的知识点大部分人都不太理解,所以小编给大家总结了以下内容,内容详细,步骤清晰,具有一定的借鉴价值,希
本文小编为大家详细介绍“怎么在Go语言中实现锁机制”,内容详细,步骤清晰,细节处理妥当,希望这篇“怎么在Go语言中实现锁机制”文章能帮助大家解决疑惑,下面...
今天小编给大家分享一下Go语言中interface类型怎么使用的相关知识点,内容详细,逻辑清晰,相信大部分人都还太了解这方面的知识,所以分享这篇文章给大家参考
这篇文章主要介绍“怎么以正确的方式替换Go语言程序自身”的相关知识,小编通过实际案例向大家展示操作过程,操作方法简单快捷,实用性强,希
本文小编为大家详细介绍“Go语言中除法运算的效率怎么提高”,内容详细,步骤清晰,细节处理妥当,希望这篇“Go语言中除法运算的效率怎么提高”文章能帮助大家解...
本文小编为大家详细介绍“Go语言中的next()方法怎么使用”,内容详细,步骤清晰,细节处理妥当,希望这篇“Go语言中的next()方法怎么使用”文章能帮助大家解决疑...
这篇文章主要介绍了Go语言中slice的反转方法怎么使用的相关知识,内容详细易懂,操作简单快捷,具有一定借鉴价值,相信大家阅读完这篇Go语言中slice的反转方法怎...
这篇文章主要介绍“怎么使用Go语言实现数据转发功能”的相关知识,小编通过实际案例向大家展示操作过程,操作方法简单快捷,实用性强,希望这篇“怎么使用Go语
这篇文章主要讲解了“Go语言中怎么实现代码跳转”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究
这篇文章主要讲解了“Go语言如何多开协程”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“Go语言如何多开协...