即时信息交流

此即时交流系统分为服务器端和客户端,服务器端仅为新上线的用户提供在线用户列表,客户端与客户端之间完成其余的所有功能,真正实现了点对点的通讯。
一,架构说明

 

二,类库说明:

1, 枚举类(Command):Login:登录;PersonalMessage:私聊;ClientList:在线用户列表;

Logout:下线

2, 发送的消息类(Message)

 1,属性:Sender:发送者;Receiver:接受者;MessageCommand:命令;MessageDetail:消息的详细内容。

 2),方法:GetRawMessage:把消息的详细信息序列化

3,描述客户端类(EndPoint):

1),属性:Name:姓名;Ksname:科室名称;Zyname:专业名称;IPAddressIP地址;Port:监听的端口

2),方法:SendMessage:发送消息。

4,客户端集合(EndPointCollection

5,客户端处理受到消息类(ServerSocket):详见代码。

三,主要代码:
1,Command类和Message类

public enum Command
    
{
        Login            
= 0,
        PersonalMessage    
= 1,
        ClientList        
= 2,
        Conference        
= 3,
        Logout            
= 4
    }

    
public class Common
    
{
        
public const string ServerName    = "Server";
        
public const string All            = "All";
        
    }

    
public class Message
    
{
        
        
string strSender;
        
string strReceiver;
        Command cmdMessageCommand;
        
string strMessageDetail;

        
public Message ()
        
{

        }


        
public Message (byte [] rawMessage)
        
{
            
string strRawStringMessage 
                
= System.Text.Encoding.Default.GetString(rawMessage);            
            
string [] strRawStringMessageArray
                
= strRawStringMessage.Split(new char []{'|'});
            
            
this.strSender            = strRawStringMessageArray[1];
            
this.strReceiver        = strRawStringMessageArray[2];
            
this.cmdMessageCommand    = (Command) Convert.ToInt32(strRawStringMessageArray[3]);
            
this.MessageDetail        = strRawStringMessageArray[4];
        }


        
public string Sender
        
{
            
getreturn strSender;}
            
set{ strSender = value;}
        }


        
public string Receiver
        
{
            
getreturn strReceiver;}
            
set{ strReceiver = value;}
        }

        
public Command MessageCommand
        
{
            
getreturn cmdMessageCommand ;}
            
set{ cmdMessageCommand = value;}
        }

        
public string MessageDetail
        
{
            
getreturn strMessageDetail ;}
            
set{ strMessageDetail = value;}
        }
        

        
public byte [] GetRawMessage ()
        
{
            System.Text.StringBuilder sbMessage 
                
= new System.Text.StringBuilder ("nmds");
            sbMessage.Append(
"|");
            sbMessage.Append(strSender);
            sbMessage.Append(
"|");
            sbMessage.Append(strReceiver);
            sbMessage.Append(
"|");
            sbMessage.Append((
int)cmdMessageCommand);
            sbMessage.Append(
"|");
            sbMessage.Append(strMessageDetail);
            sbMessage.Append(
"|");

            
return System.Text.Encoding.Default.GetBytes(sbMessage.ToString());
        }

2,EndPoint类和EndPointCollection类
public class EndPoint
    
{
        
string strName;
        
private string ks;
        
private string zy;
        
private string ipaddress;
        
private int port;
        TcpClient tcpClient;
//和本机连接的socket
        public EndPoint()
        
{
            
this.tcpClient=null;
        }

        
public string Name 
        
{
            
get{return strName;}
            
setthis.strName = value;}            
        }

        
public string Ksname
        
{
            
get
            
{
            
return this.ks;
            }

            
set
            
{
            
this.ks=value;
            }

        }

        
public string Zyname
        
{
            
get
            
{
            
return this.zy;
            }

            
set
            
{
            
this.zy=value;
            }

        }


        
public string IPAddress
        
