文档章节

go实现的简易TCP的客户端和服务器

徐学良
 徐学良
发布于 2015/08/28 10:57
字数 719
阅读 553
收藏 7

今天介绍golang版本的通信基础:基于TCP的客户端和服务器实现,参考书籍:The Way To Go

那时学习java的时候也是做过通信的,当时是socket编程,服务器监听某一个端口,然后客户机去连接,简单的聊天室就实现了。后来有变成多线程的聊天室,可以进行群聊什么的了,后期可以传图片传音乐,加上UI那一块儿,山寨QQ就OK了。现在我来用golang实现一下简易的聊天室,实现了客户机连接服务器,给服务器发消息,服务器接受消息,客户机退出,服务器可以收到退出信息,以及多个客户机同时连入一个服务器。主要的思路和java一样的,服务器监听某一个端口,客户机去连接,然后发送消息就OK了。上代码了。
package main

//服务器端
import (
    "fmt"
    "log"
    "net" //支持通讯的包
)

//开始服务器
func startServer() {
    //连接主机、端口,采用tcp方式通信,监听7777端口
    listener, err := net.Listen("tcp", "localhost:7777")
    checkError(err)
    fmt.Println("建立成功!")
    for {
        //等待客户端接入
        conn, err := listener.Accept()
        checkError(err)
        //开一个goroutines处理客户端消息,这是golang的特色,实现并发就只go一下就好
        go doServerStuff(conn)
    }
}

//处理客户端消息
func doServerStuff(conn net.Conn) {
    nameInfo := make([]byte, 512) //生成一个缓存数组
    _, err := conn.Read(nameInfo)
    checkError(err)

    for {
        buf := make([]byte, 512)
        _, err := conn.Read(buf) //读取客户机发的消息
        flag := checkError(err)
        if flag == 0 {
            break
        }
        fmt.Println(string(buf)) //打印出来
    }
}

//检查错误
func checkError(err error) int {
    if err != nil {
        if err.Error() == "EOF" {
            //fmt.Println("用户退出了")
            return 0
        }
        log.Fatal("an error!", err.Error())
        return -1
    }
    return 1
}
func main() {
    //开启服务
    startServer()
}

 以上是服务器的实现,具体看代码注释
package main

//客户机
import (
    "bufio"
    "fmt"
    "log"
    "net"
    "os"
    "strings"
)

//连接服务器
func connectServer() {
    //接通
    conn, err := net.Dial("tcp", "localhost:7777")
    checkError(err)
    fmt.Println("连接成功!\n")
    //输入
    inputReader := bufio.NewReader(os.Stdin)
    fmt.Println("你是谁?")
    name, _ := inputReader.ReadString('\n')
    //
    trimName := strings.Trim(name, "\r\n")
    conn.Write([]byte(trimName + " 接入了\n "))
    for {
        fmt.Println("我们来聊天吧!按quit退出")
        //读一行
        input, _ := inputReader.ReadString('\n')
        trimInput := strings.Trim(input, "\r\n")
        //如果quit就退出
        if trimInput == "quit" {
            fmt.Println("再见")
            conn.Write([]byte(trimName + " 退出了 "))
            return
        }
        //写出来
        _, err = conn.Write([]byte(trimName + " says " + trimInput))
    }
}

//检查错误
func checkError(err error) {
    if err != nil {
        log.Fatal("an error!", err.Error())
    }
}

//主函数
func main() {
    //连接servser
    connectServer()
}

 以上是客户机代码,具体看注释

运行的时候,分别go run server和client,你变可以看到这样就可以连接成功了。
 服务器只用开一个,客户机可以开任意个,并且相互之间没有干扰。

OK,一个简单的多线程聊天室就实现了。后期可以加上更多的功能,但无非就是去处理输入输出,重点都已经有了。

--------------------------------------------------------------------------------

欢迎提出建议!

本文转载自:http://c2pblog.sinaapp.com/archives/508

徐学良
粉丝 24
博文 213
码字总数 13841
作品 0
浦东
程序员
私信 提问
WireShark对TCP进行抓包,发现一次未知的没有数据传输的连接过程,这次请求的原因和意义是什么?

问题描述 其实问题来源是我在进行搭建简易服务器的时候出现的,在调试过程中我发现每一次访问url,通过 都会接收到除了正常连接进来的外,一个没有数据传输的客户端socket,对上面接收到的s...

_define___
03/24
211
5
Python基础教程,第十五讲,网络编程(一)Socket详解

网络编程的重要性不低于数据库操作,而且两者通常是同时存在,比如用python写一个爬虫程序,最终抓取的数据保存入库,写了一个web项目,用户注册,登录,提交订单等数据最终也要保存到我们的...

程序员补给栈
01/25
32
0
基于Android平台简易即时通讯的研究与设计

1 Android平台简介 Android是Google公司于2007年11月5日推出的手机操作系统,经过2年多的发展,Android平台在智能移动领域占有不小的份额,由Google为首的40多家移动通信领域的领军企业组成开...

今幕明
2014/12/11
308
0
【nodejs原理&源码赏析(5)】net模块与通讯的实现

  一. net模块简介      二. Client-Server的通讯      2.1 server的建立      2.2 Socket的建立      三. IPC通讯      四. 撸一个简易的cluster通讯模型   博客园...

SEOwhywhy
06/04
11
0
linux下用python搭建web服务器

参考文章:https://linux.cn/article-6817-1.html 简易web服务器 web服务器是指在物理服务器上搭建的网络连接服务器,时刻等待客户端的请求,并作出响应。 客户端与服务器的通信,是以HTTP协...

qq_34062105
2018/05/11
0
0

没有更多内容

加载失败,请刷新页面

加载更多

Dubbo-自适应拓展机制

背景 在 Dubbo 中,很多拓展都是通过 SPI 机制进行加载的,比如 Protocol、Cluster、LoadBalance 等,这些都是Dubbo的基础组件。这些基础组件的拓展不是在系统框架启动阶段被加载,而是拓展方...

rock-man
23分钟前
5
0
Kali安装fcitx输入法(五笔)

安装fcitx > sudo apt-get install fcitx-rime fcitx-config-gtk3 重启 > sudo reboot fcitx配置 效果就是这样 配置输入法切换 系统设置...

yeahlife
25分钟前
4
0
IE之css3效果兼容

本文转载于:专业的前端网站▷IE之css3效果兼容 一、兼容css阴影效果(ie滤镜) 1.Shadow,阴影 .shadow { -moz-box-shadow: 3px 3px 4px #000; -webkit-box-shadow: 3px 3px 4px #000; box-sha...

前端老手
28分钟前
4
0
NiushopB2C开源商城功能列表说明:

B2C单商户免费版:PC商城+微商城 B2C单商户标准版:PC商城+微商城组合套餐+阶梯优惠核销功能 B2C单商户企业版:PC商城+微商城拼团+组合套餐阶梯优惠+核销功能 B2C单商户分销版:PC商城+微商城...

niushop-芳
30分钟前
4
0
图片如何转GIF图片呢

如何将生活中拍摄的好玩有趣的图片制作成GIF动图呢?相信很多小伙伴都不知道要如何制作,其实制作方法非常的简单,下面分享一个图片转GIF动图的方法,希望这个方法能够帮助大家在与好友斗图时...

白米稀饭2019
37分钟前
4
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部