客户端和服务端的编程实现.docx
- 文档编号:11826307
- 上传时间:2023-04-03
- 格式:DOCX
- 页数:12
- 大小:170.40KB
客户端和服务端的编程实现.docx
《客户端和服务端的编程实现.docx》由会员分享,可在线阅读,更多相关《客户端和服务端的编程实现.docx(12页珍藏版)》请在冰豆网上搜索。
客户端和服务端的编程实现
学生学号
王体方10109281王雁飞10109282
实验课成绩
杭州电子科技大学
学生实验报告书
实验课程名称《计算机网络》实验七
开课学院软件工程学院
指导老师姓名谢红标
学生姓名王体方王雁飞
学生专业班级软件2班
2011—2012学年第二学期
实验课程名称:
计算机网络
实验项目名称
客户和服务器通信编程实现
实验成绩
实验者
王体方
王雁飞
专业班级
软件2班
实验日期
2012年5月18日
第一部分:
实验分析与设计
一、实验内容描述(问题域描述)
1、实验目的
1.1理解套接字(socket)通信的基本原理和机制
1.2理解进程间通信的机制。
2、实验要求
分别编写客服端和服务器端代码,建立客户端与服务器端之间正确的socket连结(语言自选,附源代码)
二、实验基本原理与设计(包括实验方案设计,实验手段的确定,试验步骤等)
1.实验原理
socket的英文原义是“孔”或“插座”。
在这里作为4BDSUNIX的进程通信机制,取后一种意义。
socket非常类似于电话插座。
以一个国家级电话网为例。
电话的通话双方相当于相互通信的2个进程,区号是它的网络地址;区内一个单位的交换机相当于一台主机,主机分配给每个用户的局内号码相当于socket号。
任何用户在通话之前,首先要占有一部电话机,相当于申请一个socket;同时要知道对方的号码,相当于对方有一个固定的socket。
然后向对方拨号呼叫,相当于发出连接请求(假如对方不在同一区内,还要拨对方区号,相当于给出网络地址)。
对方假如在场并空闲(相当于通信的另一主机开机且可以接受连接请求),拿起电话话筒,双方就可以正式通话,相当于连接成功。
双方通话的过程,是一方向电话机发出信号和对方从电话机接收信号的过程,相当于向socket发送数据和从socket接收数据。
通话结束后,一方挂起电话机相当于关闭socket,撤消连接。
一个完整的socket有一个本地唯一的socket号,由操作系统分配。
常用的Socket类型有两种:
流式Socket(SOCK_STREAM)和数据报式Socket(SOCK_DGRAM)。
流式是一种面向连接的Socket,针对于面向连接的TCP服务应用;数据报式Socket是一种无连接的Socket,对应于无连接的UDP服务应用。
Socket建立为了建立Socket,程序可以调用Socket函数,该函数返回一个类似于文件描述符的句柄。
socket函数原型为:
intsocket(intdomain,inttype,intprotocol);domain指明所使用的协议族,通常为PF_INET,表示互联网协议族(TCP/IP协议族);type参数指定socket的类型:
SOCK_STREAM或SOCK_DGRAM,Socket接口还定义了原始Socket(SOCK_RAW),允许程序使用低层协议;protocol通常赋值"0"。
Socket()调用返回一个整型socket描述符,你可以在后面的调用使用它。
Socket描述符是一个指向内部数据结构的指针,它指向描述符表入口。
调用Socket函数时,socket执行体将建立一个Socket,实际上"建立一个Socket"意味着为一个Socket数据结构分配存储空间。
Socket执行体为你管理描述符表。
两个网络程序之间的一个网络连接包括五种信息:
通信协议、本地协议地址、本地主机端口、远端主机地址和远端协议端口。
Socket数据结构中包含这五种信息。
socket在测量软件中的使用也很广泛
2.实验步骤
本实验在VS2008下实现,本机ip为169.254.59.194,实验要实现客户端与服务端在8000号端口的通信,具体代码如下:
服务端代码
usingSystem;
usingSystem.Collections.Generic;
usingSystem.ComponentModel;
usingSystem.Data;
usingSystem.Drawing;
usingSystem.Linq;
usingSystem.Text;
usingSystem.Windows.Forms;
usingSystem.Net;
usingSystem.Net.Sockets;
usingSystem.Threading;
namespacetemp
{
publicpartialclassForm1:
Form
{
ThreadLisThread;//线程
SocketLisSocket;//用于监听
SocketnewSocket;//用于通信
EndPointpoint;
stringstrmes=string.Empty;//用于存放通信的信息
publicForm1()
{
InitializeComponent();
}
privatevoidbutton1_Click(objectsender,EventArgse)
{//建立连接
LisThread=newThread(newThreadStart(BeginListern));
//开线程执行BeginListern方法
LisThread.Start();//线程开始执行
button1.Enabled=false;
}
publicvoidBeginListern()
{
LisSocket=newSocket(AddressFamily.InterNetwork,SocketType.Stream,ProtocolType.Tcp);
//初始化LisSocket
stringip="169.254.59.194";//本机ip
IPAddressServerIp=IPAddress.Parse(ip);
IPEndPointiep=newIPEndPoint(ServerIp,8000);
LisSocket.Bind(iep);//绑定socket
toolStripStatusLabel1.Text="正在监听:
"+iep.ToString();
LisSocket.Listen(50);//开始监听
newSocket=LisSocket.Accept();//获取连接请求的Socket
while(true)
{
try
{
byte[]byteMessage=newbyte[100];
newSocket.Receive(byteMessage);//接受信息
toolStripStatusLabel1.Text="收到信息";
Control.CheckForIllegalCrossThreadCalls=false;
strmes+="客户端"+DateTime.Now.ToString()+":
\n"+Encoding.Default.GetString(byteMessage).Trim(newchar[]{'\0'})+"\r\n";
richTextBox1.Text=strmes;//显示信息
}
catch(SocketExceptionex)
{
MessageBox.Show(ex.ToString());
}
}
}
privatevoidbutton3_Click(objectsender,EventArgse)
{//退出
Application.Exit();
}
privatevoidbutton2_Click(objectsender,EventArgse)
{//发送信息
if(richTextBox2.Text!
="")
{
byte[]byteData=Encoding.ASCII.GetBytes(richTextBox2.Text);
newSocket.Send(byteData);//发送信息即由服务器往客户端上发信息
strmes+="服务端"+DateTime.Now.ToString()+":
\n"+richTextBox2.Text+"\r\n";
richTextBox2.Text="";
richTextBox1.Text=strmes;//更新输出
toolStripStatusLabel1.Text="成功发送信息";
}
}
privatevoidbutton4_Click(objectsender,EventArgse)
{//清空
richTextBox1.Text="";
strmes=string.Empty;
}
privatevoidbutton5_Click(objectsender,EventArgse)
{//断开连接
try
{
LisSocket.Close();//关闭Socket
LisThread.Abort();//线程停止
LisThread=null;
button1.Enabled=true;
toolStripStatusLabel1.Text="";
}
catch(Exceptionex)
{
MessageBox.Show(ex.Message);
}
}
}
}
客户端代码
usingSystem;
usingSystem.Collections.Generic;
usingSystem.ComponentModel;
usingSystem.Data;
usingSystem.Drawing;
usingSystem.Linq;
usingSystem.Text;
usingSystem.Windows.Forms;
usingSystem.Threading;
usingSystem.Net.Sockets;
usingSystem.Net;
namespacetmpClient
{
publicpartialclassForm1:
Form
{
publicstaticSocketClientSocket;//客户端Socket
Threadthread;
stringstrev=string.Empty;//存放通信信息
publicForm1()
{
InitializeComponent();
}
privatevoidbutton2_Click(objectsender,EventArgse)
{//往服务器上发送信息
if(ClientSocket.Connected)//判断Socket是否已连接
{
if(richTextBox2.Text!
="")
{
byte[]SendMessage=newbyte[100];
SendMessage=Encoding.ASCII.GetBytes(richTextBox2.Text);
ClientSocket.Send(SendMessage);
//将数据数据发送到连接的Socket中
toolStripStatusLabel1.Text="成功发送信息";
strev+="客户端"+DateTime.Now.ToString()+":
\n"+richTextBox2.Text+"\r\n";
richTextBox1.Text=strev;//显示通信信息
richTextBox2.Text="";
}
}
else
{
MessageBox.Show("尚未建立连接");
}
}
privatevoidbutton3_Click(objectsender,EventArgse)
{//退出
Application.Exit();
}
publicvoidtargett()
{//接收来自服务器上的信息
toolStripStatusLabel1.Text="连接已建立";
while(true)
{
Control.CheckForIllegalCrossThreadCalls=false;
byte[]bytes=newbyte[100];
intrev=ClientSocket.Receive(bytes);//接受信息
if(rev<=0)break;
strev+="服务器"+DateTime.Now.ToString()+":
\n"+Encoding.Default.GetString(bytes).Trim(newchar[]{'\0'})+"\r\n";
richTextBox1.Text=strev;
toolStripStatusLabel1.Text="收到信息";
}
}
privatevoidbutton1_Click(objectsender,EventArgse)
{//为客户端Socket建立连接到服务器
ClientSocket=newSocket(AddressFamily.InterNetwork,SocketType.Stream,ProtocolType.Tcp);
stringip="169.254.59.194";//服务器ip
IPAddressipa=IPAddress.Parse(ip);
IPEndPointiep=newIPEndPoint(ipa,8000);
toolStripStatusLabel1.Text="已经建立连接.";
try
{
ClientSocket.Connect(iep);//连接到服务器
thread=newThread(newThreadStart(targett));
//开线程执行targett方法
thread.Start();//开始线程
button1.Enabled=false;
}
catch(SocketExceptionex)
{
MessageBox.Show(ex.ToString());
}
}
privatevoidbutton4_Click(objectsender,EventArgse)
{//断开连接
ClientSocket.Close();//关闭Socket
thread.Abort();//停止线程
thread=null;
toolStripStatusLabel1.Text="";
button1.Enabled=true;
toolStripStatusLabel1.Text="";
}
privatevoidbutton5_Click(objectsender,EventArgse)
{//清空输出
richTextBox1.Text="";
strev=string.Empty;
}
}
}
测试结果服务端开启监听
客户端建立连接
客户
服务端的回复
三、主要仪器设备及耗材
VS2008
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 客户端 服务端 编程 实现