计算机网络原理课程设计.docx

上传人:b****8 文档编号:28783969 上传时间:2023-07-19 格式:DOCX 页数:15 大小:76.98KB
下载 相关 举报
计算机网络原理课程设计.docx_第1页
第1页 / 共15页
计算机网络原理课程设计.docx_第2页
第2页 / 共15页
计算机网络原理课程设计.docx_第3页
第3页 / 共15页
计算机网络原理课程设计.docx_第4页
第4页 / 共15页
计算机网络原理课程设计.docx_第5页
第5页 / 共15页
点击查看更多>>
下载资源
资源描述

计算机网络原理课程设计.docx

《计算机网络原理课程设计.docx》由会员分享,可在线阅读,更多相关《计算机网络原理课程设计.docx(15页珍藏版)》请在冰豆网上搜索。

计算机网络原理课程设计.docx

计算机网络原理课程设计

《网络原理课程设计》

-----网络聊天室的设计与实现

 

专业班级:

***********************

姓名:

***

学号:

************

 

一.设计目的

通过本实验,掌握网络协议数据包捕获和解析编程的技术/网络程序的设计方法

二.设计内容

网络聊天室的设计与实现

三.实验环境

在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#有了更好的学习。

由于水平有限,时间紧促,本系统的开发和系统的优化技术依然存在不少问题,与一些较为优秀的开发系统相比,该系统还需进一步简化,数据流程还需进一步明晰,特别是数据之间的关联程度还需进一步加强。

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 解决方案 > 学习计划

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1