一、用到的net方法

1 、客户端:

var buf [512]byte

tcpAddr, _ := net.ResolveTCPAddr("tcp", "127.0.0.1:9090")

//向服务器拨号

conn, _ := net.DialTCP("tcp", nil, tcpAddr)

//获取远程服务器地址

rAddr := conn.RemoteAddr()

//发送数据

n, _ := conn.Write([]byte(""))

//接收数据

n, _ = conn.Read(buf[0:])

2、服务器

func ResolveTCPAddr(network, address string) (*TCPAddr, error)

ResolveTCPAddr返回TCP端点的地址。

网络必须是TCP网络名。

如果地址参数中的主机不是字面IP地址或者端口不是字面端口号,那么ResolveTCPAddr将地址解析为TCP端点的地址。

否则,它将地址解析为一对文字IP地址和端口号。

address参数可以使用主机名,但不建议这样做,因为它将最多返回一个主机名的IP地址。

有关网络和地址的描述,请参阅func Dial参数。

network : Tcp Tcp4 Tcp6 address : :9090 应该是访问地址

返回值:*TCPAddr 地址 第二个返回值:err

监听:func ListenTCP(network string, laddr *TCPAddr) (*TCPListener, error)

ListenTCP在本地TCP地址laddr上声明并返回一个*TCPListener,net参数必须是"tcp"、"tcp4"、"tcp6",如果laddr的端口字段为0,函数将选择一个当前可用的端口,可以用Listener的Addr方法获得该端口

第一个参数:TCP 第二个参数 *TCPAddr 地址 返回值 :

具体代码实现

net.go

package main

import (

"fmt"

"log"

"net"

"os"

)

func main() {

tcpAddr, _ := net.ResolveTCPAddr("tcp", ":9090")

//向服务器拨号

conn, _ := net.DialTCP("tcp", nil, tcpAddr)

go HandlerMessage(conn)

//接受来自服务器的消息

buf := make([]byte, 1024)

for {

length, err := conn.Read(buf)

fmt.Println(length)

if err != nil {

log.Printf("recv server msg failed :%v\n", err)

conn.Close()

os.Exit(0)

break

}

fmt.Println(string(buf[0:length]))

}

}

func HandlerMessage(conn net.Conn) {

//获取用户的地址

username := conn.LocalAddr().String()

for {

var input string

//获取用户发送的消息

fmt.Scanln(&input)

if len(input) > 0 {

msg := username + " say " + input

//

_, err := conn.Write([]byte(msg))

if err != nil {

conn.Close()

break

}

}

}

}

server.go

package main

import (

"fmt"

"net"

"os"

)

func main() {

port := "9090"

StartServer(port)

}

func StartServer(p string) {

port := ":" + p

//返回tcp地址

tcpAddr, err := net.ResolveTCPAddr("tcp", port)

fmt.Println(tcpAddr)

if err != nil {

os.Exit(0)

return

}

//监听tcp地址

listener, err := net.ListenTCP("tcp", tcpAddr)

if err != nil {

os.Exit(0)

return

}

buf := make([]byte, 1024)

conns := make(map[string]net.Conn) //用户池

messages := make(chan string, 10) //消息的通道

go BroadCastMessage(conns, messages) //

//每有一个客户进来就将其放入用户池

for {

conn, err := listener.AcceptTCP()

if err != nil {

fmt.Println("Accept failed")

continue

}

conns[conn.RemoteAddr().String()] = conn //将新进来的用户放进用户池

go HandlerMessage(conn, buf, conns, messages) //开一个协程监听用户是否发送消息

}

}

//将收到的信息发送到每一个客户端

func BroadCastMessage(cns map[string]net.Conn, messages chan string) {

for {

messtr :=

//将接收到的消息发送给用户池里的每一个用户

for k, v := range cns {

_, err := v.Write([]byte(messtr)) //发送消息

if err != nil {

delete(cns, k) //如果出现错误 删除用户 结束本次循环

v.Close()

continue

}

}

}

}

//接受用户发送的消息

func HandlerMessage(conn net.Conn, buf []byte, cns map[string]net.Conn, messages chan string) {

for {

length, err := conn.Read(buf)

if err != nil {

conn.Close()

delete(cns, conn.RemoteAddr().String())

break

}

messages

// fmt.Println(string(buf[0:length]))

}

}

OK!

