socket网络课设报告.doc
基于C/S结构的套接字程序设计 -通过socket实现服务端功能学 院: 信息技术工程学院 _专 业: 计算机科学与技术 _班 级: *班 _姓 名: 陈* 学 号: 指导老师: * 开课时间:2014年1月12日到1月16日 摘 要基于C/S结构的套接字程序设计,采用了Client/Server模型, 程序基于TCP协议,通过socket接口来实现的。服务器端的一个端口用来监听对服务的请求,另外有一个临时端口用来给客户端发送数据,当客户端向该地址提出连接请求时,服务器端会对它的请求做出相应的反应。当连接成功之后,客户端就可以向服务器端发送数据或接收来自服务器的的数据。在传输过程中如果出现错误会返回错误信息,并对该信息做出诊断。引 言1、目的及要求 (1)目的和意义通过编程了解C/S结构的网络通信模型;掌握基于C/S结构的Windows Socket TCP的程序设计方法。(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、主要内容及对其分析客户端源程序using System;using System.Net;using System.Net.Sockets;using System.Text;using System.Threading;using System.Windows.Forms;namespace Socket public partial class Server : Form public Server() InitializeComponent(); TextBox.CheckForIllegalCrossThreadCalls = false; private void ErrShow(string str, Exception ex) SetShow("-错误-rn"); SetShow(ex.Message + "rn"); SetShow("-rn"); private void SetShow(string str) txtShow.AppendText(str+"rn"); #region 服务端部分 /负责监听端口 System.Net.Sockets.Socket wellcome = null; /负责和客户端通信 System.Net.Sockets.Socket connect = null; /负责监听线程 Thread listenThread = null; private void btnListen_Click(object sender, EventArgs e) /创建 try IPAddress ipadd = IPAddress.Parse(txtIp.Text.Trim(); /创建端口 IPEndPoint ipend = new IPEndPoint(ipadd, int.Parse(txtPort.Text.Trim(); /监听套接字(寻址协议流方式、Tcp协议 wellcome = new System.Net.Sockets.Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp); wellcome.Bind(ipend); wellcome.Listen(10); /允许监听的最大数量 SetShow("开始监听了-"); listenThread = new Thread(Listing) IsBackground = true ; listenThread.Start(); catch (Exception ex) ErrShow("", ex); / <summary> / 监听 / </summary> private void Listing() while (true) try connect = wellcome.Accept(); SetShow("已监听到了!"); Thread recive = new Thread(ReciveMsg) IsBackground = true ; recive.Start(); catch (Exception ex) ErrShow("", ex); / <summary> / 服务端监听用户接收数据 / </summary> private void ReciveMsg() while (true) try byte bytes = new byte1024 * 1024 * 2; int length = connect.Receive(bytes); if (length > 0) SetShow(Encoding.UTF8.GetString(bytes, 0, length); catch (Exception) private void btnServer_Click(object sender, EventArgs e) byte datas = Encoding.UTF8.GetBytes(txtServerTxt.Text.Trim(); connect.Send(datas, 0, datas.Length, SocketFlags.None); #endregion5、结果运行页面监听页面监听错误报告6、不足之处我们的这次课程设计程序编写运用C#语言。虽然满足设计的基本要求要求,但由于对TCP的概念相对于模糊,导致缺少对端口号的判断,使得任意的端口号都可以进行数据传送,而且没有考虑到一些端口号的特殊性,使得程序整体运行不完美。因此考虑到这些不足,以下是对程序的补充。改进程序设计:1)判断客户输入的端口号是否是合理的:tryInt16 x = Convert.ToInt16(this. txtClientTxt.Text.Trim();catchMessageBox.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端口是否被占用Process p = new Process();/提供对本地和远程进程的访问并使您能够启动和停止本地系统进程。/Process.StartInfo 属性,获取或设置要传递给 Process 的 Start 方法的属性。p.StartInfo = new ProcessStartInfo("netstat", "-a");/指定启动进程时使用的一组值。p.StartInfo.CreateNoWindow = true;/获取或设置指示是否在新窗口中启动该进程的值。/如果UseShellExecute属性是true或UserName和Password属性不是null、 CreateNoWindow属性值将被忽略,并创建一个新窗口。p.StartInfo.UseShellExecute = false;/获取或设置一个值,该值指示是否使用操作系统 shell 启动进程。p.StartInfo.WindowStyle = ProcessWindowStyle.Hidden;/获取或设置启动进程时使用的窗口状态。p.StartInfo.RedirectStandardOutput = true;/获取或设置一个值,该值指示是否将应用程序的输出写入 Process.StandardOutput 流中。p.Start();string result = p.StandardOutput.ReadToEnd().ToLower();/最后都转换成小写字母/Environment.MachineName获取此本地计算机的 NetBIOS 名称。if (result.IndexOf("tcp " + Environment.MachineName.ToLower() + ":" + textBox1.Text) >= 0) MessageBox.Show("TCP" + textBox1.Text + "端口被占用","提示 ",MessageBoxButtons.OK,MessageBoxIcon.Information);elseMessageBox.Show("TCP" + textBox1.Text + "端口没有被占用", "提示", MessageBoxButtons.OK. MessageBoxIcon.Information);结 论通过这次的网络课程设计收获颇多,在对与原有的基础上再一次的学习TCP知识。我们组这次做的课题的目的就是通过套接字在客户端和服务器之间建立连接,这个连接是以TCP协议传输。在建立连接之后实现客户端与服务器之间的通信,从而设计相关函数的调用和对套接字的应用。1 : 客户连接(Client connections)由客户启动,并将本地客户套接字与远程服务器套接字相连.客户套接字必须说明它们想连接的服务器.需要提供服务器的主机名或IP地址及其端口号. 2 : 监听连接(Listening Connections) 是等待客户的被动服务器套接字连接.一旦客户发出了新的请求,服务器就会为该特殊连接生成新的套接字,然后返回监听状态.监听服务器套接字必须说明代表其提供服务的端口吗(事实上,客户正是通过该端口进行连接的). 3 : 服务器连接是由服务器激活的连接,负责接受来自客户的请求. 这些不同的连接种类只对建立客户与服务器之间的连接具有重要性.一旦连接建立完毕.连接的双方都可以自由发出请求并彼此发送数据.这里面涉及什么是套接字,什么是流式套接字,为什么用流式套接字等问题。用套接字中的相关函数来完成通信过程,它的存在是为了区别不同应用程序进程间的网络通信和连接。流套接字用于提供面向连接、可靠的数据传输服务,又因为该服务将保证数据能够实现无差错、无重复发送,并按顺序接收,所以用了流式套接字。致 谢真诚感谢老师在我们课程设计阶段给予我们的指导与帮助以及专业课的教授,在老师的指导下使我对网络专业知识有了更深的认识,并且您严肃的科学态度,严谨的治学精神,精益求精的工作作风,深深地感染和激励着我,这些使我受益匪浅,并将成为我终身献身科学和献身事业的动力。在此向您致以诚挚的谢意与敬意。参考文献计算机网络课程设计吴功宜、胡晓英、张仁、何云、王宁编著 机械工业出版社计算机网络(第三版)安淑芝、黄彦编著网络上的关于套接字编程的课件