zoukankan      html  css  js  c++  java
  • go net包简记

    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
    ",buf,cnt)
    		i++
    		time.Sleep(1)
    	}
    

      

  • 相关阅读:
    1.Apache与Tomcat
    jeeplus 多选框
    GIT 回滚
    jsp 中data 转换 字符串
    Pattern和Matcher中表达式
    web.xml 详细介绍
    $.ajax()方法详解
    My 2016
    如何做好一个保安队长。
    集合之WeakHashMap
  • 原文地址:https://www.cnblogs.com/-wenli/p/12321196.html
Copyright © 2011-2022 走看看