go实现的简易TCP的客户端和服务器
今天介绍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,一个简单的多线程聊天室就实现了。后期可以加上更多的功能,但无非就是去处理输入输出,重点都已经有了。
go实现的简易TCP的客户端和服务器的更多相关文章
- tcp程序设计--客户端获取服务器输入输出流
tcp程序设计--客户端获取服务器输入输出流 思路: 第一步:实例化一个ServerSocket对象(服务器套接字),用来等待网络上的请求(也就是等待来连接的套接字) 第二步:调用accept()方法 ...
- 2015/12/14 Python网络编程,TCP/IP客户端和服务器初探
一直不是很清楚服务器的定义,对于什么是服务器/客户端架构也只有一个模糊的感觉.最近开始学习,才明白一些什么服务器和客户端的关系. 所谓的服务器,就是提供服务的东西,它是一个硬件或者软件,可以向一个或者 ...
- tcp/ip客户端与服务器
单击“发送数据”把数据发送到指定IP地址的指定端口号 using System; using System.Collections.Generic; using System.ComponentMod ...
- 清晰易懂TCP通信原理解析(附demo、简易TCP通信库源码、解决沾包问题等)C#版
目录 说明 TCP与UDP通信的特点 TCP中的沾包现象 自定义应用层协议 TCPLibrary通信库介绍 Demo演示 未完成功能 源码下载 说明 我前面博客中有多篇文章讲到了.NET中的网络编程, ...
- Socket 通信原理(Android客户端和服务器以TCP&&UDP方式互通)
转载地址:http://blog.csdn.net/mad1989/article/details/9147661 ZERO.前言 有关通信原理内容是在网上或百科整理得到,代码部分为本人所写,如果不当 ...
- Java基础知识强化之网络编程笔记10:TCP之客户端读取文本文件服务器控制台输出
1. TCP之客户端读取文本文件服务器控制台输出 (1)客户端:(发送数据到服务端) package cn.itcast_10; import java.io.BufferedReader; impo ...
- Java基础知识强化之网络编程笔记09:TCP之客户端键盘录入服务器写到文本文件中
1. TCP之客户端键盘录入服务器写到文本文件中 (1)客户端: package cn.itcast_09; import java.io.BufferedReader; import java.io ...
- TCP的客户端搭建
一.设计目标 之前已经写过了TCP服务器原理及通过visual studio 验证 SOCKET编程:搭建一个TCP服务器,这里我们搭建一个TCP客户端界面并对各功能进行实现.设计效果如下: 二.实验 ...
- c语言的tcp和udp客户端和服务器
都是最简单的用来记忆. this is my 的git地址:https://github.com/yanjinyun/cLanguageTcpUdp tcp最简单的服务器: int main(int ...
随机推荐
- OMIM 表型和基因如何关联
OMIM数据库:大神私藏的数据库,99.9%的人都不知道! 2019-03-04 11:00乳腺癌/医生/肺癌 “ GEO.NCDB.TCGA.SEER数据库这些我都知道,但OMIM是什么鬼? OMI ...
- python3解析XML文件
软硬件环境 Ubuntu 15.10 32bit Python 3.5.1 PyQt 5.5.1 前言 Python解析XML的方法挺多,本文主要是利用ElementTree来完成. 实例讲解 解析X ...
- python数据结构之链表(一)
数据结构是计算机科学必须掌握的一门学问,之前很多的教材都是用C语言实现链表,因为c有指针,可以很方便的控制内存,很方便就实现链表,其他的语言,则没那么方便,有很多都是用模拟链表,不过这次,我不是用模拟 ...
- android提权
Android的内核就是Linux,所以Android获取root其实和Linux获取root权限是一回事儿. 你 想在Linux下获取root权限的时候就是执行sudo或者su,接下来系统会提示你输 ...
- 安全svn快速安装
按照如下步骤快速搭建centos6下的svn系统并支持https协议checkout和import代码,亲测成功! 1.[基本包yum安装] yum httpd subversion mod_dav_ ...
- OpenACC 计算规约时发现的小坑
▶ 使用 OpenACC 的 parallel 构件来计算规约,主要想说的是 win10 pgi 和 win10 WSL pgi 结果的不同和关于 for 循环的一个小坑 ● 正常的代码 #inclu ...
- MacBook Pro 一月使用体验
从 2013 年开始,就特别想买 MBP,终于在 2015 年的尾巴用上了 MBPR.原本是要在使用一周后写一份使用体验的,但因为懒,现在拖到一个月了,刚好现在也是2016年的一月,就把标题改成一月使 ...
- windows安装python运行环境使用pycharm
pycharm下载地址: https://www.jetbrains.com/zh/pycharm/download/download-thanks.html 安装教程: https://blog.c ...
- linux添加计划任务
crond 是linux用来定期执行程序的命令.当安装完成操作系统之后,默认便会启动此任务调度命令.crond命令每分锺会定期检查是否有要执行的工作,如果有要执行的工作便会自动执行该工作.可以用以下的 ...
- go遍历目录
package main import ( "fmt" "io/ioutil" "os" "path/filepath" ...