网络编程基础(聊天室)

服务端

package main

import (
"fmt"
"net"
"strings"
"os"
"log"
) // 服务器只是中转! var msgQue = make(chan string, ) // 现在处理一个消息队列
var quitChan = make(chan bool) // 管理退出消息
var onlineConns = make(map[string]net.Conn) // 管理连接
var logfile *os.File
var logger *log.Logger
func ProcessInfo(conn net.Conn) {
buf := make([]byte, )
defer func(conn net.Conn) {
addr := fmt.Sprintf("%s",conn.RemoteAddr())
delete(onlineConns,addr) // 把断开的链接从字典中去掉
conn.Close()
for i := range onlineConns{ // 打印一下
fmt.Println("online"+i)
}
}(conn)
for {
numofbyte, err := conn.Read(buf) // 读数据并赋值
if err != nil {
break // 报错退出
}
if numofbyte != { // 读到了数据长度如果不等于0 msg := string(buf[:numofbyte]) //打印数据,注意之前发的数据因为改的是[]byte,存在未被覆盖的字节信息,所以这里切一下
msgQue <- msg // 这里放到channel中
}
}
} func Checkerror1(err error) {
if err != nil {
panic(err)
}
} func doProcessMessage(mesa string){
content := strings.Split(mesa,"#") // 把字符串ip序号#消息进行分割
if len(content) > { //如果有消息
addr := content[]
sendMessage := strings.Join(content[:],"#") // 这里为了防止消息中有另外的#
if conn,ok := onlineConns[addr]; ok{ // 看是前面的ip否在消息队列中
_, err := conn.Write([]byte(sendMessage)) //如果在的话写入
if err != nil{
fmt.Println("wrong")
}
}
}
} func ConsumeMessage() { // 这个consume用select用来监控两个channel如果quitchan有消息就退出,如果不是就处理消息进行分发
for {
select {
case mssage := <-msgQue: //解析
doProcessMessage(mssage) // 消息处理,并进行分发
case <-quitChan:
break
}
}
} func main() {
logfile, err := os.OpenFile("LOG_DIRECORY", os.O_RDWR|os.O_CREATE,) // 打开文件
if err != nil{
fmt.Println("log file create failure!")
os.Exit(-)
}
defer logfile.Close()
logger = log.New(logfile,"\r\n",log.Ldate|log.Ltime|log.Llongfile) logger.Println("llkjklj") // 输入log listen_s, err := net.Listen("tcp", "127.0.0.1:8080") // 开启一个socket
Checkerror1(err)
defer listen_s.Close() // 结束关socket fmt.Println("server is waiting..")
go ConsumeMessage()
for {
conn, err := listen_s.Accept() // socket 接链接
Checkerror1(err)
addr := fmt.Sprintf("%s",conn.RemoteAddr()) // 把这个转换一下到string中
onlineConns[addr] = conn
go ProcessInfo(conn) // 处理数据
} }
package main
import (
"fmt"
"net"
"bufio"
"os"
"strings"
) func MessageSend(conn net.Conn) {
var input string
for {
reader := bufio.NewReader(os.Stdin) // 标准输入
data, _,_ := reader.ReadLine() // 读到数据到data
input = string(data)
if strings.ToUpper(input) == "EXIT" { // 如果写的是exit就退出
conn.Close()
break
}
_, err := conn.Write([]byte(input)) // 发消息
if err != nil { // 报错退出
conn.Close()
fmt.Println("Clinet connect fail")
break
}
}
} func Checkerror( err error){
if err != nil {
panic(err)
}
} func main(){
conn, err := net.Dial("tcp","127.0.0.1:8080") // 连接socket
Checkerror(err)
defer conn.Close()
MessageSend(conn) // 发消息
buf := make([]byte,1024)
for {
_, err := conn.Read(buf) // 读消息
if err != nil{
fmt.Println("exit")
os.Exit(0) // 正常退出
}
fmt.Println(string(buf))
}
}

客户端

