go语言中net包tcp socket的使用
发布时间:2020-12-16 18:02:34 所属栏目:大数据 来源:网络整理
导读:一、通过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"、"
一、通过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 rnrn"));
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 rn"));
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 rn";
} 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);
}
}
(编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |