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, 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);
	}
}

时间: 2024-10-05 09:20:16

go语言中net包tcp socket的使用的相关文章

go语言中sync包和channel机制

文章转载至:https://www.bytelang.com/article/content/A4jMIFmobcA= golang中实现并发非常简单,只需在需要并发的函数前面添加关键字"Go",但是如何处理go并发机制中不同goroutine之间的同步与通信,golang 中提供了sync包和channel机制来解决这一问题. sync 包提供了互斥锁这类的基本的同步原语.除 Once 和 WaitGroup 之外的类型大多用于底层库的例程.更高级的同步操作通过信道与通信进行. type Co

go语言中bytes包的常用函数,Reader和Buffer的使用

bytes中常用函数的使用: package main; import ( "bytes" "fmt" "unicode" ) //bytes包中实现了大量对[]byte操作的函数和两个最主要的Reader和Buffer两个结构 func main() { str := "aBcD"; //转为小写 fmt.Println(string(bytes.ToLower([]byte(str)))); //转为大写 fmt.Prin

Go语言中Path包用法

// path package main import ( "fmt" "os" "path" "path/filepath" ) func main() { //Path操作 fmt.Println("Path操作-----------------") fmt.Println(path.Base("http://www.baidu.com/file/aa.jpg")) //aa.jpg

go语言中regexp包中的函数和方法

// regexp.go ------------------------------------------------------------ // 判断在 b 中能否找到正则表达式 pattern 所匹配的子串 // pattern:要查找的正则表达式 // b:要在其中进行查找的 []byte // matched:返回是否找到匹配项 // err:返回查找过程中遇到的任何错误 // 此函数通过调用 Regexp 的方法实现 func Match(pattern string, b []

Java学习---TCP Socket的学习

基础知识 1. TCP协议 TCP是一种面向连接的.可靠的.基于字节流的运输层(Transport layer)通信协议.在简化的计算机网络OSI模型中,它完成第四层传输层所指定的功能,UDP是同一层内另一个重要的传输协议. TCP所提供服务的主要特点:面向连接的传输:端到端的通信:高可靠性,确保传输数据的正确性,不出现丢失或乱序:全双工方式传输:采用字节流方式,即以字节为单位传输字节序列:紧急数据传送功能 TCP支持的服务:文件传送File Transfer:远程登录Remote login:

TCP Socket 粘包

 这两天看csdn有一些关于socket粘包,socket缓冲区设置的问题,发现自己不是很清楚,所以查资料了解记录一下: 一两个简单概念长连接与短连接: 1.长连接 Client方与Server方先建立通讯连接,连接建立后不断开, 然后再进行报文发送和接收. 2.短连接 Client方与Server每进行一次报文收发交易时才进行通讯连接,交易完毕后立即断开连接.此种方式常用于一点对多点 通讯,比如多个Client连接一个Server. 二 什么时候需要考虑粘包问题? 1:如果利用tcp每次发

【转载】TCP socket心跳包示例程序

在做游戏开发时,经常需要在应用层实现自己的心跳机制,即定时发送一个自定义的结构体(心跳包),让对方知道自己还活着,以确保连接的有效性. 在TCP socket心跳机制中,心跳包可以由服务器发送给客户端,也可以由客户端发送给服务器,不过比较起来,前者开销可能更大.-- 这里实现的是由客户端给服务器发送心跳包,基本思路是: 1) 服务器为每个客户端保存了IP和计数器count,即map<fd, pair<ip, count>>.服务端主线程采用 select 实现多路IO复用,监听新连

Java 语言中 Enum 类型的使用介绍

Enum 类型的介绍 枚举类型(Enumerated Type) 很早就出现在编程语言中,它被用来将一组类似的值包含到一种类型当中.而这种枚举类型的名称则会被定义成独一无二的类型描述符,在这一点上和常量的定义相似.不过相比较常量类型,枚举类型可以为申明的变量提供更大的取值范围. 举个例子来说明一下,如果希望为彩虹描绘出七种颜色,你可以在 Java 程序中通过常量定义方式来实现. 清单 1. 常量定义 Public static class RainbowColor { // 红橙黄绿青蓝紫七种颜

GO语言中import的规则和用法

GO语言中引入包使用import,我将在本文讲解下规则和用法. 一些规则: 1.包中不能有main方法. 2.同文件夹中可以直接用方法名调用. 3.main函数建议放在package main里4.main不能调用同个目录下的其它文件中的方法. 5.还可以把包放在上级的目录中,如: /src/myFolder/foo/bar1.go #package foo /src/myFolder/foo/bar2.go #package foo /src/myFolder/foo/bar3.go #pac