go 的入门之路 Socket 编程

废话不多说先上代码:

服务端代码server.go 

package main

import (
	"net"
	"fmt"
	"time"
	"bytes"
	"io"
)

func main() {
	add:=new(net.TCPAddr)
	add.IP=	net.ParseIP("127.0.0.1")
	add.Port=7777
	tcpl,err:=net.ListenTCP("tcp", add)
	if err != nil {
		fmt.Println(err)
	}
	for{
		conn,err:=tcpl.Accept()
		if err != nil {
			fmt.Println(err)
		}
		handleClient(conn)
	}
}

func handleClient(conn net.Conn) {
	defer conn.Close()
	var buf bytes.Buffer
	_, err := io.Copy(&buf, conn)
	if err != nil {
		fmt.Println("读取错误")
	}
	fmt.Println(string(buf.Bytes()))
	data:=buf.Bytes()
	fmt.Println(len(data))
	if len(data)==0 {
		daytime := time.Now().String()
		//不需要关心返回值
		conn.Write([]byte(daytime))
	}else{
		//不需要关心返回值
		conn.Write([]byte(string(buf.Bytes())))
	}
}

服务端监听本地IP(127.0.0.1)7777端口。当有客户端连接时,获得一个conn 对象,coon 对象是 interface Conn的实现者,

下面先给给出interface 的结构 里面可以看到这个inteface 包含那些方法。

type Conn interface {
   // Read reads data from the connection.
   // Read can be made to time out and return an Error with Timeout() == true
   // after a fixed time limit; see SetDeadline and SetReadDeadline.
   Read(b []byte) (n int, err error)

   // Write writes data to the connection.
   // Write can be made to time out and return an Error with Timeout() == true
   // after a fixed time limit; see SetDeadline and SetWriteDeadline.
   Write(b []byte) (n int, err error)

   // Close closes the connection.
   // Any blocked Read or Write operations will be unblocked and return errors.
   Close() error

   // LocalAddr returns the local network address.
   LocalAddr() Addr

   // RemoteAddr returns the remote network address.
   RemoteAddr() Addr

   // SetDeadline sets the read and write deadlines associated
   // with the connection. It is equivalent to calling both
   // SetReadDeadline and SetWriteDeadline.
   //
   // A deadline is an absolute time after which I/O operations
   // fail with a timeout (see type Error) instead of
   // blocking. The deadline applies to all future and pending
   // I/O, not just the immediately following call to Read or
   // Write. After a deadline has been exceeded, the connection
   // can be refreshed by setting a deadline in the future.
   //
   // An idle timeout can be implemented by repeatedly extending
   // the deadline after successful Read or Write calls.
   //
   // A zero value for t means I/O operations will not time out.
   SetDeadline(t time.Time) error

   // SetReadDeadline sets the deadline for future Read calls
   // and any currently-blocked Read call.
   // A zero value for t means Read will not time out.
   SetReadDeadline(t time.Time) error

   // SetWriteDeadline sets the deadline for future Write calls
   // and any currently-blocked Write call.
   // Even if write times out, it may return n > 0, indicating that
   // some of the data was successfully written.
   // A zero value for t means Write will not time out.
   SetWriteDeadline(t time.Time) error
}

最后读取响应头,读到[]byte 里面 最后转成string 返回给客户端。如果客户端没有发来任何字符,则选择时间返回给客户端。

客户端代码

package main

import (
	"net"
	"bytes"
	"io"
	"fmt"
)

func main() {

	add:=new(net.TCPAddr)
	add.IP=	net.ParseIP("127.0.0.1")
	add.Port=7777
	conn,err:=net.DialTCP("tcp",nil,add)

	if err!=nil{
		fmt.Println(err)
	}

	//conn.Write([]byte("hello"))
	conn.CloseWrite()
	var buf bytes.Buffer
	_, err = io.Copy(&buf, conn)
	fmt.Println(string(buf.Bytes()))

}

客户端发起请求将收到的数据转成字符串打印出来。客户端可以选择向服务端发数据或者不发数据。如果发数据服务端会将客户端发送的数据转发给客户端,如果没有服务端会把时间转发给客户端。

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏高性能服务器开发

redis网络通信模块源码分析(上)

时下的业界,相对于传统的关系型数据库,以key-value思想实现的nosql内存数据库也是非常流行,而提到内存数据库,很多人第一反应就是redis。确实,re...

3613
来自专栏Golang语言社区

fasthttp中的协程池实现

fasthttp中的协程池实现 协程池可以控制并行度,复用协程。fasthttp 比 net/http 效率高很多倍的重要原因,就是利用了协程池。实现并不复杂,...

6069
来自专栏Golang语言社区

采用interface实现的限时调用方法-博文

在实时性要求高的工程项目中,对于方法执行的时间有较高的要求,本示例程序,实现了一种安全的传入任意参数的方法限时调用工具类,能执行方法的最大容忍运行时间,保证服务...

3064
来自专栏james大数据架构

MVC中局部视图的使用

加载部分视图 $("#result").load("/home/message",function(){ //加载完之后隐藏进度条 });  public Ac...

2037
来自专栏张戈的专栏

分享博客统计中的动态运行天数代码

快到博主恋爱纪念日了,本来是打算做一个恋爱时间统计功能来小小的罗曼蒂克一下,类似于 已相恋 **年 **天 **小时 **分 **秒,当我找到让时间差转成年月日...

47410
来自专栏张伟博客

显示网站运行时间

文章摘自小峰博客,经常逛网站,细心的话会发现,有些网站底部会显示本站稳定运行XX年XX天,甚至后面还显示XX时、XX秒

5372
来自专栏jeremy的技术点滴

《Network Programming with Go》阅读重点备忘(二)

3605
来自专栏李蔚蓬的专栏

1.Android系统源代码目录与系统目录

想要看完整个Android的源代码,需要懂C、懂脚本、懂Java、软硬兼通。所以一般情况下,我们了解源代码的框架结构,出了问题知道从哪里着手解决就可以了。这就好...

5622
来自专栏coder修行路

Go基础之锁的初识

当我们的程序就一个线程的时候是不需要用到锁的,但是通常我们实际的代码不会是单个线程的,所有这个时候就需要用到锁了,那么关于锁的使用场景主要涉及到哪些呢? 当我们...

2958
来自专栏Java帮帮-微信公众号-技术文章全总结

Java文件上传下载实训

文件上传概述 1 文件上传的作用 例如网络硬盘!就是用来上传下载文件的。 在智联招聘上填写一个完整的简历还需要上传照片呢。 2 文件上传对页面的要求 上传文件的...

5155

扫码关注云+社区

领取腾讯云代金券