TCP服务端

go语言中可以每次建立一次链接就创建一个goroutine去处理,使用goroutine实现并发非常方便和高效。

TCP服务端程序的一般处理流程
1.建立并绑定 Socket:首先服务端使用 socket() 函数建立网络套接字,然后使用 bind() 函数为套接字绑定指定的 IP 和端口;

2.监听请求:接下来,服务端使用 listen() 函数监听客户端对绑定 IP 和端口的请求;

3.接收连接:如果有请求过来,并通过三次握手成功建立连接,则使用 accept() 函数接收该链接;

4.创建goroutine去处理链接:服务端通过 read() 函数从上述已建立连接读取客户端发送的请求数据,经过处理后再通过 write() 函数将响应数据发送给客户端

TCP客户端的一般处理流程
1.建立 Socket:客户端同样使用 socket()函数建立网络套接字;

2.建立连接:建立连接:然后调用 connect() 函数传入 IP 和端口号建立与指定服务端网络程序的连接;

3.发送请求与接收响应:连接建立成功后,客户端就可以通过 write() 函数向服务端发送数据,并使用 read() 函数从服务端接收响应。

TCP服务器

package main

import (
"fmt"
"log"
"net"
) func chkError(err error) {
if err != nil {
log.Fatal(err);
}
} func main() {
//创建一个TCP服务端
tcpaddr, err := net.ResolveTCPAddr("tcp4", "127.0.0.1:8081");
chkError(err);
//监听端口
tcplisten, err2 := net.ListenTCP("tcp", tcpaddr);
chkError(err2);
fmt.Println("Server Start")
//.建立链接并处理
go func(){
for {
//如果有客户端链接过来,阻塞会返回
conn, err := tcplisten.AcceptTCP()
if err != nil {
fmt.Println("Accept err", err)
continue
}
//已经与客户端建立链接,处理业务
go func() {
for {
buf := make([]byte, 512)
cnt, err := conn.Read(buf)
if err != nil {
fmt.Println("recv buf err", err)
continue
}
//回显功能
if _, err := conn.Write(buf[:cnt]); err != nil {
fmt.Println("write bak buf err", err)
continue
}
}
}()
}
}()
//阻塞状态
select {}
}

TCP客户端

package main

import (
"fmt"
"net"
"time"
) func main(){
//1.创建链接远程链接服务器,得到一个conn链接
conn,err := net.Dial("tcp","127.0.0.1:8081")
if err != nil {
fmt.Println("client start err,exit!")
return
}
i := 1
for {
//2.调用链接Write写数据
_,err := conn.Write([]byte(fmt.Sprintf("%s:%d", "Hello Server", i)))
if err != nil {
fmt.Println("write conn err", err)
return
} buf := make([]byte,512)
cnt,err := conn.Read(buf)
if err != nil{
fmt.Println("read buf err")
return
}
fmt.Printf("Server call back:%s,cnt = %d\n",buf,cnt)
i++
time.Sleep(1)
}

  

最新文章

  1. 学习cocos 空程序
  2. 如何实现Magento产品批量导入?
  3. hadoop环境安装及简单Map-Reduce示例
  4. Linux命令初步了解
  5. where和having的区别
  6. 个人笔记mysql游标
  7. 基于visual Studio2013解决C语言竞赛题之1027 YN
  8. String与string的区别(注意大小写)
  9. Java Networking Related (Java Examples in a Nutshell 3rd Edition)
  10. Hibernate缓存和懒加载的坑你知道多少?这5个简单问题回答不上来就不敢说会用hibernate
  11. jsp页面取值
  12. 游戏AI之决策结构—有限状态机/行为树(2)
  13. Oracle DBLINK的相关知识整理
  14. JavaEE 之 RESTful
  15. Java笔记一JAVA安装环境变量配置
  16. define和const的一点点小知识
  17. Spring Boot入门第三天:配置日志系统和Druid数据库连接池。
  18. hibernate3的配置
  19. C#图解教程读书笔记(第7章 类和继承)
  20. selenium - webdriver - ActionChains类(鼠标操作)

热门文章

  1. ASCII、UNICODE、UTF
  2. 【原】C#两个类互相包含类对象可以吗?
  3. 【Python系统学习03】错误类型整理(一)
  4. Linux磁盘管理之LVM逻辑卷快照
  5. AWS、阿里云、Azure、Google Cloud、华为云、腾讯云 各种云服务器价格收费对比(上)
  6. oracle的一些简单语法
  7. Windows和Linux换行的区别
  8. Easy C 编程 in Linux
  9. AVLTree(C++实现)没有统一旋转操作
  10. ios---图片缩放