(20)Go网络TCP

一、服务器

1.创建服务器

func Listen(net, laddr string) (Listener, error)

func ListenTCP(net string, laddr *TCPAddr) (*TCPListener, error)   //TCP

func ListenUnix(net string, laddr *UnixAddr) (*UnixListener, error)  // Unix

ln, err := net.Listen("tcp", ":8080")
if err != nil {
	// handle error
}
for {
	conn, err := ln.Accept()
	if err != nil {
		// handle error
		continue
	}
	go handleConnection(conn)
}

 2.接收客户端

func (l *TCPListener) Accept() (Conn, error)  //TCP

func (l *TCPListener) AcceptTCP() (*TCPConn, error) 

func (l *UnixListener) Accept() (c Conn, err error)  //Unix 

func (l *UnixListener) AcceptUnix() (*UnixConn, error) 

3.读写 

扫描二维码关注公众号,回复: 11607917 查看本文章

4.实例应用

package main

import (
	"fmt"
	"net"
)

func main() {
	// 监听
	ser, err := net.Listen("tcp", ":8080")
	if err != nil {
		fmt.Println(err.Error())
		return
	}

	for  {
		// 接受新的客户端
		client, err := ser.Accept()
		if err != nil {
			fmt.Println(err.Error())
			continue
		}

		// 开启协程 单独一条线负责和客户端交互
		// 即一个客户端对应一个协程
		go func(conn net.Conn) {
			buf := make([]byte, 4096)
			for  {
				// 获取客户端发来的书籍
				count, err := conn.Read(buf)
				if err != nil {
					//fmt.Println(err.Error())
					continue
				}
				clientMsg := string(buf[:count])
				fmt.Printf("收到%v的消息:%s\r\n", conn.RemoteAddr(), clientMsg)

				if clientMsg == "off" {
					// 关闭客户端
					conn.Close()
					break
				} else {
					// 发送数据给客户端
					client.Write([]byte("已阅" + clientMsg))
				}
			}
		}(client)
	}
}

二、客户端

1.创建客户端

conn, err := net.Dial("tcp", "google.com:80")
if err != nil {
	// handle error
}
fmt.Fprintf(conn, "GET / HTTP/1.0\r\n\r\n")
status, err := bufio.NewReader(conn).ReadString('\n')
// ...

 2.读写 

     读写同服务器

3.实例应用

package main

import (
	"bufio"
	"fmt"
	"log"
	"net"
	"os"
)

func main() {
	dial, err := net.Dial("tcp", ":8080")
	if err != nil {
		fmt.Println(err.Error())
		return
	}

	bufRead := make([]byte, 4096)
	for  {
		// 获取客户端输入
		reader := bufio.NewReader(os.Stdin)
		// 读取一行
		bufWrite, _, err := reader.ReadLine()
		if err != nil {
			continue
		}

		if string(bufWrite[:]) == "off" {
			// 客户端输入off,发送给服务器 我要关闭了
			if _, err := dial.Write(bufWrite); err != nil {
				log.Fatal(err)
			}
			// 关闭客户端
			dial.Close()
			break
		} else {
			// 发送给服务器数据
			if _, err := dial.Write(bufWrite); err != nil {
				log.Fatal(err)
			}

			// 获取服务器发送来的数据
			c,_ := dial.Read(bufRead)
			fmt.Println("服务器说:" + string(bufRead[:c]))
		}
	}
}

猜你喜欢

转载自blog.csdn.net/jadeshu/article/details/106627550