go网络编程应用的更多相关文章

  1. 猫哥网络编程系列:HTTP PEM 万能调试法

    注:本文内容较长且细节较多,建议先收藏再阅读,原文将在 Github 上维护与更新. 在 HTTP 接口开发与调试过程中,我们经常遇到以下类似的问题: 为什么本地环境接口可以调用成功,但放到手机上就跑 ...

  2. python select网络编程详细介绍

    刚看了反应堆模式的原理,特意复习了socket编程,本文主要介绍python的基本socket使用和select使用,主要用于了解socket通信过程 一.socket模块 socket - Low- ...

  3. Linux Socket 网络编程

    Linux下的网络编程指的是socket套接字编程,入门比较简单.在学校里学过一些皮毛,平时就是自学玩,没有见识过真正的socket编程大程序,比较遗憾.总感觉每次看的时候都有收获,但是每次看完了之后 ...

  4. 猫哥网络编程系列:详解 BAT 面试题

    从产品上线前的接口开发和调试,到上线后的 bug 定位.性能优化,网络编程知识贯穿着一个互联网产品的整个生命周期.不论你是前后端的开发岗位,还是 SQA.运维等其他技术岗位,掌握网络编程知识均是岗位的 ...

  5. 浅谈C#网络编程(一)

    阅读目录: 基础 Socket编程 多线程并发 阻塞式同步IO 基础 在现今软件开发中,网络编程是非常重要的一部分,本文简要介绍下网络编程的概念和实践. Socket是一种网络编程接口,它是对传输层T ...

  6. C++11网络编程

    Handy是一个简洁优雅的C++11网络库,适用于linux与Mac平台.十行代码即可完成一个完整的网络服务器. 下面是echo服务器的代码: #include <handy/handy.h&g ...

  7. Java - 网络编程

    Java的网络编程学习,关于计算机基础的学习参考:计算机网络基础学习 - sqh.     参考:  

  8. Linux网络编程-IO复用技术

    IO复用是Linux中的IO模型之一,IO复用就是进程预先告诉内核需要监视的IO条件,使得内核一旦发现进程指定的一个或多个IO条件就绪,就通过进程进程处理,从而不会在单个IO上阻塞了.Linux中,提 ...

  9. Python Socket 网络编程

    Socket 是进程间通信的一种方式,它与其他进程间通信的一个主要不同是:它能实现不同主机间的进程间通信,我们网络上各种各样的服务大多都是基于 Socket 来完成通信的,例如我们每天浏览网页.QQ ...

  10. iOS网络编程

    今天的重点是UIWebView.NSURLSession.JSon. 网络编程联网准备:1.在Info.plist中添加AppTransportSecurity类型Dictionary:2.在AppT ...

随机推荐

  1. Servlet第一篇(Tomcat)

    Tomcat 什么是Tomcat Tomcat简单的说就是一个运行JAVA的网络服务器,底层是Socket的一个程序,它也是JSP和Serlvet的一个容器. 为什么我们需要用到Tomcat 提供能够 ...

  2. RabbitMQ 1

    RabbitMQ能做些什么? 消息系统允许软件.应用相互连接和扩展.这些应用可以相互链接起来组成一个更大的应用,或者将用户设备和数据进行连接.消息系统通过将消息的发送和接收分离来实现应用程序的异步和解 ...

  3. project2

    [概念] 要好好理解并且背下来记住 Java基础,呵呵呵.自己查吧. local host搞错了,整个跑不出来.真尴尬.不理解啊. static原来是全局的意思啊,好吧.以前都忘了,这次该记住了.st ...

  4. 监听端口,获取webService请求报文

    第一步下载我们的wsdl文件到本地 第二步建立一个测试webservice工程,把wsdl放在项目里面 第三步把测试webservice中的wsdlLocation改成localhost.....你的 ...

  5. hibernate的理解

    emm~这里就是记录一下,hibernate的save,如果存在id,就可以直接save,就会覆盖原有的,如果不存在id就会在数据库创建一条新的记录 package edu.zut.cs.zutnlp ...

  6. python实现随机森林、逻辑回归和朴素贝叶斯的新闻文本分类

    实现本文的文本数据可以在THUCTC下载也可以自己手动爬虫生成, 本文主要参考:https://blog.csdn.net/hao5335156/article/details/82716923 nb ...

  7. 《笨方法学Python》加分题33

    while-leep 和我们接触过的 for-loop 类似,它们都会判断一个布尔表达式的真伪.也和 for 循环一样我们需要注意缩进,后续的练习会偏重这方面的练习.不同点在于 while 循环在执行 ...

  8. HTML5学习路线导航

    一.基本标签元素 1.基础标签第一篇 2.基础标签第二篇 3.表单form的使用 4.新增表单验证 二.CSS样式表 4.CSS插入样式表的三种格式 5.六大选择器 6.样式内容详细讲解 7.背景渐进 ...

  9. Callable Future接口的设计原理

    我们都知道Callable接口作为任务给线程池来执行,可以通过Future对象来获取返回值,他们背后的实现原理是什么?通过总结背后的实现原理有助于我们深入的理解相关技术,做到触类旁通和举一反三. 文章 ...

  10. Django使用第三方模块django-password-reset重置密码

    网上关于django第三方模块django-password-reset重置密码的几篇博客有一个严重的bug 见博客:https://blog.csdn.net/qq_42820268/article ...