最后在公司实习,新人不给活干,就自己随便看看,了解一些DevExpress控件啊,编码规范啊之类的,自己就寻思着写一点点小东西练习练习
出于自己对c# socket这块不熟,就选择了这块,顺便可以进一步了解委托 代理。
闲话不说,先说下这次做的东西:一个局域网聊天的小软件 主要基于udp的通信,如果读者还不知道udp or tcp 那请度娘一下。。。
基本思路(这也都是网上查的,还查了飞鸽传书的 基本原理,在此感谢网上的各位高手哈):
1:软件开启的时候先新开一个线程,该线程充当服务器端,一直死循环监听
2:开了新线程了,调用广播的方法
3:此时如果局域网内已经有有其它主机打开了这个软件,将会监听到这个广播,收到这个广播后将返回自己的主机,并且将监听到的主机添加自己的在线列表中,当然,发起广播的软件也能收到其它软件的回信,收到他们的主机后也加入自己的在线列表,这样各自的列表就都能建立起来,并且将当前的列表加入一个静态的泛型列表中(用于以后和其它用户的通信,维护他们的状态)
4:通信 发送消息:双击一个主机列表后 得到该主机host 传到交谈窗体 并查询出他主机的endpoint,这样就可以进行本机和向该endpoint点发送消息了
5:下线 下线之前软件会发一个下线的广播,其它的软件接到该广播的时候将会将该主机从自己的在线列表中移除
整体思路就这样,下面可以结合代码具体看一下
该页面主要是在线用户列表页面,同时监听其它软件发来的上线,下线,获取主机信息等数据报,维护当前在线的用户 和聊天状态
该页面就是聊天页面,主要是对相应的host进行通信聊天,发送和接收聊天信息,根据聊天窗口设置状态啊之类的
充当服务器的 socket的监听,定义一些监听事件,在form里面使用该事件就可以了
用户上线事件,下线事件,或者主机事件,chat聊天事件,再服务器接收到信息后 感觉信息分类执行不同的事件
在CHAT类型的数据报重要注意的是,当有数据过来接收到 但是该主机窗口并未打开时,要将要收到信息加入一个未读的信息队列中,当再次开发对该用户的聊天窗口时先要加载相应的未读信息队列,这样可以简单的实现离线信息的发送
接下来看下信息数据报的格式
简单的定义一下发送的数据报的格式 可能发送的几种类型:
上线:主要用于软件刚刚开启时向局域网内发送上线广播
下线:软件在关闭之前再向局域网内发送一次下线广播
给出主机信息:用于收到上线广播后 再返回一个自己主机信息给对方,让让对方知道局域网中这台主机是上线的
聊天:就是平常的通信 这里特别注意的是,为考虑到聊天中也会出来,= 这两个协定的字符串,所以 开头加CHAT 表示纯粹聊天的数据报
socket的client代码 实现广播 发送信息
以上简单的逻辑设计+代码就基本完成了这个简单的客户端聊天软件
说了那么多,接下来看下效果图:
本机这边的效果
局域网中另一端的效果
可以实现简单的 通讯
下面是源码下载:猛击我去下载它
大家在下载包中可以发现 有两个项目 一个是ITalk,他是我最初在写的时候使用的,窗体时继承dev的,效果稍微好一点
为考虑到各大读者可能没有安装dev,所以又一模一样的改了一个ITalkTradition,传统的winform
还有源码里面有可能socket的tcp 这块,这个主要是因为我刚刚开始的想法是使用tcp,但是后来发现请求在线用户,聊天之类都比较麻烦,就改用了udp,不过 本人有精力的话 还是要去试着写写tcp传输文件 这块
这篇文章大致就这样啦,如果大家有什么疑问或者建议赶快留言吧,还有本源码和软件仅供交流学习,用于商业或者实际应用了出了问题概不负责哈
http://www.cnblogs.com/yyl8781697/archive/2012/12/07/csharp-socket-udp.html