客户端和服务端的编程实现.docx

上传人:b****5 文档编号:11826307 上传时间:2023-04-03 格式:DOCX 页数:12 大小:170.40KB
下载 相关 举报
客户端和服务端的编程实现.docx_第1页
第1页 / 共12页
客户端和服务端的编程实现.docx_第2页
第2页 / 共12页
客户端和服务端的编程实现.docx_第3页
第3页 / 共12页
客户端和服务端的编程实现.docx_第4页
第4页 / 共12页
客户端和服务端的编程实现.docx_第5页
第5页 / 共12页
点击查看更多>>
下载资源
资源描述

客户端和服务端的编程实现.docx

《客户端和服务端的编程实现.docx》由会员分享,可在线阅读,更多相关《客户端和服务端的编程实现.docx(12页珍藏版)》请在冰豆网上搜索。

客户端和服务端的编程实现.docx

客户端和服务端的编程实现

 

学生学号

王体方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

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

当前位置:首页 > 求职职场 > 简历

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

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