博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
go语言中net包tcp socket的使用
阅读量:5824 次
发布时间:2019-06-18

本文共 2791 字,大约阅读时间需要 9 分钟。

一、通过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, err := net.ResolveTCPAddr("tcp4", "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, err := net.ResolveTCPAddr("tcp4", "127.0.0.1:8080");	chkError(err);	//监听端口	tcplisten, err2 := net.ListenTCP("tcp", 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, err := net.ResolveTCPAddr("tcp4", "127.0.0.1:8080");	chkError(err);	tcplisten, err2 := net.ListenTCP("tcp", tcpaddr);	chkError(err2);	for {		conn, err3 := tcplisten.Accept();		if err3 != nil {			continue;		}		go clientHandle(conn);	}}

转载于:https://www.cnblogs.com/jkko123/p/7026742.html

你可能感兴趣的文章
贪吃蛇
查看>>
EventSystem
查看>>
用WINSOCK API实现同步非阻塞方式的网络通讯
查看>>
玩一玩博客,嘿嘿
查看>>
P1352 没有上司的舞会
查看>>
ios11文件夹
查看>>
【HLOJ 559】好朋友的题
查看>>
Electric Fence(皮克定理)
查看>>
nvl 在mysql中如何处理
查看>>
MyEclipse 快捷键
查看>>
快速傅里叶变换FFT
查看>>
大数据常用基本算法
查看>>
JavaScript学习笔记(十三)——生成器(generator)
查看>>
hibernate保存失败
查看>>
MySQL增量订阅&消费组件Canal POC
查看>>
Sqlite多线程
查看>>
数据结构-时间复杂度
查看>>
对象与字符串相互转换
查看>>
[NOIp2017提高组]小凯的疑惑
查看>>
《C程序设计语言》练习1-5
查看>>