socket网络课设报告.docx
《socket网络课设报告.docx》由会员分享,可在线阅读,更多相关《socket网络课设报告.docx(10页珍藏版)》请在冰豆网上搜索。
socket网络课设报告
基于C/S结构的套接字程序设计
----通过socket实现服务端功能
学院:
信息技术工程学院_
专业:
计算机科学与技术_
班级:
*班_
姓名:
陈***
学号:
0123456789
指导老师:
***
开课时间:
2014年1月12日到1月16日
摘要
基于C/S结构的套接字程序设计,采用了Client/Server模型,程序基于TCP协议,通过socket接口来实现的。
服务器端的一个端口用来监听对服务的请求,另外有一个临时端口用来给客户端发送数据,当客户端向该地址提出连接请求时,服务器端会对它的请求做出相应的反应。
当连接成功之后,客户端就可以向服务器端发送数据或接收来自服务器的的数据。
在传输过程中如果出现错误会返回错误信息,并对该信息做出诊断。
引言
1、目的及要求
(1)目的和意义
通过编程了解C/S结构的网络通信模型;
掌握基于C/S结构的WindowsSocketTCP的程序设计方法。
(2)基本要求
按照C/S模型编写两个程序。
一个为客户端程序,另一是服务器端程序;
对于C/S两端都应输出必要的日志、出错或诊断信息。
2、研究设想
能够实现当客户端向服务器端发送请求时,通过TCP协议(传输控制协议)服务器端能够响应,并能与客户端进行通信。
3、相关理论
TCP协议提供的是可靠的、面向连接的传输控制协议,即在传输数据前要先建立逻辑连接,然后再传输数据,最后释放连接3个过程。
TCP协议在网络层IP协议的基础上,向应用层用户进程提供可靠地全双工的数据流传输。
并且通过创建的流式套接字实现服务端与客户端的数据传送。
流式套接字(SOCK--STREAM):
该类套接字提供了面向连接的、可靠的、数据无错并且无重复的数据发送服务。
而且发送的数据是按顺序接收的。
所有利用该套接字进行传递的数据均被视为连续的字节流的并且无长度限制。
这对数据的稳定性、正确性和发送/接受顺序要求严格的应用十分适用,TCP使用该类接口。
4、预期结果
通过运用套接字,实现服务器端与客户端的数据传送。
5、关键字
流式套接字;TCP/IP协议;服务器/客户端
正文
1、理论基础
应用层通过传输层进行数据通信时,TCP会遇到同时为多个应用程序进程提供并发服务的问题。
多个TCP连接或多个应用程序进程可能需要通过同一个TCP协议端口传输数据。
为了区别不同的应用程序和连接,许多计算机操作系统为应用程序与TCP/IP协议交互提供了称为套接字的接口,区分不同应用程序进程间的网络通信和连接。
网络化的应用程序在开始任何通讯之前都必需要创建套接字。
套接字可以看成在两个程序进行通讯连接中的一个端点,一个程序将一段信息写入套接字中,该套接字将这段信息发送给另外一个套接字中,使这段信息能传送到其他程序中。
套接字,是支持TCP/IP的网络通信的基本操作单元,可以看作是不同主机之间的进程进行双向通信的端点,简单的说就是通信的两方的一种约定,用套接字中的相关函数来完成通信过程。
流套接字用于提供面向连接、可靠的数据传输服务。
该服务将保证数据能够实现无差错、无重复发送,并按顺序接收。
流套接字之所以能够实现可靠的数据服务,原因在于其使用了传输控制协议,即TCP协议。
2、设计方法及思路
客户端与服务器建立连接,连接是通过申请的套接字实现的,客户打开一个套接字并把它约束在一个端口上如果成功就相当于建立一个虚拟文件以后就可以在虚拟文件上写数据并通过网络向外传送,完成连接后就可以通信了。
客户机向服务器发送请求,打开一个连接后,客户机把请求消息送到服务器的停留端口上,完成提出请求操作。
服务器在处理完客户的请求之后,要向客户机发送响应消息。
客户通过关闭套接字来结束TCP/IP对话。
当使用TCP/IP协议发送客户服务器服务程序时,服务器需要等待任意数量客户端的连接,以便为他们提供服务。
客户端连接服务器时,必须先知道服务器的名称。
在TCP/IP中,就是服务器的IP地址和端口号。
bind()函数实现将服务器绑定到一个已知的名字上的功能。
接下来要将服务器套接字设置为监听状态,这是通过listen()函数完成的。
在监听状态下,如果客户端向服务器发起连接请求,服务器通过调用accept()函数来接受该连接请求。
服务器与客户端完成连接后,就可以进行数据通信了。
对于客户端来说,首先调用connect()函数向服务器发出连接请求。
如果服务器接受了该请求接下来就可以与服务器通信了
3、编程方法
TCP/IP流式套接字的编程步骤(客户端程序)及流程
1)加载套接字库
2)创建套接字(socket)
3)向服务器发出连接请求(connect)
4)和服务器端进行通信
5)关闭套接字
6)流程
4、主要内容及对其分析
客户端源程序
usingSystem;
usingSystem.Net;
usingSystem.Net.Sockets;
usingSystem.Text;
usingSystem.Threading;
usingSystem.Windows.Forms;
namespaceSocket
{
publicpartialclassServer:
Form
{
publicServer()
{
InitializeComponent();
TextBox.CheckForIllegalCrossThreadCalls=false;
}
privatevoidErrShow(stringstr,Exceptionex)
{
SetShow("------错误-------\r\n");
SetShow(ex.Message+"\r\n");
SetShow("-----------------\r\n");
}
privatevoidSetShow(stringstr)
{
txtShow.AppendText(str+"\r\n");
}
#region服务端部分
//负责监听端口
System.Net.Sockets.Socketwellcome=null;
//负责和客户端通信
System.Net.Sockets.Socketconnect=null;
//负责监听线程
ThreadlistenThread=null;
privatevoidbtnListen_Click(objectsender,EventArgse)
{
//创建
try
{
IPAddressipadd=IPAddress.Parse(txtIp.Text.Trim());
//创建端口
IPEndPointipend=newIPEndPoint(ipadd,int.Parse(txtPort.Text.Trim()));
//监听套接字(寻址协议流方式、Tcp协议
wellcome=newSystem.Net.Sockets.Socket(AddressFamily.InterNetwork,SocketType.Stream,ProtocolType.Tcp);
wellcome.Bind(ipend);
wellcome.Listen(10);//允许监听的最大数量
SetShow("开始监听了-…-");
listenThread=newThread(Listing){IsBackground=true};
listenThread.Start();
}
catch(Exceptionex)
{
ErrShow("",ex);
}
}
///
///监听
///
privatevoidListing()
{
while(true)
{
try
{
connect=wellcome.Accept();
SetShow("已监听到了!
");
Threadrecive=newThread(ReciveMsg){IsBackground=true};
recive.Start();
}
catch(Exceptionex)
{
ErrShow("",ex);
}
}
}
///
///服务端监听用户接收数据
///
privatevoidReciveMsg()
{
while(true)
{
try
{
byte[]bytes=newbyte[1024*1024*2];
intlength=connect.Receive(bytes);
if(length>0)
{
SetShow(Encoding.UTF8.GetString(bytes,0,length));
}
}
catch(Exception)
{
}
}
}
privatevoidbtnServer_Click(objectsender,EventArgse)
{
byte[]datas=Encoding.UTF8.GetBytes(txtServerTxt.Text.Trim());
connect.Send(datas,0,datas.Length,SocketFlags.None);
}
#endregion
5、结果
运行页面
监听页面
监听错误报告
6、不足之处
我们的这次课程设计程序编写运用C#语言。
虽然满足设计的基本要求要求,但由于对TCP的概念相对于模糊,导致缺少对端口号的判断,使得任意的端口号都可以进行数据传送,而且没有考虑到一些端口号的特殊性,使得程序整体运行不完美。
因此考虑到这些不足,以下是对程序的补充。
改进程序设计:
1)判断客户输入的端口号是否是合理的:
try
{
Int16x=Convert.ToInt16(this.txtClientTxt.Text.Trim());
}
catch
{
MessageBox.Show("请输入大于0的整数!
","提示",MessageBoxButtons.OK);
textBox1.Focus();
return;
}
if(Convert.ToInt16(this.txtClientTxt.Text.Trim())<=0)
{
MessageBox.Show("请输入大于0的整数!
","提示",MessageBoxButtons.OK);
textBox1.Focus();
return;
}
2)检查TCP端口是否被占用
Processp=newProcess();//提供对本地和远程进程的访问并使您能够启动和停止本地系统进程。
//Process.StartInfo属性,获取或设置要传递给Process的Start方法的属性。
p.StartInfo=newProcessStartInfo("netstat","-a");//指定启动进程时使用的一组值。
p.StartInfo.CreateNoWindow=true;//获取或设置指示是否在新窗口中启动该进程的值。
//如果UseShellExecute属性是true或UserNam