计算机网络课程设计报告聊天程序.docx
《计算机网络课程设计报告聊天程序.docx》由会员分享,可在线阅读,更多相关《计算机网络课程设计报告聊天程序.docx(13页珍藏版)》请在冰豆网上搜索。
![计算机网络课程设计报告聊天程序.docx](https://file1.bdocx.com/fileroot1/2023-1/4/3621c343-7b54-478b-a664-db1768b03100/3621c343-7b54-478b-a664-db1768b031001.gif)
计算机网络课程设计报告聊天程序
计算机网络
课程设计报告
题目:
网络聊天程序的设计与实现
姓名:
申超明
学号:
0705010313
班级:
计算机3班
指导老师:
文宏
湖南科技大学计算机科学与工程学院
2010年9月
一:
实验名称
网络聊天程序的设计与实现
二:
实验目的
了解Socket通信的原理,并通过程序实现通信的过程。
三:
实验要求
熟悉Socket程序通信过程,熟悉在通信过程中流之间的转换。
程序中熟悉灵活运用线程执行相关操作。
四:
实验原理
Socket通信的原理还是比较简单的,它大致分为以下几个步骤。
服务器端的步骤如下:
建立服务器端的Socket,开始侦听整个网络中的连接请求。
当检测到来自客户端的连接请求时,向客户端发送收到连接请求的信息,并建立与客户端之间的连接。
当完成通信后,服务器关闭与客户端的Socket连接。
客户端的步骤如下:
建立客户端的Socket,确定要连接的服务器的主机名和端口。
发送连接请求到服务器,并等待服务器的回馈信息。
连接成功后,与服务器进行数据的交互。
数据处理完毕后,关闭自身的Socket连接。
五:
程序截图:
图1-服务器端启动服务器
图2-客户端连接数据库
图3-客户端发送消息
图4-服务器段接收客户端发送过来的消息
六:
程序代码:
Qserver.cs
usingSystem;
usingSystem.Collections.Generic;
usingSystem.ComponentModel;
usingSystem.Data;
usingSystem.Drawing;
usingSystem.Text;
usingSystem.Windows.Forms;
usingSystem.IO;
usingSystem.Net;
usingSystem.Net.Sockets;
usingSystem.Threading;
namespaceWindowsApplication2
{
publicpartialclassqserver:
Form
{
publicqserver()
{
InitializeComponent();
}
privatestringipv4;
privatevoidForm1_Load(objectsender,EventArgse)
{
IPAddress[]ip=Dns.GetHostAddresses(Dns.GetHostName());
ipv4=ip[0].ToString();
this.label4.Text=ipv4;
}
TcpListenertcpls;
Socketsk;
NetworkStreamns;
StreamReadersr;
StreamWritersw;
Threadtred;
privatevoidbutton1_Click(objectsender,EventArgse)
{
tcpls=newTcpListener(1235);
tcpls.Start();
MessageBox.Show("服务器已启动");
this.button1.Enabled=false;
sk=tcpls.AcceptSocket();
MessageBox.Show("客户端已连接");
ns=newNetworkStream(sk);
sr=newStreamReader(ns,Encoding.UTF8);
sw=newStreamWriter(ns,Encoding.UTF8);
}
stringsmessage="";
privatevoidbutton2_Click(objectsender,EventArgse)
{
this.textBox1.Focus();
tred=newThread(newThreadStart(this.acceptcm));
tred.Start();
this.textBox2.Focus();
}
privatevoidbutton3_Click(objectsender,EventArgse)
{
sendtoc();
this.textBox2.Focus();
}
privatevoidtextBox2_KeyPress(objectsender,KeyPressEventArgse)
{
if(e.KeyChar=='\r')
sendtoc();
}
privatevoidacceptcm()
{
lock(this)
{
try
{
if(sr.ReadLine()!
=null)
{
this.textBox1.Text+=sr.ReadLine();
}
else
return;
}
catch(System.Exceptionex)
{
}
finally
{
tred.Abort();
}
}
}
publicvoidsendtoc()
{
try
{
smessage="\r\n"+this.textBox3.Text+"("+DateTime.Now.ToLongTimeString()+")"+""+this.textBox2.Text;
this.textBox1.Text+=smessage;
this.textBox2.Clear();
sw.WriteLine(smessage);
sw.Flush();
}
catch
{
MessageBox.Show("服务器端错误");
}
}
privatevoidqserver_FormClosed(objectsender,FormClosedEventArgse)
{
if(tcpls!
=null)
tcpls.Stop();
//if(tred!
=null)
//tred.Abort();
Application.Exit();
}}}
客户端代码:
usingSystem;
usingSystem.Collections.Generic;
usingSystem.ComponentModel;
usingSystem.Data;
usingSystem.Drawing;
usingSystem.Text;
usingSystem.Windows.Forms;
usingSystem.IO;
usingSystem.Net;
usingSystem.Net.Sockets;
usingSystem.Threading;
namespaceClient
{
publicpartialclassqclient:
Form
{
publicqclient()
{
InitializeComponent();
}
TcpClienttcpct;
NetworkStreamns;
StreamReadersr;
StreamWritersw;
Threadtrdc;
///
///连接服务器操作,发送socket请求
///
///
///
privatevoidbutton1_Click(objectsender,EventArgse)
{
try
{
stringip=this.textBox4.Text+"."+this.textBox5.Text+"."+this.textBox6.Text+"."+this.textBox7.Text;
tcpct=newTcpClient(ip,1235);
ns=tcpct.GetStream();
sr=newStreamReader(ns);
sw=newStreamWriter(ns);
this.button1.Enabled=false;
}
catch
{
MessageBox.Show("请确认是否开启服务器...");
}
}
stringcmessage="";
///
///发送消息事件
///
///
///
privatevoidbutton2_Click(objectsender,EventArgse)
{
try
{
sendtos();
}
catch
{
//MessageBox.Show("出错啦!
"+"\r\n"+"1.你是否已经连接服务器?
"+"\r\n"+"2.等待服务器发回消息.");
}
finally
{
this.textBox2.Focus();
}
}
///
///发送函数
///
publicvoidsendtos()
{
if(this.textBox2.Text=="")//发送
{
MessageBox.Show("内容不能为空");
return;
}
else
{
cmessage="("+DateTime.Now.ToLongTimeString()+")"+"\r\n"+this.textBox3.Text+this.textBox2.Text;
this.textBox1.Text+=cmessage;
this.textBox2.Clear();
//savechathistrory();
sw.WriteLine(cmessage);
sw.Flush();
}
}
///
///接收函数
///
publicvoidacceptsm()
{
lock(this)
{
try//接收
{
this.textBox1.Text+=sr.ReadLine()+"\r\n";
//savechathistrory();
}
catch
{
//MessageBox.Show("出错啦!
"+"\r\n"+"1.你是否已经连接服务器?
"+"\r\n"+"2.没有服务器消息.");
}
finally
{
trdc.Abort();
}
}
}
///
///接收消息事件
///
///
///
privatevoidbutton3_Click(objectsender,EventArgse)
{
this.textBox1.Focus();
trdc=newThread(newThreadStart(acceptsm));
trdc.Start();
this.textBox2.Focus();
}
///
///保存历史记录,未做.
///
privatevoidsavechathistrory()
{
StreamWriterfsw=newStreamWriter(Application.UserAppDataPath+"chathistory.txt",false,Encoding.UTF8);
sw.WriteLine(this.textBox1.Text);
fsw.Flush();
fsw.Close();
}
///
///文件关闭之后,关闭客户端,关闭活动的线程
///
///
///
privatevoidqclient_FormClosed(objectsender,FormClosedEventArgse)
{
if(tcpct!
=null)
tcpct.Close();
Application.Exit();
}
///
///历史记录查看,未做。
///
///
///
privatevoidbutton4_Click(objectsender,EventArgse)
{
}
///
///按回车发送
///
///
///
privatevoidtextBox2_KeyPress(objectsender,KeyPressEventArgse)
{
if(e.KeyChar=='\r')
sendtos();
}
privatevoidqclient_Load(objectsender,EventArgse)
{
}
}
}、
七:
实验总结与心得
通过本次实验,我熟悉了Socket通信的基本原理。
更深一步熟悉程序中Socket通信过程中,流的传递。
同时也更深一步了解到线程在程序中的作用。