Socket 编程(二)
以一个简单聊天室的例子来说明一二。
socket在某种程度犹如C#中的接口,只要实现了接口即可,无需了解里面复杂的TCP/IP包。举个例子:硬盘坏了,重新买一个得时候,只要买了满足插线的即可,而不需要知道硬盘的内部构造。
在通信的过程中,则需要一个服务器端,来接受客户端发来的消息,然后经过处理返回给需要的客户端。例如:聊天室中,我登录之后,会发送一个消息告诉服务器我登录了(如果格式为Join|用户名),然后服务器会将我的消息进行处理,System.Text.Encoding.Default.GetString(buffer).Split('|'),其中buffer为byte[]类型,消息以流的形式发送。 用一个字符串数组接受处理之后的信息acceptMsg[0]=”Join”,acceptMsg[1]=用户名,通过判断acceptMsg[0]的指令为Join,则会告诉所有用户,该用户加入了聊天室。在QQ中,就是告诉他的所有好友,会有提示。
作为一个简单的聊天室,客户端会有几个事件会触发,也就是发送信息给服务器端。
上图为客户端界面,会发送消息的几个事件分别为:登录,注销,发送(群聊),私聊发送。所以对以上四种消息分别标记为:
登录:Join|用户名 用join区别开来,目的是让服务器好区分开来信息的类型,从而判断客户端的事件类型。
注销:Exit|用户名
发送:Chat|用户名|聊天内容
私聊:Priv|用户名|私聊接受者|聊天内容
。
当然这些信息都得需要一个服务器来监听。
上图为服务器界面。
开启服务之后,服务器则会一直处于监听状态,
当客户一旦发送消息,服务器就会接受到信息并对其处理。它基本处理这样的:
主要是利用System.Text.Encoding.Default.GetString(buffer).Split('|')方法来处理接受到得信息。
acceptMsg[0]==”Join”,则会给所有用户发送消息,会有两种消息,第一是告诉所有用户acceptMsg[1]加入了聊天室,第二是给所有用户发送一个以“List|消息内容”格式的消息,来重新刷新用户在线列表。同理,客户端接收到消息亦要经过处理的。
acceptMsg[0]==”Exit”,服务器接受到此消息则会告诉所有用户acceptMsg[1]离开了聊天室,并结束对该用户的监听线程。
acceptMsg[0]==”Chat”,服务器则会在RichTextBox中显示信息accpetMsg[1];
accpetMsg[0]==”Priv”,服务器则会只把消息给用户acceptMsg[2],消息内容则为:acceptMsg[3];
基本流程图如下
左为服务器端,右为客户端.
出处:http://cnblogs.com/zabery
本文版权归作者和博客园共有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文连接,否则保留追究法律责任的权利。