• 设为首页
  • 点击收藏
  • 手机版
    手机扫一扫访问
    迪恩网络手机版
  • 关注官方公众号
    微信扫一扫关注
    公众号

go语言中net包tcpsocket的使用

原作者: [db:作者] 来自: [db:来源] 收藏 邀请

一、通过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);
	}
}


鲜花

握手

雷人

路过

鸡蛋
该文章已有0人参与评论

请发表评论

全部评论

专题导读
上一篇:
go语言接口断言发布时间:2022-07-10
下一篇:
Go结构体的使用发布时间:2022-07-10
热门推荐
热门话题
阅读排行榜

扫描微信二维码

查看手机版网站

随时了解更新最新资讯

139-2527-9053

在线客服(服务时间 9:00~18:00)

在线QQ客服
地址:深圳市南山区西丽大学城创智工业园
电邮:jeky_zhao#qq.com
移动电话:139-2527-9053

Powered by 互联科技 X3.4© 2001-2213 极客世界.|Sitemap