qq聊天信息服务器,golang实现qq聊天之客户端与服务器相关推荐

  1. 电脑中没有oracle服务器,用AnySQL在没有oracle客户端的服务器上发送邮件

    最近要监控一个没有安装oracle客户端的服务器,如果发现异常,将发送邮件通知.目前已经有现成的oracle发送邮件的存储过程,需要做的是从一个没有oracle客户端的服务器上调用该存储过程.在网上搜 ...

  2. 客户端如何修改服务器时间设置在哪里看,客户端同步服务器时间设置在哪里

    客户端同步服务器时间设置在哪里 内容精选 换一换 在创建数据库连接之后,才能使用它来执行SQL语句操作数据.JDBC提供了三个方法,用于创建数据库连接.DriverManager.getConnect ...

  3. 通过服务器下发系统,基于服务器的数据下发方法、客户端、服务器及系统

    1.一种基于服务器的数据下发方法,其特征在于,所述方法包括以下步骤:服务器从配置数据库中读取配置数据,所述配置数据的内容包括数据主键.数值及版 本号:客户端向所述服务器发送数据查询请求,所述数据查询请 ...

  4. http协议跟服务器交互,基于HTTP协议的客户端与服务器之间的数据交互方法专利_专利查询 - 天眼查...

    L-种基于HTTP协议的客户端与服务器之间的数据交互方法,应用于智能$居系统 中,以使用户的客户端与智能家居系统的服务器之间建立稳定的网络连接并进行数据交 互,所述方法包括步骤: 所述客户端与所述服务 ...

  5. 一种即时通信数据传输方法、客户端、服务器及系统

    一种即时通信数据传输方法.客户端.服务器及系统  摘要 本发明实施例提供一种即时通信数据传输方法.客户端.服务器及系统,其中,方法可以包括:向服务器发送传输控制协议TCP连接建立请求,建立与所述服务器 ...

  6. 客户端和服务器之间的信息结构,客户端与服务器之间的通信过程

    客户端与服务器之间的通信过程 内容精选 换一换 一.HTTP概念超文本传输协议(HTTP,HyperTextTransferProtocol)是互联网上应用最为广泛的一种网络协议.所有的WWW文件都必 ...

  7. GBASE 8s客户端与服务器的通信

    GBase客户端与服务器的通信支持多种不同的方式:共享内存 Shared memory.Stream pipe. TCP/IP(Sockets.TLI).IPX/SPX.DRDA.我们通常选择TCP/ ...

  8. 客户端获取服务器性能的请求方法,网管员常见九大问题快速解决方法

    今天的网络发展得真是太快了,关键的问题是它还包含企业的重要应用和服务.单位内的用户和雇员在很大程度上需要依赖网络工作.在这种环境中,网络技术人员往往要诊断一些复杂的网络故障,保持网络运行的通畅.本文讨 ...

  9. 手机服务器协议,手机客户端 云服务器 协议

    手机客户端 云服务器 协议 内容精选 换一换 目前数据库服务器备份Agent安装包需要提交工单进行获取.当前仅支持x86计算类型的服务器,暂不支持鲲鹏计算类型的服务器.用户需要启用数据库备份前,需先在 ...

最新文章

  1. 重塑云上的 Java 语言
  2. windows 下 sublime Text3 做 Python 编辑器
  3. 使用容器与云计算技术快速进行深度学习
  4. mysql %和正则_mysql 正则模式和like模糊查询
  5. 操作系统学习笔记-2.1.1.进程的定义、组成、组织方式、特征
  6. android获得手机号码代码
  7. spring-bean(xml方式管理)
  8. linux mysql 5.7.10_CentOS7 安装 MySQL 5.7.10
  9. CMMI3 和 CMMI 4
  10. 干货!假新闻检测:观察新闻本身,更要观察它所在的新闻环境
  11. Horizon8桌面虚拟化(一)
  12. 经常问到的前端面试题
  13. python爬虫爬微信数据可信吗_我用 Python 爬取微信好友,最后发现一个大秘密
  14. matlab在线性系统中的应用,MATLAB在控制系统仿真中的应用
  15. 数据、数据元素、数据项、数据对象的介绍和理解
  16. 初学Web前端会用到开发工具【零基础web前端入门视频教程】
  17. 首攻RSA,天空卫士“秀肌肉”怎么样了?
  18. Oracle 使用DBMS_JOB和DBMS_SCHEDULER 创建定时任务 创建管理job示例
  19. 参与微软Docs翻译
  20. 全球与中国阻燃海绵市场深度研究分析报告

热门文章

  1. Jmeter增加线程下级循环设置forever,来减少施压端线程创建及销毁的开销
  2. 龙兵汽车4S店系统v1.10.15 汽车销售 汽车营销 汽车小程序
  3. vba遍历数组_VBA 在行中循环遍历的例子
  4. 【C语言】统计学生平均成绩与及格人数
  5. IS-IS(中间系统协议)
  6. 计算机怎样管理e人e本,e人e本t3怎么样 e人e本t3配置与功能介绍【图解】
  7. Windows 7下配置Lex和Yacc
  8. ETF50 ETF500 Pair trading 策略
  9. 群控sdk二次开发完整调用API(厉害了我的哥。。。)
  10. 博大考神autocad2004职称计算机,“博大考神”之职称项目产品及介绍