[GoLang]GO语言编写的简易TCP服务端、客户端

前端之家收集整理的这篇文章主要介绍了[GoLang]GO语言编写的简易TCP服务端、客户端前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。

客户端程序:

package main

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

//缓冲区大小
const BUFFSIZE = 1024

//定义消息缓冲区
var buff = make([]byte,BUFFSIZE)

//链接处理
func handleConn(tcpConn *net.TCPConn,addr string) {
	if tcpConn == nil {
		//fmt.Println()
		return
	}
	for{
		n,err := tcpConn.Read(buff)
		if err == io.EOF {
			fmt.Printf("远程链接:%s已经关闭!\n",tcpConn.RemoteAddr().String())
			return
		}
		handleError(err)
		if string(buff[:n]) == "exit" {
			fmt.Printf("远程链接:%s退出!\n",tcpConn.RemoteAddr().String())
		}
		if n > 0 {
			fmt.Printf("%s发来消息:%s",addr,string(buff[:n]))
		}
	}
}

func handleError(err error) {
	if err == nil {
		return
	}
	fmt.Printf("错误:%s\n",err.Error())
}

func main() {

	//判断命令行参数是否错误
	if len(os.Args) != 2 {
		fmt.Printf("调用参数错误,程序中断!\n")
		return
	}

	//获取通讯端口
	port := os.Args[1]

	//原型:func ResolveTCPAddr(net,addr string) (*TCPAddr,error) ResolveTCPAddr parses addr as a TCP address
	//分解ip为TCP地址
	tcpAddr,err := net.ResolveTCPAddr("tcp4","localhost:" + port)
	handleError(err)
	if err != nil {
		return
	}

	//原型:func ListenTCP(net string,laddr *TCPAddr) (*TCPListener,error) ListenTCP announces on the TCP address laddr and returns a TCP listener.
	//通过TCP地址返回一个TCP监听
	tcpListener,err := net.ListenTCP("tcp4",tcpAddr)
	handleError(err)
	if err != nil {
		return
	}

	fmt.Printf("启动监听,等待链接!\n")

	//延迟,监听关闭
	defer tcpListener.Close()

	for {
		//func (l *TCPListener) AcceptTCP() (*TCPConn,error) AcceptTCP accepts the next incoming call and returns the new connection.
		//等待下一个访问并返回一个新链接
		tcpConn,err := tcpListener.AcceptTCP()
		handleError(err)
		if err != nil {
			return
		}

		fmt.Printf("客户端:%s已连接!\n",tcpConn.RemoteAddr().String())
		//延迟,关闭链接
		defer tcpConn.Close()
		//启动一个连接处理线程
		go handleConn(tcpConn,tcpConn.RemoteAddr().String())
	}
}

服务端程序:

package main

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

const BUFFSIZE = 1024
var buff = make([]byte,BUFFSIZE)

func handleError(err error) {
	if err == nil {
		return
	}
	fmt.Printf("错误:%s\n",err.Error())
}

func main() {
	if len(os.Args) != 2 {
		fmt.Printf("参数错误, 程序中断!\n")
		return
	}
	port := os.Args[1]
	tcpAddr,"localhost:" + port)
	handleError(err)
	tcpConn,err := net.DialTCP("tcp4",nil,tcpAddr)
	handleError(err)

	fmt.Printf("连接成功,请输入信息!\n")

	reader := bufio.NewReader(os.Stdin)
	continued := true
	inputStr := ""

	for(continued){
		n,err := reader.Read(buff)
		handleError(err)
		if n > 0 {
			k,_ := tcpConn.Write(buff[:n])
			if k > 0 {
				inputStr = string(buff[:n])
				fmt.Printf("发送消息:%s",inputStr)
				if inputStr == "exit\n" {
					continued = false
				}
			}
		}
	}
}

服务端:


客户端:

猜你在找的Go相关文章