怎么样才能去掉晒斑杂音

c#技术类(70)
UDP/TCP通讯(28)
为什么会有如题的概念呢,我想对于没有主动听说过socket网络编程的人来说读到题目可能就已经蒙头了,为了很好的让大家进入场景,首先说一下一个需要用到这点东西的业务需求。
首先大家应该明确的是socket网络编程是以CS的模式下才有的,比如机房收费系统,在机房收费系统中可能会遇到不同的机房使用的收费系统是使用同一个数据库的。但是对于一些显示的信息,只有每次查询数据库的时候才能更新到窗体中,拿最简单的主界面的当前上机的人数来说,有机房A和机房B两个机房,并且他们是使用同一个数据库的,然后两个值班教师在同一时间工作,但机房A增加或减少上机的人数,机房B的值班教师是不能实时的接到消息并更新自己的窗体的。这就会导致窗体显示的信息暂时性的错误。这时就用到了我们的socket网络编程。
一、官方的解释socket机制:
在网络编程中最常用的方案便是Client/Server(客户机/服务器)模型。在这种方案中客户应用程序向服务器程序请求服务。一个服务程序通常在一个众所周知的地址监听对服务的请求,也就是说,服务进程一
直处于休眠状态,直到一个客户向这个服务的地址提出了连接请求。在这个时刻,服务程序被&惊醒&并且为客户提供服务-对客户的请求作出适当的反应。
为了方便这种Client/Server模型的网络编程,90年代初,由Microsoft联合了其他几家公司共同制定了一套WINDOWS下的网络编程接口,即WindowsSockets规范,它不是一种网络协议,而是一套开放的、支持多种协议的Windows下的网络编程接口。现在的Winsock已经基本上实现了与协议无关,你可以使用Winsock来调用多种协议的功能,但较常使用的是TCP/IP协议。Socket实际在计算机中提供了一个通信端口,可以通过这个端口与任何一个具有Socket接口的计算机通信。应用程序在网络上传输,接收的信息都通过这个Socket接口来实现。
二、通俗的理解socket
我们可以简单的把Socket理解为一个可以连通网络上不同计算机程序之间的管道,把一堆数据从管道的A端扔进去,则会从管道的B端(也许同时还可以从C、D、E、F……端冒出来)。管道的端口由两个因素来唯一确认,即机器的IP地址和程序所使用的端口号。IP地址的含义所有人都知道,所谓端口号就是程序员指定的一个数字,许多著名的木马程序成天在网络上扫描不同的端口号就是为了获取一个可以连通的端口从而进行破坏。比较著名的端口号有http的80端口,当然,建议大家自己写程序不要使用太小的端口号,它们一般被系统占用了,也不要使用一些著名的端口,一般来说使用之内的端口比较好。
Socket可以支持数据的发送和接收,它会定义一种称为套接字的变量,发送数据时首先创建套接字,然后使用该套接字的send等方法对准某个IP/端口进行数据发送;接收端也首先创建套接字,然后将该套接字绑定到一个IP/端口上,所有发向此端口的数据会被该套接字的recv等函数读出。如同读出文件中的数据一样。
三、例子:
说了这么多我想大家对于socket有了简单的认识,当然还是要在代码中深入的理解。
在看代码之前,还要做最后的解释,socket编程一定使用客户端和服务器的,虽然接下来的例子中只是一对一的通信,但其实和一对多的通信是一个原理的。
1.服务器代码
首先看服务器代码:
/*********************************************************
* 开发人员:韩义
* 创建时间: 13:51:48
* 描述说明:socket网络变成实例服务器
* 版本:1.0
版权所有:信息技术提高班
* *******************************************************/
using System.Collections.G
using System.D
using System.D
using System.L
using System.T
using System.Windows.F
using System.N
using System.Net.S
namespace Server
public partial class server : Form
Socket s =
IPEndPoint iep =
byte[] buf = new byte[1024];
Socket worker =
public server()
InitializeComponent();
Control.CheckForIllegalCrossThreadCalls =
//启动服务器。--韩义
private void button1_Click_1(object sender, EventArgs e)
//创建一个通道
s = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);
//创建一个侦听点
iep = new IPEndPoint(IPAddress.Any, 20000);
//绑定到通道上
s.Bind(iep);
s.Listen(6);
//通过异步来处理,开启监听连接,并交给Accept函数处理连接
s.BeginAccept(new AsyncCallback(Accept), s);
this.button1.Visible =
//接收到连接的动作--韩义
void Accept(IAsyncResult ia)
//获取用户定义的对象,它限定或包含关于异步操作的信息。
s = ia.AsyncState as S//此属性返回一个对象,该对象是启动异步操作的方法的最后一个参数。
worker = s.EndAccept(ia);//返回一个 Socket,它处理与远程主机的通信。
s.BeginAccept(new AsyncCallback(Accept), s);//重新接收链接,并制定回掉函数
//开始接受数据
worker.BeginReceive(buf, 0, buf.Length, SocketFlags.None, new AsyncCallback(Receive), worker);
//收到消息的动作--韩义
void Receive(IAsyncResult ia)
//获取用户定义的对象,它限定或包含关于异步操作的信息。
worker = ia.AsyncState as S
//获取数据长度
int count = worker.EndReceive(ia);
//自己开始接收数据。
worker.BeginReceive(buf, 0, buf.Length, SocketFlags.None, new AsyncCallback(Receive), worker);
//按GB2312的标准取出数据
string context = Encoding.GetEncoding(&gb2312&).GetString(buf, 0, count);
this.textBox1.Text += Environment.NewL
this.textBox1.Text +=
//发送消息--韩义
private void button2_Click_1(object sender, EventArgs e)
string context = &管理员:& + this.textBox2.Text.Trim();
if (context != &&)
this.textBox1.Text += Environment.NewL//换行
this.textBox1.Text +=
this.textBox2.Text = &&;
worker.Send(Encoding.GetEncoding(&gb2312&).GetBytes(context));
2.服务器界面:
3.客户端代码
/*********************************************************
* 开发人员:韩义
* 创建时间: 13:51:48
* 描述说明:socket网络变成实例客户端
* 版本:1.0
版权所有:信息技术提高班
* *******************************************************/
using System.Collections.G
using System.D
using System.D
using System.L
using System.T
using System.Windows.F
using System.N
using System.Net.S
namespace Client
public partial class client : Form
Socket s =
IPEndPoint iep =
byte[] buf = new byte[1024];
public client()
InitializeComponent();
Control.CheckForIllegalCrossThreadCalls =
//连接服务器--韩义
private void button1_Click_1(object sender, EventArgs e)
s = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);
iep = new IPEndPoint(IPAddress.Parse(&127.0.0.1&),20000);
s.Connect(iep);
//建立与远程主机的连接
this.label1.Text = &连接成功&;//连接成功提示
this.button1.Visible
=//隐藏连接按钮
//开始接收连接。
s.BeginReceive(buf, 0, buf.Length, SocketFlags.None, new AsyncCallback(Receive), s);
//发送消息--韩义
private void button2_Click_1(object sender, EventArgs e)
string context = iep.ToString() + &:& + this.textBox2.Text.Trim();
if (context != &&)
this.textBox1.Text += Environment.NewL
this.textBox1.Text +=
this.textBox2.Text = &&;
//发送消息
s.Send(Encoding.GetEncoding(&gb2312&).GetBytes(context));
//收到消息的动作--韩义
void Receive(IAsyncResult ia)
s = ia.AsyncState as S
int count = s.EndReceive(ia);
//自己开始接收数据
s.BeginReceive(buf, 0, buf.Length, SocketFlags.None, new AsyncCallback(Receive), s);
string context = Encoding.GetEncoding(&gb2312&).GetString(buf, 0, count);
this.textBox1.Text += Environment.NewL
this.textBox1.Text +=
4.客户端界面:
当然大家会发现其实这就是一个聊天工具,和一个好友聊天就是一对一,群聊天就是一对多。这又进一步的帮助理解网络编程的含义。
四、总结:
通过以上的代码,我们可以大概的总结一下socket编程的几个步骤:
建立Socket
在服务器端建立一个监听的Socket,为此可以调用Socket()函数用来建立这个监听的Socket,并定义此Socket所使用的通信协议。此函数调用成功返回Socket对象,失败则返回INVALID_SOCKET
初始化调用的socket的构造函数,MSDN上共有三种构造函数重载,这里我们用的是第三种
使用指定的地址族、套接字类型和协议初始化Socket类的新实例。
接下来要为服务器端定义的这个监听的Socket指定一个地址及端口(Port),这样客户端才知道待会要连接哪一个地址的哪个端口,为此我们要调用bind()函数,该函数调用成功返回0,否则返回SOCKET_ERROR。
当服务器端的Socket对象绑定完成之后,服务器端必须建立一个监听的队列来接收客户端的连接请求。listen()函数使服务器端的Socket进入监听状态,并设定可以建立的最大连接数(目前最大值限制为 6, 最小值为1)。该函数调用成功返回0,否则返回SOCKET_ERROR。
服务器端接受客户端的连接请求
当Client提出连接请求时,Server端监听视窗会收到客户端送来我们自定义的一个消息,这时,我们可以分析lParam,然后调用相关的函数来处理此事件。为了使服务器端接受客户端的连接请求,就要使用accept()函数,该函数新建一Socket与客户端的Socket相通,原先监听之Socket继续进入监听状态,等待他人的连接要求。该函数调用成功返回一个新产生的Socket对象,否则返回INVALID_SOCKET。
以上可以说是socket网络编程的核心内容。其实真的没有那么难理解
特别说明:
本实例只是一对一的通信,一对多的通信或多对多的通信只需在此基础上略加改动。本实例只是很简单的小例子,有需要复用的代码请注意命名规范。
参考知识库
* 以上用户言论只代表其个人观点,不代表CSDN网站的观点或立场
访问:583195次
积分:7090
积分:7090
排名:第2715名
原创:126篇
转载:65篇
评论:154条
作者是一名软件工程出生的苦逼程序员,本科阶段也是软件工程,目前研究生在读,热爱新技术,热爱编程,为人幽默,热爱开源。
文章:13篇
阅读:84902
阅读:65067
文章:10篇
阅读:16627
(1)(2)(3)(1)(10)(2)(4)(5)(2)(16)(6)(13)(16)(5)(2)(8)(32)(1)(6)(31)(27)2015年1月 VC/MFC大版内专家分月排行榜第二
2015年1月 VC/MFC大版内专家分月排行榜第二
2015年1月 VC/MFC大版内专家分月排行榜第三
2015年9月 VC/MFC大版内专家分月排行榜第二2015年7月 硬件/嵌入开发大版内专家分月排行榜第二2014年5月 VC/MFC大版内专家分月排行榜第二2014年3月 VC/MFC大版内专家分月排行榜第二2013年10月 VB大版内专家分月排行榜第二2013年7月 VB大版内专家分月排行榜第二2012年5月 VB大版内专家分月排行榜第二2012年4月 VB大版内专家分月排行榜第二2012年2月 VB大版内专家分月排行榜第二2011年11月 VB大版内专家分月排行榜第二
2015年11月 VC/MFC大版内专家分月排行榜第三2015年6月 VC/MFC大版内专家分月排行榜第三2015年2月 VC/MFC大版内专家分月排行榜第三2014年1月 VC/MFC大版内专家分月排行榜第三2012年3月 VB大版内专家分月排行榜第三2011年12月 VB大版内专家分月排行榜第三2011年10月 VB大版内专家分月排行榜第三
2013年 总版技术专家分年内排行榜第三
2012年 总版技术专家分年内排行榜第七
2013年 总版技术专家分年内排行榜第三
2012年 总版技术专家分年内排行榜第七
2009年7月 总版技术专家分月排行榜第二2009年3月 总版技术专家分月排行榜第二2009年1月 总版技术专家分月排行榜第二2005年7月 总版技术专家分月排行榜第二2005年5月 总版技术专家分月排行榜第二2005年3月 总版技术专家分月排行榜第二
优秀小版主2015年8月优秀小版主2015年9月优秀小版主2015年5月优秀小版主2015年2月论坛优秀版主
匿名用户不能发表回复!|
每天回帖即可获得10分可用分!小技巧:
你还可以输入10000个字符
(Ctrl+Enter)
请遵守CSDN,不得违反国家法律法规。
转载文章请注明出自“CSDN(www.csdn.net)”。如是商业用途请联系原作者。2007年6月 总版技术专家分月排行榜第三
2007年6月 VC/MFC大版内专家分月排行榜第一
2009年7月 总版技术专家分月排行榜第二2009年3月 总版技术专家分月排行榜第二2009年1月 总版技术专家分月排行榜第二2005年7月 总版技术专家分月排行榜第二2005年5月 总版技术专家分月排行榜第二2005年3月 总版技术专家分月排行榜第二
优秀小版主2015年8月优秀小版主2015年9月优秀小版主2015年5月优秀小版主2015年2月论坛优秀版主
2011年 总版技术专家分年内排行榜第三2010年 总版技术专家分年内排行榜第三
2012年 总版技术专家分年内排行榜第五
2013年 总版技术专家分年内排行榜第三
2012年 总版技术专家分年内排行榜第七
匿名用户不能发表回复!|
每天回帖即可获得10分可用分!小技巧:
你还可以输入10000个字符
(Ctrl+Enter)
请遵守CSDN,不得违反国家法律法规。
转载文章请注明出自“CSDN(www.csdn.net)”。如是商业用途请联系原作者。匿名用户不能发表回复!|
每天回帖即可获得10分可用分!小技巧:
你还可以输入10000个字符
(Ctrl+Enter)
请遵守CSDN,不得违反国家法律法规。
转载文章请注明出自“CSDN(www.csdn.net)”。如是商业用途请联系原作者。2013年6月 Linux/Unix社区大版内专家分月排行榜第二2013年5月 Linux/Unix社区大版内专家分月排行榜第二2013年3月 Linux/Unix社区大版内专家分月排行榜第二2013年1月 Linux/Unix社区大版内专家分月排行榜第二2012年12月 Linux/Unix社区大版内专家分月排行榜第二2012年8月 Linux/Unix社区大版内专家分月排行榜第二2011年12月 Linux/Unix社区大版内专家分月排行榜第二2011年10月 C/C++大版内专家分月排行榜第二2011年10月 Linux/Unix社区大版内专家分月排行榜第二
2012年6月 C/C++大版内专家分月排行榜第三2012年6月 PHP大版内专家分月排行榜第三2012年5月 C/C++大版内专家分月排行榜第三2012年3月 Linux/Unix社区大版内专家分月排行榜第三2012年2月 Linux/Unix社区大版内专家分月排行榜第三2011年11月 C/C++大版内专家分月排行榜第三
2013年 总版技术专家分年内排行榜第三
2012年 总版技术专家分年内排行榜第七
本帖子已过去太久远了,不再提供回复功能。

我要回帖

更多关于 纹身要怎么样才能去掉 的文章

 

随机推荐