Skip to content

Latest commit

 

History

History
99 lines (90 loc) · 2.16 KB

9.2-tcp客户端.md

File metadata and controls

99 lines (90 loc) · 2.16 KB

9.2、tcp客户端

1、创建tcp客户端

使用net包的Dial方法

   Dial(network, address string) (Conn, error):打开一个socket连接
       
   //net.Conn连接方法
   conn.Write([]byte) :往socket连接写入数据
   conn.Read([]byte)  :读取socket中的数据
   conn.Close() : 短连接需要关闭
package main

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

//tcp client:读取用户从终端输入的字符,发送到服务器
func main() {
	//readFromTerminalByOsPackage()
	readFromTerminalByBufioPackage()
}

//使用os包读取终端输入
func readFromTerminalByOsPackage() {
	addr := "127.0.0.1:8080"
	//打开连接,创建一个socket
	conn, err := net.Dial("tcp", addr)
	if err != nil {
		////由于目标计算机积极拒绝而无法创建连接
		fmt.Printf("connect to server:%s failed,err=%s", addr, err)
		return
	}
	//读取server返回
	go readFromServer(conn)
	buf := make([]byte, 1024)
	for {
		n, err := os.Stdin.Read(buf)
		if err != nil {
			fmt.Println("read error from stdin.")
			return
		}
		_, err = conn.Write(buf[:n])
		if err != nil {
			fmt.Println("write pack error:", err)
		}
	}
}

func readFromTerminalByBufioPackage() {
	addr := "127.0.0.1:8080"
	//打开连接
	conn, err := net.Dial("tcp", addr)
	if err != nil {
		////由于目标计算机积极拒绝而无法创建连接
		fmt.Printf("connect to server:%s failed,err=%s", addr, err)
		return
	}
	//读取server返回
	go readFromServer(conn)
	reader := bufio.NewReader(os.Stdin)
	for {
		input, readErr := reader.ReadBytes('\n')
		if readErr != nil {
			fmt.Println("read error from stdin.", readErr)
			return
		}
		input = input[:len(input)-1] //去掉\n ,windows为\r\n
		_, err = conn.Write(input)
		if err != nil {
			fmt.Println("write pack error:", err)
		}
	}
}

//获取从服务端返回的数据
func readFromServer(conn net.Conn) {
	buf := make([]byte, 1024)
	for {
		n, err := conn.Read(buf)
		if err != nil {
			if err == io.EOF {
				fmt.Println("server close.")
				conn.Close()
				os.Exit(-1)
			}
			fmt.Println("read from server error:", err)
			return
		}
		fmt.Println("read from server data:", string(buf[:n]))
	}
}