Socket 编程(二)

以一个简单聊天室的例子来说明一二。

socket在某种程度犹如C#中的接口,只要实现了接口即可,无需了解里面复杂的TCP/IP包。举个例子:硬盘坏了,重新买一个得时候,只要买了满足插线的即可,而不需要知道硬盘的内部构造。

在通信的过程中,则需要一个服务器端,来接受客户端发来的消息,然后经过处理返回给需要的客户端。例如:聊天室中,我登录之后,会发送一个消息告诉服务器我登录了(如果格式为Join|用户名),然后服务器会将我的消息进行处理,System.Text.Encoding.Default.GetString(buffer).Split('|'),其中buffer为byte[]类型,消息以流的形式发送。 用一个字符串数组接受处理之后的信息acceptMsg[0]=”Join”,acceptMsg[1]=用户名,通过判断acceptMsg[0]的指令为Join,则会告诉所有用户,该用户加入了聊天室。在QQ中,就是告诉他的所有好友,会有提示。

作为一个简单的聊天室,客户端会有几个事件会触发,也就是发送信息给服务器端。

socket2-1

上图为客户端界面,会发送消息的几个事件分别为:登录,注销,发送(群聊),私聊发送。所以对以上四种消息分别标记为:

登录:Join|用户名   用join区别开来,目的是让服务器好区分开来信息的类型,从而判断客户端的事件类型。

注销:Exit|用户名 

发送:Chat|用户名|聊天内容

私聊:Priv|用户名|私聊接受者|聊天内容

当然这些信息都得需要一个服务器来监听。

          socket2-2

上图为服务器界面。

开启服务之后,服务器则会一直处于监听状态,

当客户一旦发送消息,服务器就会接受到信息并对其处理。它基本处理这样的:

主要是利用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];

基本流程图如下

socket2-3 socket2-4

左为服务器端,右为客户端.




作者:余意
出处:
http://cnblogs.com/zabery
本文版权归作者和博客园共有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文连接,否则保留追究法律责任的权利。

posted @ 2009-12-19 13:29  zabery  阅读(522)  评论(4编辑  收藏  举报