您的位置:首页 > 理论基础 > 计算机网络

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

2014-04-01 19:01 513 查看
客户端程序:

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, err := net.ResolveTCPAddr("tcp4", "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
}
}
}
}
}

服务端:



客户端:

内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  GoLang go TCP 聊天
相关文章推荐