c#聊天室程序

整理文档很辛苦,赏杯茶钱您下走!

免费阅读已结束,点击下载阅读编辑剩下 ...

阅读已结束,您可以下载文档离线阅读编辑

资源描述

计算机学院课程设计专业:08网络工程课程名称:TCP/IP协议分析实验课题名称:基于TCP协议的C#聊天程序教师:桂学勤学号:084221019时间:2010年6月18日目录一:需求分析.....................................................................................................................................31.1编写目的.............................................................................................................31.2开发环境.............................................................................................................31.3功能介绍.............................................................................................................31.4SOCKET通信机制...................................................................................................3二:代码实现...............................................................................................................42.1服务器端主要代码.............................................................................................42.2客户端主要代码...............................................................................................11三:程序运行界面.....................................................................................................153.1登录界面...........................................................................................................153.2登录成功后的聊天界面...................................................................................153.3服务器端显示界面...........................................................................................15四:总结.....................................................................................................................16基于TCP协议的C#聊天程序前言随着互联网技术的飞速发展,基于网络的即时通信技术也给人们带来了诸多便利,人们也慢慢体会到了网上聊天的乐趣与无拘束的感觉。聊天工具作为当今使用最为广泛的即时通信工具之一,可以方便的同网络上的好友在线交流。在中国,最流行的莫过于腾讯公司的QQ,伴随着技术的不断升级,腾讯公司也为我们带来了越来越多的精彩的服务。这里我将利用Socket编程技术模拟QQ聊天功能,实现一个简单的在线聊天室。一:需求分析1.1编写目的编写该软件能够对自己所学的东西进行一次系统的回顾,加深对TCP协议的理解以及提升自己实际开发的能力。1.2开发环境操作系统:windowsxpsp3内存:2GCPU:AMDAthlon(tm)64X2DualCoreProcessor5200+2.71GHz编程软件:MicrosoftVisualStudio20101.3功能介绍该程序是利用c#语言编写的一个基于Socket的简单聊天软件,最要实现了用户登录,但登录时只需要提供用户名,不需要输入密码。具有私聊和群聊两种聊天模式,即允许多人在线聊天,并且在线用户聊天时,可以将消息发送给一个用户,亦可以将消息发送给所有人。聊天的消息内容包括:用户名称、发送时间、发送正文、以及消息模式。断开连接的同时会关闭客户端,此时用户若希望聊天,需要再次登录服务器。1.4Socket通信机制Socket编程是建立在应用层TCP/IP协议之上的。目前最流行的是客户机/服务器模式,在面向连接的Client/Server模型中,Server端的socket总是等待一个Client端的请求。客户机/服务器模型的工作流程图如下图所示:服务器程序特点:①一般启动后就一直处于运行状态,以等待客户机进程的请求;②使用的端口往往是熟知端口,便于客户机进程连接请求;③一般拥有较多的系统资源,以便及时响应各个客户机进程的请求;④可以并行处理多个客户机进程的请求,但数目是有一定的限制;⑤在通信时一般处于被动的一方,不需要知道客户机的IP地址和端口信息。客户机程序的特点:①在需要服务器进程的服务时将向服务器进程请求服务,并建立通信连接,得到满足并完成处理后就终止通信连接;②使用向系统申请的临时端口与服务器进程进行通信,通信完成后将释放该端口;③拥有相对较少的系统资源;④在通信时属于主动的一方,需要事先知道服务器的IP地址和端口信息客户机与服务器模式又分为两大类:面向连接的交互(TCP)和面向无连接的交互(UDP),本程序是面向连接的交互,交互机制如下图:二:代码实现2.1服务器端主要代码负责监听客户端请求,并根据客户端命令执行不同操作的Listener类,Listener.csusingSystem;usingSystem.Collections.Generic;usingSystem.Linq;usingSystem.Text;usingSystem.Net.Sockets;usingSystem.Net;usingSystem.Threading;usingSystem.Collections.Specialized;usingSystem.Runtime.Serialization;usingSystem.IO;usingSystem.Runtime.Serialization.Formatters.Binary;namespaceTalkerServer{classListener{publicdelegatevoidShowMsg(ListenWindowlisWin,stringsvrInfo);//svrInfo要显示的服务器信息,lisWin显示的窗口对象privateListenWindowlisWin=null;//服务器监听窗口对象privateShowMsgsmsg=null;//消息显示委托对象privateintlistenPort=8888;//监听端口,默认8888privateconstintmaxPacket=64*1024;//缓冲区大小privateDictionarystring,SocketuserMap=newDictionarystring,Socket();//所有登陆服务器的用户mapprivateTcpListenertcpListener=null;//侦听器publicintListenPort{get{returnthis.listenPort;}set{this.listenPort=value;}}publicTcpListenerTcpListener{get{returnthis.tcpListener;}set{this.tcpListener=value;}}publicDictionarystring,SocketUserMap{get{returnthis.userMap;}set{this.userMap=value;}}publicvoidListen(ShowMsgsmsg,stringsvrInfo,ListenWindowlisWin){this.lisWin=lisWin;this.smsg=smsg;stringconnInfo=string.Empty;IPAddressipAddr=Dns.GetHostAddresses(Dns.GetHostName())[0];tcpListener=newTcpListener(ipAddr,listenPort);tcpListener.Start();connInfo+=服务器已经启动,正在监听客户端的连接……\r\n;smsg(lisWin,connInfo);while(true){byte[]packetBuff=newbyte[maxPacket];Socketclient=tcpListener.AcceptSocket();client.Receive(packetBuff);stringuserName=Encoding.Unicode.GetString(packetBuff).TrimEnd('\0');if(userMap.ContainsKey(userName)&&userMap.Count!=0){client.Send(Encoding.Unicode.GetBytes(0));//该用户存在}else{client.Send(Encoding.Unicode.GetBytes(1));//该用户不存在}userMap.Add(userName,client);//保存客户端到Map中stringsvrlog=string.Format([系统消息]新用户【{0}】在【{1}】已连接...当前在线人数:【{2}】\r\n\r\n,userName,DateTime.Now,userMap.Count);smsg(lisWin,svrlog);//利用委托更新服务器显示日志ThreadclientThread=newThread(newParameterizedThreadStart(ThreadFunc));//开启一个子线程执行程序clientThread.Start(userName);foreach(KeyValuePairstring,SocketuserinuserMap){stringuName=user.Keyasstring;SocketclientSkt=user.ValueasSocket;if(!uName.Equals(userName)){clientSkt.Send(Encoding.Unicode.GetBytes(svrlog));}}}}//序列化在线用户列表privatebyte[]SerializeOnlineUserList(Objectobj){StringCollectiononlineUserList=newStringCollection();foreach(objectoinuserMap.Keys){if(o!=obj)//序列化的在线列表中不包含自身登陆用户{onlineUserList.Add(oasstring);//转换语句}}IFormatte

1 / 16
下载文档,编辑使用

©2015-2020 m.777doc.com 三七文档.

备案号:鲁ICP备2024069028号-1 客服联系 QQ:2149211541

×
保存成功