{
            
get
            
{
                
return this.ipaddress;
            }

            
set
            
{
            
this.ipaddress=value;
            }

        }

        
public int Port
        
{
            
get
            
{
            
return this.port;
            }

            
set
            
{
            
this.port=value;
            }

        }

            
public TcpClient Socket
        
{
            
get{return tcpClient;}
            
setthis.tcpClient = value;}
        }

        
private  void Connect()
        
{
            
this.tcpClient=new TcpClient();
            IPEndPoint iep
=new IPEndPoint(System.Net.IPAddress.Parse(this.ipaddress),this.port);
            
try
            
{
                
this.tcpClient.Connect(iep);
            }

            
catch
            
{
            
throw new Exception("连接失败");
            }

                     
        }

        
public void SendMessage (Message sendMessage,ref int errcode)
        
{
            errcode
=0;
            
if(this.tcpClient==null)
            
{
            
//this.tcpClient.Close();
                try
                
{
                    
this.Connect();
                }

                
catch
                
{
                    errcode
=1;
                    
return;
                    
                }


                

            }

            
try
            
{

                NetworkStream stream 
= tcpClient.GetStream();
                stream.Write(sendMessage.GetRawMessage() , 
0, sendMessage.GetRawMessage().Length);            
            }

            
catch
            
{
            errcode
=2;
            }

        }

    }

    
public class EndPointCollection: System.Collections.CollectionBase
    
{
        
public EndPointCollection()
        
{
        }

        
public EndPoint this[int index]
        
{
            
get {return (EndPoint) List[index];}
            
set { List[index] = (EndPoint)value; }
        }

        
public void Add (EndPoint client)
        
{
            List.Add(client);
        }

        
public void Remove (string clientName)
        
{
            
for (int i=0;i<List.Count;i++)
            
{
                
if (((EndPoint) List[i]).Name.Equals(clientName))
                
{
                    List.Remove(List[i]);
                }

            }


        }

        
public bool Contains (string name)
        
{
            
for (int i=0;i<List.Count;i++)
            
{
                
if (((EndPoint) List[i]).Name.Equals(name))
                
{
                    
return true;
                }

            }

            
return false;
        }

    }

3,ServerSocket类:

public class SocketServer
    
{
        
        
private TcpListener listener;//本机的侦听器
        private IPAddress ipaAddress;//本级的ip地址
        private int iPort;//本机的侦听端口
        private string name;
        
public delegate void ListenForMessageDelegate(EndPoint client) ;
        
public delegate void ClientConnectedEventHandler (object sender, EndPoint  client);
        
public delegate void ClientDisconnectingEventHandler (object sender, string clientName);
        
public delegate void MessageReceivedEventHandler (object sender, Message clientMessage);
        
public delegate void CommandReceivedEventHandler (object sender, ChatMessage commandMessage);

        
public event ClientConnectedEventHandler ClientConnected;//和对方机器连接发生的事件
        public event ClientDisconnectingEventHandler ClientDisconnecting;//和对方机器断开发生的事件
        public event MessageReceivedEventHandler MessageReceived;//收到消息的事件
        public event CommandReceivedEventHandler CommandReceived;//client列表
  
        Thread thrListenForClients;
        
        ListenForMessageDelegate listenForMessageDelegate ;
        
            

        
bool bListenForClients;
        
SocketServer的构造函数
        
得到姓名
        
得到本机的IP地址
        
得到本机的侦端口
        
启动侦听器
        
停止侦听
        
侦听来自客户端的消息
        
处理来自客户端的消息
        
连接客户端
        
private void ListenForMessagesCallback (IAsyncResult ar)
        
{
            listenForMessageDelegate.EndInvoke(ar);
        }
    

        
        
        
        
客户上线
    }

详细代码:/Files/nethawker/Instance.rar

posted on 2006-10-16 11:25  网络小贩  阅读(609)  评论(0编辑  收藏  举报

导航