当前位置:文档之家› 网络协议分析实验7

网络协议分析实验7

int receiveLength;
while(isExit==false)
{try{
receiveLength = client.Receive(result); //开始接收信息recieveMessage=Encoding.UTF8.GetString(result,0,receiveLength);







1.服务端代码设计
(1)服务器监听客户端代码:
private void button1_Click(object sender, EventArgs e)
{
isNormalExit = false;
buttu_richBoxDelegate d = buttu_richBox; //委托事件
usercount = 0;
UserCount(usercount);
Break;
}
}Catch{break;}
User user = new User(newClient); //保存客户端列表
Thread threadReceive = new Thread(ReceiveData); //创建新的线程
实验环境
一台PC机作为客户机(Windows XP操作系统,装有Visual Studio2010),一台虚拟机作为服务器(Windows server 2003操作系统),装有WireShark网络协议分析
软件。




(1)设计程序,分别构建通信的两端:服务器端和客户端应用程序,套接字类型为面向连接的Socket,自己构建双方的应答模式,实现双方的数据的发送和接收(S发给C,C发给S)。
(2)服务端程序能响应单个或任意多个客户端连接请求;服务端向单个客户发送消息,支持群发消息给所有客户端。服务器的设计是这次实验最复杂的部分,因为服务器的功能比较多。作为服务器,它要可以同时与多个客户端连接,为每一个连接的客户端创建一个通信Socket,自己还要有一个Socket用于监听客户端的连接请求;服务器要创建一个数据结构用于保存连接进来的客户端的信息(Socket和客户端的名字);服务器要将连接进来的客户端显示出来,用户可以根据显示出来的用户列表来向指定的客户端发信息;服务器要能及时地刷新客户端列表,当有新的客户端连接进来或是退出的时候要及时通知所有的客户端并刷新自己的客户端列表;服务器要能接
}catch{if (isExit == false){
richTextBox1.Invoke(d, "与服务器失去联系。");
client.Shutdown(SocketShutdown.Both); //关闭套接字
client.Close();
}
break;
}
string[] splitString = recieveMessage.Split(','); //处理信息
string command = splitString[0].ToLower();
switch(command) {case "login":AddOnline(recieveMessage); break;
case "logout": RemoveUserName(splitString[1]); //退出信息
try
{myListener.Listen (10); //开始监听
richTextBox1.Invoke(d,"成功监听."); //成功监听
} catch{richTextBox1.Invoke(d,"监听失败。");
}
Thread mhThread = new Thread(ListenClientConnect); //创建新的线程
client.Connect(new IPEndPoint(ips, 8889));//连接服务器
break;
}catch{//若获取的IP是vs6的话}
}
client.Send(Encoding.UTF8.GetBytes("login," + textBox1.Text));
Thread threadReceive = new Thread(new ThreadStart(ReceiveData));
(4)通信的双方具备异常响应功能,包括对方异常退出的处理。如果客户端退出,服务器有响应
(5)线程的设计思路:在服务器方面,需要一个专门用于监听客户端的连接请求,对于连接进来的每一个客户端,还要创建一个线程用于接收信息,程序的主线程用于向不同的客户端发送信息,所以服务器至少需要n+2(n>=0)个线程:在客户端方面,需要一个线程用于接收服务的信息,还需要一个线程用于向服务器发送信息,所以只需要两个线程。
threadReceive.IsBackground=true; //设置为后台线程
threadReceive.Start(user); //开始线程
UserCount(++usercount); //客户端人数加1
}
}
客户端代码设计
(1)客户端连接服务器代码:
Private void button1_Click(object sender, EventArgs e)
{Socket newClient =null;
While (isNormalExit==false)
{try
{newClient = myListener.Accept(); //接受客户端
if(isNormalExit == true)//如果服务器停止监听
{ newClient.Close(); //关闭Socket
break;
case "talk": richTextBox1.Invoke(d, "["+splitString[1] + "]对我说: " + splitString[2]);//对话信息
break;
default: richTextBox1.Invoke(d,"无意义。");
break;
}
}
LostConnect(); //关闭连接
郑州轻工业学院本科生实验报告
实验名称
实验七套接字(Socket)编程
课程名称
网络协议分析
姓名
覃远芬
指导教师
尹毅峰
专业、班级
网络工程14-01
学号
541407030142
实验时间
2016-11-24
实验地点
四教楼302




体会套接字在进程通信中的作用,了解TCP协议的工作原理,掌握套接字编程方法。
threadReceive.IsBackground = true; //设置为后台线程
threadReceive.Start(); //开始线程
}
(2)客户端接收服务器信息代码:
private void ReceiveData()
{AddrichTextBox1Massage d = sendrichTextBox1Massage;
mhThread.IsBackground = true; //设置为后台线程
mhThread.Start ();
button1.Enabled=false; //开始监听按钮不可用
button2.Enabled= true;
}
(2)服务器接受客户端代码:
private void ListenClientConnect ()
{ button1.Enabled = false;
client = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp); //新建套接字
AddrichTextBox1Massage d = sendrichTextBox1Massage;
收所有的客户端的信息,并将信息无错地转发给指定的客户端。
(3)客户端的设计相对于服务器来说的话对会比较简单一点。客户端要有接收服务器信息的功能,但客户端只向服务器发信息,客户端通过服务器的转发功能向其它的客户端发送信息。客户端要可以处理服务器发过来的信息,需要数据结构用来保存所有客户端的名字,并将所有客户端名字列表显示出来。可以指定客户端列表里面的多个项选择不同的客户端发信息。
实验日期:2016年11月24日
评分:
指导教师签字:
}







实验总结
通过本次实验,才真正了解到Socket套接字对通信的重要性,编程对于我来说是比较困难的,在实验的过程中,代码总是出现问题。刻下自己通过网上查找资料,以及同学的指导,才对套接字有了更深的了解。从实验的过程中发现了自己的许多弱点,应该多加强编程,多看一些辅助的学习资料,来加深对所学知识的理解和巩固。

{String name = Dns.GetHostName(); //获得计算机的名字
IPHostEntry me = Dns.GetHostEntry (name); //获得计算机IP
foreach(IPAddress ips in me.AddressList){
Try {
IPEndPoint ep = new IPEndPoint(ips, 8889);
相关主题