专栏首页流浪猫的golanggo 的入门之路 Socket 编程

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 条评论
登录 后参与评论

相关文章

  • go panic与recover分析及错误处理

    error 是一种类型,表示错误状态的类型,如果没有错误则是nil。直白点将:error 类型就是描述错误的一种类型。

    地球流浪猫
  • golang mongoDB 的集合创建以及增删改查操作

    mongo官方没有golang 的官方驱动,但是有一个社区驱动: http://labix.org/mgo api文档:https://godoc.or...

    地球流浪猫
  • go 数据库框架xorm 的使用

    golang 连接mysql 的博客可以看我前面的文章。这片文章主要讲xorm,我试过golang 的orm 框架 有beego自带的数据库orm框架htt...

    地球流浪猫
  • mongodb之索引index

    数据库中,根据一个字段的值,来寻找一个文档,是很常见的操作。比如根据学号来找一个学生。

    十月梦想
  • 用键盘8个键演奏一首蒲公英的约定

    用键盘8个键演奏一首蒲公英的约定送给996的自己或月亮代表我的心给七夕的她,非常简单~

    enoyo
  • 来安装一个酷炫的 VS Code 主题更好的刷题

    最近一直在 VSCode 上刷 LeetCode 题目,写久了感觉界面有点沉闷,决定找一个酷炫的主题来醒目一下。

    五分钟学算法
  • 研发:认识Web安全

    确保您的 Web 站点或 Web 应用安全是十分重要的,即使是代码中很小的 bug 也可能导致隐私信息被泄露,黑客会尝试偷窃数据。

    heidsoft
  • A3C原理和代码解析

    完整代码地址:https://github.com/dgriff777/a3c_continuous

    用户1908973
  • 【TensorFlow】TensorFlow 的卷积神经网络 CNN - TensorBoard 版

    前面 写了一篇用 TensorFlow 实现 CNN 的文章,没有实现 TensorBoard,这篇来加上 TensorBoard 的实现,代码可以从 这里 下...

    Alan Lee
  • BitTorrent客户端Transmission曝安全漏洞 允许黑客劫持你的电脑

    “用指尖改变世界” ? 谷歌Project Zero安全团队在被广泛使用的开源BitTorrent下载工具Transmission中发现了一个严重的安全漏洞(C...

    企鹅号小编

扫码关注云+社区

领取腾讯云代金券