计算机网络原理课程设计.docx
《计算机网络原理课程设计.docx》由会员分享,可在线阅读,更多相关《计算机网络原理课程设计.docx(15页珍藏版)》请在冰豆网上搜索。
计算机网络原理课程设计
《网络原理课程设计》
-----网络聊天室的设计与实现
专业班级:
***********************
姓名:
***
学号:
************
一.设计目的
通过本实验,掌握网络协议数据包捕获和解析编程的技术/网络程序的设计方法
二.设计内容
网络聊天室的设计与实现
三.实验环境
在Microsoftvisualstudio2005基于c#技术的开发。
四.设计思想
C#是一种面向对象的程序设计语言,它的基本语法与C/C++相同,其将软件开发中的逻辑分成5大部分:
商业外观层(BusinessFacade),商业规则层(BusinessRules),数据访问层(DataAccess),Model层等。
这种逻辑上的划分使得软件的开发更加方便,并使语句和数据库的访问分开,而由商业规则层单独提出规则,便于软件的扩展和维护。
TCP/IP协议实际上就是在物理网上的一组完整的网络协议。
其中TCP是提供传输层服务,而IP则是提供网络层服务。
TCP/IP主要包括以下协议:
IP:
网间协议(InternetProtocol)负责主机间数据的路由和网络上数据的存储。
同时为ICMP,TCP,UDP提供分组发送服务。
用户进程通常不需要涉及这一层。
ICMP:
网间报文控制协议(InternetControlMessageProtocol)此协议处理网关和主机的差错和传送控制。
TCP:
传输控制协议(TransmissionControlProtocol)这是一种提供给用户进程的可靠的全双工字节流面向连接的协议。
它要为用户进程提供虚电路服务,并为数据可靠传输建立检查。
TCP/IP协议的核心部分是传输层协议(TCP、UDP),网络层协议(IP)和物
基于以上思想完成此次课程设计网络---网络聊天室的设计与实现
五.实现流程
1.设计服务器端
连接用户模块设计:
通过GetIp()函数获得客户端IP,然后开放一个端口,绑定并监听端口。
接受来自客户端的连接,并向客户端发送欢迎信息。
与客户端建立连接。
2.设计客户端
客户端计算机获取本机开放的socket端口23,再发送目标主机的IP,通过connection()函数与服务端建立连接,如果connection()作用结果出现错误的socket,则连接失败,否则通过recv()函数接收服务器发送的字符串,即为服务器发送的欢迎信息。
六.源代码
usingSystem;
usingSystem.Collections.Generic;
usingSystem.ComponentModel;
usingSystem.Data;
usingSystem.Drawing;
usingSystem.Linq;
usingSystem.Text;
usingSystem.Windows.Forms;
usingSystem.Net;
usingSystem.Net.Sockets;
usingSystem.Threading;
namespaceChatApp
{
publicpartialclassForm1:
Form
{
publicForm1()
{
InitializeComponent();
skinEngine1.SkinFile="MSN.ssk";
skinEngine1.Active=true;
}
//全局变量
privateSocketmySocket;//通信套接字
privateSocketmyReadSocket;//读取或地送消息的套接字
privateThreadmyThread;//异步启动的线程
privateThreadmyReadThread;//读信息的线程
privateIPAddressmyIP;//IP地址
privateintmyPort;//端口号
//
Listclient_S=newList{};
//
//服务端
#region服务器
publicvoidServer()
{
try
{
myIP=IPAddress.Parse(txtIP.Text.Trim());//获得IP地址
myPort=Convert.ToInt16(txtPort.Text.Trim());//端口号
IPEndPointmyServer=newIPEndPoint(myIP,myPort);
mySocket=newSocket(AddressFamily.InterNetwork,SocketType.Stream,ProtocolType.Tcp);
mySocket.Bind(myServer);
mySocket.Listen(50);
lbServer.Text="监听中...";
myThread=newThread(newThreadStart(Listen));
myThread.Start();
}
catch(Exceptionw)
{
MessageBox.Show(w.Message);
rbtnServer.Checked=false;
}
}
privatevoidListen()
{
while(true)
{
try
{
myReadSocket=mySocket.Accept();
client_S.Add(myReadSocket);
if(myReadSocket.Connected)
{
lbServer.Text="连接状态...";
myReadThread=newThread(newThreadStart(Read));
myReadThread.Start();
}
}
catch(SocketExceptionse)
{
MessageBox.Show(se.Message);
}
}
}
///
///当是服务器时读取消息的方法
///
privatevoidRead()
{
while(true)
{
try
{
byte[]readtxt=newbyte[64];
myReadSocket.Receive(readtxt,readtxt.Length,0);
//转发
for(inti=0;i{
try
{
client_S[i].Send(readtxt);
}
catch(SocketException)
{
client_S.Remove(client_S[i]);
}
}
stringmsg=System.Text.Encoding.BigEndianUnicode.GetString(readtxt);
this.rtbContent.AppendText(msg.Trim());;
}
catch(Exceptionee)
{
MessageBox.Show(ee.Message);
}
}
}
#endregion
privatevoidrbtnServer_CheckedChanged(objectsender,EventArgse)
{
//开启服务
if(rbtnServer.Checked)
{
init();
Server();
}
}
privatevoidtxtMessage_KeyDown(objectsender,KeyEventArgse)
{
//按Enter发送
if(Keys.Enter==(Keys)e.KeyCode)
{
this.SendMessage();
}
}
privatevoidtxtMessage_KeyUp(objectsender,KeyEventArgse)
{
if(Keys.Enter==(Keys)e.KeyCode)
{
txtMessage.Text="";
}
}
#region客户端
publicvoidClient()
{
try
{
myIP=IPAddress.Parse(txtIP.Text.Trim());//获得IP地址
myPort=Convert.ToInt16(txtPort.Text.Trim());//端口号
IPEndPointdesServer=newIPEndPoint(myIP,myPort);
mySocket=newSocket(AddressFamily.InterNetwork,SocketType.Stream,ProtocolType.Tcp);
mySocket.Connect(desServer);
try
{
lbClient.Text="连接成功...";
myReadThread=newThread(newThreadStart(ReadFromServer));
myReadThread.Start();
}
catch(Exceptionee)
{
lbClient.Text="连接失败..";
MessageBox.Show(ee.Message);
}
}
catch(Exceptionw)
{
MessageBox.Show(w.Message);
rbtnClient.Checked=false;
}
}
///
///读取服务器消息
///
privatevoidReadFromServer()
{
while(true)
{
byte[]by=newbyte[64];
mySocket.Receive(by);
stringtext=System.Text.Encoding.BigEndianUnicode.GetString(by).Trim();
rtbContent.AppendText(text);
}
}
#endregion
privatevoidrbtnClient_CheckedChanged(objectsender,EventArgse)
{
if(rbtnClient.Checked)
{
init();
Client();
}
}
///
///当从服务器切换到客户机时需要从新初始化对像实例
///调用的方法
///
privatevoidinit()
{
if(myThread!
=null)
{
myThread.Abort();
}
if(myReadThread!
=null)
{
myReadThread.Abort();
}
lbClient.Text="------";
lbServer.Text="------";
if(mySocket!
=null)
{
mySocket.Close();
mySocket.Dispose();
}
if(myReadSocket!
=null)
{
myReadSocket.Close();
myReadSocket.Dispose();
}
}
///
///自定义发送消息方法
///
privatevoidSendMessage()
{
if(txtMessage.Text.Length>0)
{
if(rbtnServer.Checked)
{
stringmessage=txtMessage.Text;
message="【"+DateTime.Now.ToString()+"】"+Dns.GetHostName().ToString()+":
\n"+message+"\n";
byte[]b=System.Text.Encoding.BigEndianUnicode.GetBytes(message);
//myReadSocket.Send(b);
for(inti=0;i{
try
{
client_S[i].Send(b);
}
catch(SocketException)
{
client_S.Remove(client_S[i]);
}
}
rtbContent.AppendText(message);
txtMessage.Clear();
}
if(rbtnClient.Checked)
{
stringmessage=txtMessage.Text;
message="【"+DateTime.Now.ToString()+"】"+Dns.GetHostName().ToString()+":
\n"+message+"\n";
byte[]b=System.Text.Encoding.BigEndianUnicode.GetBytes(message);
mySocket.Send(b);
//rtbContent.AppendText(message);
txtMessage.Clear();
}
}
else
{
MessageBox.Show("发送消息不能为空!
","-_-",MessageBoxButtons.OK,MessageBoxIcon.Exclamation);
txtMessage.Clear();
}
}
privatevoidbtnSend_Click(objectsender,EventArgse)
{//点击了发送的按钮
this.SendMessage();
}
privatevoidrtbContent_TextChanged(objectsender,EventArgse)
{//自动显示最后一条数据
this.rtbContent.ScrollToCaret();
}
privatevoidForm1_FormClosed(objectsender,FormClosedEventArgse)
{
if(mySocket!
=null)
{
mySocket.Close();
mySocket.Dispose();
}
if(myReadSocket!
=null)
{
mySocket.Close();
mySocket.Dispose();
}
}
}
}
七.实验结果
1.先指定服务端的IP及其端口
2.指定客户端的IP及端口
3客户端向服务端发送消息并且客户端回应
八.心得体会
通过本次课题设计,无论从专业理论知识还是动手实践经验我都得到了很多锻炼,并具有较大的提高。
在动手作课程设计之前,总觉得不会太难做到,可是真正动手做的时候才发现实际上我们还存在很多的不足之处。
可以在做设计的同时,我们也在不断的学习和提高。
切实的锻炼了动手动脑的能力。
在实际开发中,熟悉了许多开发工具的使用,对Microsoftvisualstudio2005的开发环境有了更深刻的认识,对TCP/IP也有了更加深入的了解,在这个过程中对使用得开发语言C#有了更好的学习。
由于水平有限,时间紧促,本系统的开发和系统的优化技术依然存在不少问题,与一些较为优秀的开发系统相比,该系统还需进一步简化,数据流程还需进一步明晰,特别是数据之间的关联程度还需进一步加强。