I
简单QQ聊天系统
摘要
目前网络通讯是计算机用户进行交流最普遍的方式,各种各样基于网络的应
用也随之诞生,比如“腾讯QQ”——一款基于Internet的即时通信(IM)软件,
它使人们能随时在网上与其他用户交换消息,为网络用户提供一个即时交流聊天
的平台。本设计主要是仿照QQ聊天系统,实现两个用户进行即时交谈的功能,
为进一步开发即时通信技术应用奠定基础。
该程序设计采用了客户端/服务器模式,基于TCP面向连接的方式,实现用
户之间一对一的数据传输。用到的关键技术有套接字Socket、单线程技术等,
是在VisualC#2008语言下进行编程的。
本论文将介绍该聊天程序的相关功能、特点、设计思路及其使用方法,通过
相关的插图详细介绍整个程序的开发过程及其具体实现,并总结开发过程中的经
验等。
关键词即时通信、套接字Socket、单线程
III
目录
第1章绪论.....................................................................................................................................1
1.1引言...............................................................................................................................1
1.1.1编写目的...............................................................................................................1
1.1.2背景...................................................................................................................1
1.2课题意义.......................................................................................................................1
1.3研究现状.......................................................................................................................2
第2章系统分析概述.....................................................................................................................3
2.1可行性研究...................................................................................................................3
2.1.1技术可行性.......................................................................................................3
2.1.2经济可行性.......................................................................................................3
2.1.3操作可行性.......................................................................................................3
2.2系统分析.......................................................................................................................3
2.2.1功能要求...........................................................................................................3
2.2.2系统流程图.......................................................................................................3
第3章总体设计.............................................................................................................................5
3.1体系结构设计...............................................................................................................5
3.2功能简介.......................................................................................................................5
3.2.1服务器工作流程...............................................................................................5
3.2.2客户端工作流程...............................................................................................6
3.3系统特点.......................................................................................................................6
第4章详细设计.............................................................................................................................7
4.1系统的开发工具...........................................................................................................7
4.2服务器模块设计...........................................................................................................7
4.2.1服务器登录模块.....................................................................................................7
4.2.2服务器聊天模块.....................................................................................................9
聊天模块控件属性表.....................................................................................10
聊天模块代码.................................................................................................11
4.3客户端模块设计.........................................................................................................17
4.3.1客户端登录模块....................................................................................................17
4.3.2客户端聊天模块...................................................................................................19
结论............................................................................................................................................28
参考文献...................................................................................................................................29
1
第1章绪论
1.1引言
随着互联网应用越来越丰富,以快速、交互、简便为代表的即时通讯工具,
已经成为当前网络用户最喜爱的网络沟通工具。作为即时通讯工具最具增长潜力
之一的聊天软件,不仅在基础应用方面,还是产品扩展应用方面都将有质的飞跃,
极大程度上方便了处于在世界各地的友人之间的相互联系。特别是在近几年,即
时通讯工具已经成为一个集互动交流、休闲娱乐、信息管理为一体的多元化互联
网应用平台。总之,聊天软件的出现给人们彼此之间的沟通带来了无比的方便,
人们可以通过聊天软件建立深刻的友情,它必定会成为人们网络生活不可缺少的
一部分。
1.1.1编写目的
综合运用计算机网络应用编程中的TCP网络通信协议以及Socket套接字等
知识,以VisualC#作为开发平台,编写一个单线程聊天程序。本程序需要在一
台计算机上运行服务器端程序,然后就可以在同一网络的另外一台计算机上运行
客户端程序,登录到服务器上,从而实现服务器与用户之间的即时聊天、发送图
片等功能。
1.1.2背景
◆项目名称:简单的单线程QQ聊天系统
◆项目用户:***
◆开发者:***
1.2课题意义
一直以来,空间上的距离都是人们彼此相互交流的最大障碍。以前人们的信
息交流是通过电话、信件、电报等手段,由于功能的局限给收发双方带来了很多
不便。所以更加即时的直观的使人们能在网上识别在线用户并与他们实时交换消
息的即时通信技术应运而生,它是电子邮件发明以来迅速崛起的在线通讯方式,
为网络用户提供一个实时交流聊天的平台。而且即时通信和社会化网络、统一通
信、在线协同三大技术热点的关系将越来越密切,已经构成融合发展的趋势,因
2
此即时通信技术的应用将越来越广泛,越来越普遍。
1.3研究现状
即时消息系统[1](InstantMesnger,IM)是一种在后PC时代兴起的,以
Internet网络为基础的,允许交互双方即时地传送文字、语音、视频等信息,能
够跟踪网络用户在线状态的网络应用软件。即时消息系统产生有着深刻的社会原
因:人们都有渴望社交,获得社会尊重、实现自我的需求,这正是即时消息软件
风行的原动力,而物质文明的日益发达所带来副作用,又使得人们习惯与周围的
人保持距离,以致人们更愿意对陌生人敞开心扉,在网络中可以跨越年龄、身份、
行业、地域的限制,达到人与人、人与信息之间的零距离交流。从这点上讲,即
时消息系统的出现改变了人们的沟通方式和交友文化,大大拓展了个人生活交流
的空间。
国内最为流行的即时消息软件是OICQ(简称QQ)。它以良好的中文界
面和不断增强的功能形成了一定的QQ网络文化。该软件是由腾讯公司于1999
年2月自主开发的基于Internet的即时消息系统。腾讯QQ目前已成为中国最
主要的即时消息服务网络软件。作为一种即时消息工具,QQ支持显示好友在线、
即时传送文字、语音和文件等功能。QQ还与无线寻呼、GSM短信息、IP电
话网互联,为用户提供互联网短信及信息增值服务。腾讯QQ开发和拓展统一、
高速、丰富的互联网应用平台、在线广告业务、移动通信业务、ISP及IP电话合
作业务、企业商用即时消息服务、在线客户支持及在线呼叫业务。
3
第2章系统分析概述
2.1可行性研究
2.1.1技术可行性
随着互联网应用越来越丰富,以快速、交互、简便为代表的即时通讯工具,
已经成为当前网络用户最喜爱的网络沟通工具。本系统是一个使用套接字
Socket编程,采用其中的TCP面向连接方式的简单的聊天工具,具有很强的实
用价值。
2.1.2经济可行性
开发本系统能够使人们之间的交流带来极大的方便,而且所用的人力、物力、
技术、资金等的花费不大,所以今后获得的经济效益一定会大于开发成本。
2.1.3操作可行性
本开发系统操作步骤简单,运行时只要在登录时输入服务器信息以及自己的
昵称就可以进入聊天程序,然后就可以与服务器进行信息交流。
2.2系统分析
2.2.1功能要求
ⅰ.客户端登录时输入的服务器信息必须与服务端一致。
ⅱ.用户与服务器之间的信息发送,是本程序需要实现的最基本的功能。
ⅲ.在C/S模式中,服务器和客户端是相互依赖的。服务器启动以后,客户端才
能连接上服务器,如果服务器没有启动,那么用户和服务器不能连接而且客
户端或服务器任意一方断开连接,对方都会能接收到通知消息。
2.2.2系统流程图
4
登录服务器
启动监听器
等待
接受客户端连接
读取客户端数据
向客户端写数据
断开连接
登录客户端
准备Socket
连接服务器
向服务器写数据
读取服务器数据
断开连接
返回返回
5
第3章总体设计
3.1体系结构设计
通常的通信工具,都采用客户机/服务器(C/S)体系结构,C/S结构是这样的
一种结构:它包括一个客户机(或前端),一个服务器(或称后端),客户机的作用是访
问和处理远程服务器上的数据,服务器的作用是接收和处理客户机的数据请求。
另外它的服务器端还可以将信息集中起来,任何客户机都可以通过访问服务器而
获得所需的信息。Client/Server模型最终可归结为一种“请求/应答”关系。一个
请求总是首先被客户发出,然后服务器总是被动地接收请求,返回客户需要的结
果。在客户发出一个请求之前,服务进程一直处于休眠状态。一个客户提出请求
后,服务进程被“唤醒”并且为客户提供服务,对客户的请求做出所需要的应答。
如下图所示:
在服务器启动以后,等待客户端的连接,当有客户连接上来以后,服务器监
听到客户端的端口号,然后客户端显示连接成功到服务器,以告知服务器自己在
线,然后服务器和客户端就可以进行信息交流。如果服务器不在线,则客户端会
提示用户退出。
3.2功能简介
本聊天程序提供了服务器与客户端的一对一连接,客户端必须在服务器启动
以后才能连接成功。用户登录以后聊天室的客户端会显示用户的登录昵称和在线
时间,还可以与服务器进行即时聊天、发送图片等。
3.2.1服务器工作流程
⑴.服务器输入IP地址和端口号,点击“登录”按钮,服务器登录聊天室。
⑵.点击控制台的“启动”按钮,服务器开始侦听,等待客户端连接。
⑶.如果有用户连接上来,服务器可以与用户进行信息传输、发送图片等。
客户端服务器
6
⑷.点击“断开”按钮,服务器将停止端口侦听,并通知用户。
⑸.点击“退出”按钮,服务器将退出聊天程序。
3.2.2客户端工作流程
⑴.用户输入服务器的IP地址和端口号以及自己的昵称后,点击“登录”按
钮,用户将登录聊天室。
⑵.点击控制台的“连接”按钮,如果连接成功,用户将通过刚刚输入的昵称
连接上服务器,并通知服务器连接成功。
⑶.连接成功后,用户可以与服务器进行信息传输、发送图片等。
⑷.当用户点击“断开”按钮,客户端将断开与服务器的连接,并通知服务器
断开连接。
⑸.用户点击“退出”按钮时,将退出聊天程序。
3.3系统特点
界面设计美观友好。
规范、完整的基础信息设置。
能够即时进行通信聊天。
系统运行稳定、安全可靠。
7
第4章详细设计
4.1系统的开发工具
4.1.1开发环境--MicrosoftVisualStudio2008
VisualStudio是微软公司出品的一款大型应用软件,是一套完整的开发工
具集,它主要用于生成应用程序、XMLWebServices、桌面应用程
序和移动应用程序。
4.1.2C#程序语言
C#(CSharp)是微软(Microsoft)为Framework量身订做的程序语言,C
#拥有C/C++的强大功能以及VisualBasic简易使用的特性,是第一个组件导向
(Component-oriented)的程序语言,和C++与Java一样亦为对象导向
(object-oriented)程序语言。
4.2服务器模块设计
4.2.1服务器登录模块
登录模块界面
服务器进入登录界面(如图4-2-1)后,设置IP地址和端口号,点击“登录”
按钮,系统将验证输入的服务器信息是否合法,如果服务器信息合法则跳转到聊
天室,否则将弹出错误提示窗口(如图4-2-2)。如果未设置服务器信息,则弹出
信息提示窗口(如图4-2-3);点击“重置”按钮,服务器信息将被清空。
8
图4-2-1服务器登录界面
图4-2-2错误提示窗口
图4-2-3信息提示窗口
登录模块控件属性表
控件属性值控件成员变量
TextBoxtxtIP
TextBoxtxtPort
Button
登录
btnLog
Button
重置
btnRent
登录模块代码
//登录聊天室
privatevoidbtnLog_Click(objectnder,EventArg)
{
if(==""||=="")
{
("请输入IP地址或端口号!","提示信息",
,g,
1);
return;
}
9
el
{
try
{
IPAddressipadd=();
intport=32();
e=true;
e=fal;
d=fal;
="服务器"+ng()+""
+ng();
Text("System:服务器已进入聊天室!
<-"+TimeString()+"->.....rn");
stringSerIp=ng();
stringSerPort=ng();
="IP地址:"+""+SerIp+"";
="端口号:"+""+SerPort;
}
catch(Exception)
{
("您输入的IP地址或端口号不正确,n请重新
输入!","错误",,);
}
}
}
//重置服务器信息
privatevoidbtnRent_Click_1(objectnder,EventArg)
{
();
();
}
4.2.2服务器聊天模块
聊天模块界面
服务器进入聊天室后,状态栏显示服务器登录时输入的IP地址和端口号。
点击“启动”按钮,服务器开始监听,如果有用户连接上来,服务器可以与用户
进行聊天(如图4-2-4)。
另外聊天室的工具栏还有一些辅助按钮,点击“背景颜色”按钮,设置聊天
记录的背景颜色(如图4-2-5);点击“隐藏窗口”按钮,隐藏聊天程序;点击“帮
助”按钮,弹出帮助对话框(如图4-2-6)。
10
图4-2-4服务器聊天界面
图4-2-5设置背景颜色
图4-2-7帮助对话框
聊天模块控件属性表
控件属性值控件成员变量
Button
启动(&L)
btn_start
Button
断开(&S)
btn_stop
Button
退出(&E)
btn_Exit
Button
背景颜色(&C)
btnColo
Button
隐藏窗口(&Y)
btnYing
11
Button
帮助(&H)
btnHelped
Button
关于(&A)
btnAbout
Button
发送图片
btnImgFile
Button
清屏
btnClear
Button
发送
btn_nd
Button
取消
btnRest
RichTextBoxrichTextBox1
RichTextBoxtxt1_ndinfo
Label
IP地址:
labip
Label
端口号:
labport
聊天模块代码
publicpartialclassChatServer:Form
{
privateOpenFileDialogopenfiledialog=newOpenFileDialog();
privateSaveFileDialogsavefiledialog=newSaveFileDialog();
privatebyte[]img;//传输图片用字节数组
privateintimgflag=0;
privateFileStreamfstream;
publicdelegatevoidUpdateRichTextBox(stringmsg);//异步委托
代理
publicdelegatevoidUpdateImg(Streams);
privateSocketsocket;//服务器端套接字
privateSocketclientSocket;//客户端连接套接字
privateThreadthread;
//启动服务器,开始监听
privatevoidbtn_start_Click(objectnder,EventArg)
{
try
{
IPAddressip=();
IPEndPointrver=newIPEndPoint(ip,
());
//创建服务器套接字
socket=newSocket(etwork,
,);
(rver);//绑定端口号
(10);
12
thread=newThread(newThreadStart(AcceptMessage));
();//开始监听
="服务器Taking....";
();
Text("System:服务器已启动!<-"+
TimeString()+"->.....rn");
d=true;
btn_d=fal;
btn_d=true;
}
catch(Exceptionex)
{
("服务器:"+e);
_d=true;
}
}
//接收客户端信息
publicvoidAcceptMessage()//异步接收信息后台线程方法
{
Socket=();
();
Text("System:服务器连接成功!<-"+
TimeString()+"->.....rn");
while(true)
{
try
{
if(Socket==null||
ted==fal)
break;
NetworkStreamnetStream=new
NetworkStream(Socket);//通过
clientSocket对象获取NetworkStream对象
//得到一条消息的长度
byte[]dataSize=newbyte[4];
(dataSize,0,4);
intsize=32(dataSize,0);
//循环接收直到一条完整的消息全部读入到字节数组中
byte[]message=newbyte[size];
intdataleft=size;
intstart=0;
if(size>0)
{
while(dataleft>0)
13
{
intrecv=(message,start,
dataleft);
start+=recv;
dataleft-=recv;
}
if(message[0]==101)//101代表传输图片
{
MemoryStreamms=newMemoryStream(message,
1,-1);
nvoke(new
UpdateImg(ViewImg),newobject[]{ms});
}
el//默认进行普通传输
{
stringMsg=
ing
(message,1,-1);
nvoke(new
UpdateRichTextBox(UpdateMessage),new
object[]{Msg});
}
}
(100);
}
catch(Exception)
{
("服务器:"+e);
}
}
}
//点击“发送”按钮
privatevoidbtn_nd_Click(objectnder,EventArg)
{
if(txt1_=="")
{
("请先输入内容!");
txt1_();
txt1_();
return;
}
if(imgflag==1)
{
//发送图片时
14
byte[]imgSize=newbyte[4];
//将32位整数值转换为字节数组
imgSize=es(+1);//
其中加1是因为后面了一个101做分隔符
try
{
NetworkStreamnetStream=new
NetworkStream(clientSocket);
(imgSize,0,4);
yte(101);//分隔符
(img,0,);
();
ionColor=lue;
Text("服务器<-"+
TimeString()+"->:rn");
ionStart=
;
aObject(ream(fstream));
();
ionColor=lue;
Text("n");
();
();//此流必须在这里才可以消除
txt1_();
ionStart=
;
();
1_="";
1_();
imgflag=0;//复原
return;//不执行后面的传输文本信息
}
catch(ionex)
{
("服务器:"+e);
}
}
//发送文本信息时
ionColor=lue;
stringstr="服务器<-"+TimeString()+"->:
rn"+txt1_;
inti=;
if(i==0)
{
15
return;
}
el
{
//因为str为Unicode编码,每个字符占2个字节,所以实际字节数
应为字符个数*2
i*=2;
}
byte[]dataSize=newbyte[4];
//将32位整数值转换为字节数组
dataSize=es(i+1);//其中加1是因为
后面写了一个1做分隔符
byte[]ndbytes=es(str);
try
{
NetworkStreamnetStream=newNetworkStream(clientSocket);
(dataSize,0,4);
yte(1);//分隔符
(ndbytes,0,);
();
ionColor=lue;
Text(str+"n");
ionStart=
;
();
1_="";
1_();
}
catch(ionex)
{
("服务器:"+e);
}
}
//断开连接
privatevoidbtn_stop_Click(objectnder,EventArg)
{
();
();
(10);
_d=true;
btn_d=fal;
d=fal;
="服务器"+ng()+""+
ng();
16
Text("System:服务器断开连接!<-"+
TimeString()+"->.....rn");
}
//接收文本
privatevoidUpdateMessage(stringstrmsg)//将异步接收到的信息显
示在富文本框里
{
ionColor=oral;
Text(strmsg+"n");
ionStart=
;
();
1_();
}
//接收图片信息
privatevoidViewImg(Streams)//将异步接收到的信息显示在富文本框
里
{
ionStart=;
ionColor=oral;
Text("服务器接收图片<-"+
TimeString()+"->:rn");
aObject(ream(s));//利用剪切板
();
ionColor=oral;
Text("n");
ionStart=;
();
txt1_();
}
//上传图片文件中的图片
privatevoidbtnImgFile_Click(objectnder,EventArg)
{
="所有文件(*.*)|*.*|位图文
(*.bmp)|*.bmp|文件(*.jpg)|*.jpg|文件(*.gif)|*.gif";
if(alog()==)
{
Stringstrpath=me;
fstream=newFileStream(strpath,);
BinaryReaderbreader=newBinaryReader(fstream);
img=tes((int));
aObject(ream(fstream));
txt1_();
imgflag=1;
17
}
}
//退出聊天室
privatevoidbtn_Exit_Click(objectnder,EventArg)
{
if(btn_d!=true)
{
();
();
}
el
{
("请先断开连接!");
return;
}
}
//取消发送
privatevoidbtnRest_Click(objectnder,EventArg)
{
txt1_();
}
//清屏
privatevoidbtnClear_Click(objectnder,EventArg)
{
();
}
}
4.3客户端模块设计
4.3.1客户端登录模块
登录模块界面
客户端进入登录界面(如图4-3-1)后,输入服务器IP地址和端口号以及自
己的昵称,点击“登录”按钮,系统将验证输入的服务器信息是否合法,如果合
法则跳转到聊天室,否则弹出错误对话框(如图4-3-2)。如果未输入服务器信息
则弹出提示提示(如图4-3-3).;如果未输入昵称则弹出提示信息提示(如图
4-3-4);点击“重置”按钮,服务器信息和昵称则被清空。
18
图4-3-1服务器登录界面
图4-3-2提示服务器信息不合法
图4-3-3提示输入服务器信息
图4-3-4提示输入昵称
登录模块控件属性表
控件属性值控件成员变量
TextBoxtxt_IP
TextBoxtxt_Port
TextBoxtxtName
Button
登录
btnLog
Button
重置
btnRent
客户端登录模块代码
//登录聊天室
privatevoidbtnLog_Click(objectnder,EventArg)
{
if(txt_==""||txt_=="")
{
("服务器信息不能为空!","提示信息",
,g,
1);
return;
19
}
if(=="")
{
("请输入您的呢称!","提示信息",
,g,
1);
return;
}
el
{
try
{
IPAddressipadd=(_);
intport=32(_);
urName=ng();
e=fal;
e=true;
d=fal;
=""+urName+""+
ng()+""+ng();
Text("System:"+urName+"已进
入聊天室!<-"+TimeString()+"->.....rn");
stringSerIp=txt_ng();
stringSerPort=txt_ng();
="IP地址:"+""+SerIp+"";
="端口号:"+""+SerPort;
}
catch(Exception)
{
("您输入的服务器信息不合法,n请重新输
入!","错误",,);
}
}
}
//重置服务器信息和昵称
privatevoidbtnRent_Click(objectnder,EventArg)
{
txt_();
txt_();
();
}
4.3.2客户端聊天模块
聊天模块界面
20
用户进入聊天室后,状态栏显示服务器信息和昵称。点击“连接”按钮,如
果服务器已启动,用户连接上聊天室并与服务器进行聊天(如图4-3-5)。
另外聊天室的工具栏还有一些辅助按钮,点击“背景颜色”按钮,设置聊天
记录的背景颜色(如图4-3-6);点击“隐藏窗口”按钮,隐藏聊天程序;点击“帮
助”按钮,弹出帮助对话框(如图4-3-7)。
图4-3-5客户端聊天界面
图4-3-6设置背景颜色
图4-3-8帮助对话框
聊天模块控件属性表
21
控件属性值控件成员变量
Button
连接(&L)
btn_req
Button
断开(&S)
btn_clo
Button
退出(&E)
btn_Exit
Button
背景颜色(&C)
btnColo
Button
隐藏窗口(&Y)
btnYing
Button
帮助(&H)
btnHelped
Button
关于(&A)
btnAbout
Button
发送图片
btnImgFile
Button
清屏
btnClear
Button
发送
btn_nd
Button
取消
btnRest
RichTextBoxrichTextBox1
RichTextBoxtxt2_nd
Label
IP地址:
lbSerIp
Label
端口号:
lbSerPort
聊天室模块代码
publicpartialclassChatClient:Form
{
privateOpenFileDialogopenfiledialog=newOpenFileDialog();
privateSaveFileDialogsavefiledialog=newSaveFileDialog();
privatebyte[]img;//保存传图片时的字节数组
privateintimgflag=0;
privateFileStreamfstream;
publicdelegatevoidUpdateMessage(stringmsg);
publicdelegatevoidUpdateImg(Streams);
privateSocketsocket;
privateThreadthread;
publicstringurName;
//与服务器连接
privatevoidbtn_req_Click(objectnder,EventArg)
{
try
{
IPAddressip=(_);
22
IPEndPointrver=newIPEndPoint(ip,
(_));
//创建客户端套接字
socket=newSocket(etwork,
,);
t(rver);//连接
thread=newThread(newThreadStart(AcceptMessage));
();
=""+urName+"Taking....";
();
Text("System:"+urName+"连
接到服务器!<-"+TimeString()+"->.....rn");
btn_d=fal;
btn_d=true;
d=true;
}
catch
{
();
Text("System:"+urName+"未
连接上服务器!<-"+TimeString()+"->.....rn");
return;
}
}
//接收后台接收消息
publicvoidAcceptMessage()//异步接收信息后台线程方法
{
while(true)
{
try
{
if(==null||ted
==fal)
{
();
Text("System:"+urName
+"未连接上服务器!<-"+TimeString()+
"->.....rn");
break;
}
NetworkStreamnetStream=new
NetworkStream();//必须放在if后,可能没实例化
//得到一条消息的长度
byte[]dataSize=newbyte[4];//前4字节代表后面
23
字节总数,发送时已经处理过了
(dataSize,0,4);
intsize=32(dataSize,
0);
//循环接收直到一条完整的消息全部读入到字节数组
中
byte[]message=newbyte[size];
intdataleft=size;
intstart=0;
while(dataleft>0)
{
intrecv=(message,start,
dataleft);
start+=recv;
dataleft-=recv;
}
if(message[0]==101)//101代表传输图片
{
MemoryStreamms=newMemoryStream(message,1,
-1);
nvoke(new
UpdateImg(ViewImg),newobject[]{ms});
}
el//默认进行普通传输
{
stringMsg=
ing(message,1,-1);
nvoke(new
UpdateMessage(ViewMessage),newobject[]{Msg});
}
(100);
}
catch(Exceptionex)
{
(urName+":"+e);
}
}
}
//传输文件
privatevoidViewMessage(stringmsg)
{
ionColor=lue;
Text(msg+"n");
ionStart=;//
24
定位到最后,保持最新消息可见
();
txt2_();
}
//接收图片信息
privatevoidViewImg(Streams)
{
ionStart=;
ionColor=lue;
Text(urName+"接收图片<-"+
TimeString()+"->:rn");
aObject(ream(s));//利用剪切板
();
ionColor=lue;
Text("n");
ionStart=;
();
txt2_();
}
//点击发送按钮
privatevoidbtn_nd_Click(objectnder,EventArg)
{
if(txt2_=="")
{
("请先输入内容!");
txt2_();
txt2_();
return;
}
if(imgflag==1)//imgflag的值在方法btnImgFile_Click中可能
改变
{//当传输图片时
byte[]imgSize=newbyte[4];
//将32位整数值转换为字节数组
imgSize=es(+
1);//后面一个标识数:101
try
{
NetworkStreamnetStream=new
NetworkStream();
(imgSize,0,4);
yte(101);//标识数
(img,0,);
();
25
ionColor=
oral;
Text(urName+"<-"+
TimeString()+"->:rn");
ionStart=
;
aObject(ream(fstream));
();
ionColor=oral;
Text("n");
();
();//此流必须在这里才可以消除
txt2_();
ionStart=
;
();
2_="";
2_();
imgflag=0;//复原
return;//不执行后面的传输文本信息
}
catch(ionex)
{
("服务器:"+e);
}
}
//发送文本信息时
ionColor=oral;
stringstr=urName+"<-"+
TimeString()+"->:rn"+txt2_;
inti=;
if(i==0)
{
return;
}
el
{
//因为str为Unicode编码,每个字符占2个字节,所以实际字
节数应为字符个数*2
i*=2;
}
byte[]dataSize=newbyte[4];
//将32位整数值转换为字节数组
26
dataSize=es(i+1);//后面一个
标识数:1
byte[]ndbytes=
es(str);
try
{
NetworkStreamnetStream=new
NetworkStream();
(dataSize,0,4);
yte(1);//标识数
(ndbytes,0,);
();
ionColor=oral;
Text(str+"n");
ionStart=
;
();
2_="";
txt2_();
}
catch(ionex)
{
(urName+":"+e);
}
}
//发送图片按钮
privatevoidbtnImgFile_Click(objectnder,EventArg)
{
="所有文件(*.*)|*.*|位图文件
(*.bmp)|*.bmp|文件(*.jpg)|*.jpg|文件(*.gif)|*.gif";
if(alog()==)
{
Stringstrpath=me;
fstream=newFileStream(strpath,);//此
行和下一行是关键,得到文件字节数组
BinaryReaderbreader=newBinaryReader(fstream);
img=tes((int));//得到文
件数组
aObject(ream(fstream));
txt2_();
imgflag=1;
}
}
27
//断开和服务器端连接
privatevoidbtn_clo_Click(objectnder,EventArg)
{
();
();
(10);
_d=true;
btn_d=fal;
d=fal;
=""+urName+""+ng()
+""+ng();
Text("System:"+urName+"断
开与服务器的连接!<-"+TimeString()+"->.....
rn");
}
//退出聊天室
privatevoidbtn_Exit_Click(objectnder,EventArg)
{
if(btn_d!=true)
{
();
();
}
el
{
("请先断开连接!");
return;
}
}
//取消发送
privatevoidbtnRest_Click(objectnder,EventArg)
{
txt2_();
}
//清屏
privatevoidbtnClear_Click(objectnder,EventArg)
{
();
}
}
28
结论
经过了两个多月的学习和工作,我终于完成了这篇毕业设计说明书。从开始
接到论文题目到系统的实现,再到论文文章的完成,每走一步对我来说都是新的
尝试与挑战,这也是我在大学期间独立完成的最大的项目。在这段时间里,我学
到了很多知识也有很多感受,从C#、网络编程等相关技术懵懂的状态,我开始
了独立的学习和试验,查看相关的资料和书籍,让自己头脑中模糊的概念逐渐清
晰,使自己非常稚嫩作品一步步完善起来,每一次改进都是我学习的收获,每一
次试验的成功都会让我兴奋好一段时间。
当然我也发现论文当中还有很多不足之处,虽然很多问题我都通过查阅资
料和询问老师、同学得到了解决,但这确实是知识的匮乏。所以,我觉得在今后
的学习生涯中,一定要注重理论知识的学习和实践能力的锻炼。虽说现在我们的
C#课程结束了,但我觉得有必要去回顾,说不定今天的某天我们还是会用到。
同时,通过这次设计,我还发现了一点,理论还是要和实践相结合。自己知道的
和能做的结合起来这才是最大的成果,我今后一定要向着这个方向努力,力争做
到最好。
这次做论文的经历也会使我终身受益,我感受到做论文是要真真正正用心去
做的一件事情,是真正的自己学习的过程和研究的过程,没有学习就不可能有研
究的能力,没有自己的研究,就不会有所突破,那也就不叫论文了。希望这次的
经历能让我在以后学习中激励我继续进步。
29
参考文献
1《C#网络应用高级编辑》马骏郑逢斌沈夏烱编著
2《VisualC#网络编程案例解析》杨富国主编
3《基础与案例开发详解》清华大学出版社
4《软件工程》高树芳米詠主编
本文发布于:2023-01-01 13:13:04,感谢您对本站的认可!
本文链接:http://www.wtabcd.cn/fanwen/fan/90/72183.html
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系,我们将在24小时内删除。
留言与评论(共有 0 条评论) |