- 浏览: 2159050 次
- 性别:
- 来自: 上海
文章分类
- 全部博客 (1878)
- [网站分类]ASP.NET (141)
- [网站分类]C# (80)
- [随笔分类]NET知识库 (80)
- [随笔分类]摘抄文字[非技术] (3)
- [随笔分类]养生保健 (4)
- [网站分类]读书区 (16)
- [随笔分类]赚钱 (7)
- [网站分类].NET新手区 (233)
- [随笔分类]网站 (75)
- [网站分类]企业信息化其他 (4)
- [网站分类]首页候选区 (34)
- [网站分类]转载区 (12)
- [网站分类]SQL Server (16)
- [网站分类]程序人生 (7)
- [网站分类]WinForm (2)
- [随笔分类]错误集 (12)
- [网站分类]JavaScript (3)
- [随笔分类]小说九鼎记 (69)
- [随笔分类]技术文章 (15)
- [网站分类]求职面试 (3)
- [网站分类]其他技术区 (6)
- [网站分类]非技术区 (10)
- [发布至博客园首页] (5)
- [网站分类]jQuery (6)
- [网站分类].NET精华区 (6)
- [网站分类]Html/Css (10)
- [随笔分类]加速及SEO (10)
- [网站分类]Google开发 (4)
- [随笔分类]旅游备注 (2)
- [网站分类]架构设计 (3)
- [网站分类]Linux (23)
- [随笔分类]重要注册 (3)
- [随笔分类]Linux+PHP (10)
- [网站分类]PHP (11)
- [网站分类]VS2010 (2)
- [网站分类]CLR (1)
- [网站分类]C++ (1)
- [网站分类]ASP.NET MVC (2)
- [网站分类]项目与团队管理 (1)
- [随笔分类]个人总结 (1)
- [随笔分类]问题集 (3)
- [网站分类]代码与软件发布 (1)
- [网站分类]Android开发 (1)
- [网站分类]MySQL (1)
- [网站分类]开源研究 (6)
- ddd (0)
- 好久没写blog了 (0)
- sqlserver (2)
最新评论
-
JamesLiuX:
博主,能组个队么,我是Freelancer新手。
Freelancer.com(原GAF – GetAFreelancer)帐户里的钱如何取出? -
yw10260609:
我认为在混淆前,最好把相关代码备份一下比较好,不然项目完成后, ...
DotFuscator 小记 -
日月葬花魂:
大哥 能 加我个QQ 交流一下嘛 ?51264722 我Q ...
web应用程序和Web网站区别 -
iaimg:
我想问下嵌入delphi写的程序总是出现窗体后面感觉有个主窗体 ...
C#自定义控件:WinForm将其它应用程序窗体嵌入自己内部 -
iaimg:
代码地址下不了啊!
C#自定义控件:WinForm将其它应用程序窗体嵌入自己内部
C#封装的Socket用法基本上不算很复杂,只是不知道托管之后的Socket有没有其他性能或者安全上的问题。
在C#里面能找到的最底层的操作也就是socket了,概念不做解释。
程序模型如下:
WinForm程序 : 启动端口侦听;监视Socket联接情况;定期关闭不活动的联接;
Listener:处理Socket的Accept函数,侦听新链接,建立新Thread来处理这些联接(Connection)。
Connection:处理具体的每一个联接的会话。
1:WinForm如何启动一个新的线程来启动Listener:
//start the server
private void btn_startServer_Click(object sender, EventArgs e)
{
//this.btn_startServer.Enabled = false;
Thread _createServer = new Thread(new ThreadStart(WaitForConnect));
_createServer.Start();
}
//wait all connections
private void WaitForConnect()
{
SocketListener listener = new SocketListener(Convert.ToInt32(this.txt_port.Text));
listener.StartListening();
}
因为侦听联接是一个循环等待的函数,所以不可能在WinForm的线程里面直接执行,不然Winform也就是无法继续任何操作了,所以才指定一个新的线程来执行这个函数,启动侦听循环。
这一个新的线程是比较简单的,基本上没有启动的参数,直接指定处理函数就可以了。
2:Listener如何启动循环侦听,并且启动新的带有参数的线程来处理Socket联接会话。
先看如何建立侦听:(StartListening函数)
IPEndPoint localEndPoint = new IPEndPoint(_ipAddress, _port);
// Create a TCP/IP socket.
Socket listener = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);
// Bind the socket to the local endpoint and listen for incoming connections.
try
{
listener.Bind(localEndPoint);
listener.Listen(20);//20 trucks
// Start listening for connections.
while (true)
{
// here will be suspended while waiting for a new connection.
Socket connection = listener.Accept();
Logger.Log("Connect", connection.RemoteEndPoint.ToString());//log it, new connection
……
}
}……
基本步骤比较简单:
建立本机的IPEndPoint对象,表示以本机为服务器,在指定端口侦听;
然后绑定到一个侦听Socket上;
进入while循环,等待新的联接;
如果有新的联接,那么建立新的socket来对应这个联接的会话。
值得注意的就是这一句联接代码:listener.Accept()。执行这一句的时候,程序就在这个地方等待,直到有新的联检请求的时候程序才会执行下一句。这是同步执行,当然也可以异步执行。
新的联接Socket建立了(Accept之后),对于这些新的socket该怎么办呢?他们依然是一个循环等待,所以依然需要建立新的Thread给这些Socket去处理会话(接收/发送消息),而这个Thread就要接收参数了。
Thread本身是不能接收参数的,为了让它可以接收参数,可以采用定义新类,添加参数作为属性的方法来解决。
因为每一个Socket是一个Connection周期,所以我定义了这么一个类public class Connection。这个类至少有这样一个构造函数public Connection(Socket socket); 之所以这么做,就是为了把Socket参数传给这个Connection对象,然后好让Listener启动这个Thread的时候,Thread可以知道他正在处理哪一个Socket。
具体处理的方法:(在Listener的StartListening函数,ocket connection = listener.Accept();之后)
Connection gpsCn = new Connection(connection);
//each socket will be wait for data. keep the connection.
Thread thread = new Thread(new ThreadStart(gpsCn.WaitForSendData));
thread.Name = connection.RemoteEndPoint.ToString();
thread.Start();
如此一来,这个新的socket在Accept之后就在新的Thread中运行了。
3:Connection的会话处理
建立了新的Connection(也就是socket),远程就可以和这个socket进行会话了,无非就是send和receive。
现在先看看怎么写的这个线程运行的Connection. WaitForSendData函数
while (true)
{
bytes = new byte[1024];
string data = "";
//systm will be waiting the msg of receive envet. like Accept();
//here will be suspended while waiting for socket income msg.
int bytesRec = this._connection.Receive(bytes);
_lastConnectTime = DateTime.Now;
if (bytesRec == 0)//close envent
{
Logger.Log("Close Connection", _connection.RemoteEndPoint.ToString());
break;
}
data += Encoding.ASCII.GetString(bytes, 0, bytesRec);
//…….handle your data.
}
可以看到这个处理的基本步骤如下:
执行Receive函数,接收远程socket发送的信息;
把信息从字节转换到string;
处理该信息,然后进入下一个循环,继续等待socket发送新的信息。
值得注意的有几个:
1:Receive函数。这个函数和Listener的Accept函数类似。在这个地方等待执行,如果没有新的消息,这个函数就不会执行下一句,一直等待。
2:接收的是字节流,需要转化成字符串
3:判断远程关闭联接的方式
4:如果对方的消息非常大,还得循环接收这个data。
4:如何管理这些联接(thread)
通过上边的程序,基本上可以建立一个侦听,并且处理联接会话。但是如何管理这些thread呢?不然大量产生thread可是一个灾难。
管理的方法比较简单,在Listener里面我定义了一个静态的哈希表(static public Hashtable Connections=new Hashtable();),存储Connection实例和它对应的Thread实例。而connection中也加入了一个最后联接时间的定义(private DateTime _lastConnectTime;)。在新链接建立的时候(Listener的Accept()之后)就把Connection实例和Thread实例存到哈希表中;在Connection的Receive的时候修改最后联接时间。这样我们就可以知道该Connection在哪里,并且会话是否活跃。
然后在Winform程序里头可以管理这些会话了,设置设置超时。
发表评论
-
where T:new() 是什么意思
2014-04-18 09:26 1446where T:new() 是什么意思 经常看到方法后面 ... -
为何在wpf中textbox的值有时不会实时的变化
2013-11-03 19:31 1392TextBox绑定view model 中的一个属性,如果T ... -
好久没写blog了
2012-05-21 18:43 2好久没写blog了 -
使用MySQL命令行修改密码
2011-07-27 20:37 1049使用MySQL命令行修改密码 下面为您额极少的My ... -
更改lnmp安装后的MySQL密码方法
2011-07-27 20:36 1419更改lnmp安装后的MySQL密码方法 2011-07- ... -
mysql-bin.000001文件的来源及处理方法[转]
2011-07-27 20:31 1305mysql-bin.000001文件的来 ... -
lnmp vps下mysql备份
2011-07-27 20:31 1031mysql-bin.000001文件的来 ... -
N点虚拟主机管理系统安装图解
2011-07-25 00:13 1828<script type="text/j ... -
CentOS 6.0正式版终于发布
2011-07-24 10:29 1588CentOS 6.0新在什么地方 ... -
关系数据库还是NoSQL数据库
2011-07-22 16:35 938关系数据库还是NoSQL数据库 作者 孙立 发布于 2 ... -
关系数据库还是NoSQL数据库
2011-07-22 16:31 1071关系数据库还是NoSQL数据库 作者 孙立 发布于 2 ... -
NoSQL开篇——为什么要使用NoSQL
2011-07-22 16:26 1038NoSQL开篇——为什么要使用NoSQL 作者 孙立 发布 ... -
HubbleDotNet开源全文搜索数据库项目--技术详解
2011-07-21 17:49 1164HubbleDotNet开源全文搜索数据库项目--技术 ... -
细说 Form (表单)
2011-07-21 12:27 1243细说 Form (表单) Form(表单)对于每 ... -
ASP.NET(C#)常用数据加密和解密方法汇总
2011-07-21 12:26 1352应同事所邀把ASP.NET(C#)常用数据加密和解密方法 ... -
ds
2011-07-21 09:44 998blog%5Borigin%5D=0&blog%5Bc ... -
ds
2011-07-21 09:42 955请输入文章内容dsafas -
test
2011-07-21 09:31 898testestestestestestestestestest ... -
判断两个数组中是否存在相同的数字
2010-06-17 09:03 2157判断两个数组中是否存在相同的数字 给定两个排好序的数 ... -
用C#读取XML文档
2010-04-06 09:15 1560本文将以一个非常简单 ...
相关推荐
c#与PLC通过SocketTcp通讯代码.仅通讯部分,不包含协议解析
C#是一种广泛用于构建桌面和Web应用的编程语言,它提供了强大的Socket类库来处理TCP和UDP通信。本篇文章将深入探讨如何使用C# 2010开发一个Socket测试工具,包括TCP和UDP报文的发送与接收,以及端口的测试。 首先,...
这个"C# 网络编程之socket tcp 通讯demo样例"可能涵盖了这些基本操作,为初学者提供了理解TCP通信机制的起点。通过阅读和理解代码,你可以了解到如何在C#中建立和管理TCP连接,以及如何进行数据的收发。对于进一步的...
在.NET框架中,C#语言提供了丰富的库支持网络通信,其中Socket类是TCP/IP协议的基础。本示例将深入解析"C# Socket tcp 最简单例子源码",帮助你理解如何在C#中实现TCP(传输控制协议)客户端和服务端的通信。 首先...
在C#中,`System.Net.Sockets.Socket` 类是我们实现TCP通信的核心工具。创建一个Socket对象,设置其地址族(如IPv4或IPv6)、套接字类型(如Stream表示TCP)和协议类型(如Tcp)。然后,我们可以通过`Connect()`方法...
在.NET框架中,C#语言提供了丰富的库支持网络通信,其中Socket类是核心部分,用于实现TCP/IP协议栈中的各种网络通信。本示例将详细讲解如何使用C#的Socket类进行TCP通信。 TCP(Transmission Control Protocol)是...
c#基于socket TCP协议的长连接命令框架。使用该框架后,可以不用关心具体的网络通信,直接继承命令基类实现即可,具体的使用方法见源码中的demo。...既是c#socket通信学习的好例子,又可以使用在实际的项目当中。
在C#编程中,利用.NET框架提供的Socket类,我们可以方便地实现TCP通信。然而,在某些场景下,如传输大块数据时,可能会遇到分包传送的问题。本篇将深入探讨C#中如何处理TCP Socket的分包传送数据。 首先,TCP协议...
在.NET框架中,C#提供了强大的Socket支持,使得开发者能够方便地实现TCP和UDP协议的客户端和服务器程序。本篇将详细介绍"C# 同步Socket TCP/UDP 封装类"的相关知识点。 一、Socket基础 Socket,也被称为套接字,是...
很好的一个关于C# socket通信的一个框架,这个是我朋友写的,我想肯定能够给你带来惊喜!
本篇文章将深入探讨如何在C#中使用Socket类来实现TCP数据的发送和接收。 TCP(Transmission Control Protocol)是一种面向连接的、可靠的传输协议,它确保了数据包的顺序传输和错误校验。在C#中,Socket类是.NET ...
本篇文章将深入探讨C#中的TCP和UDP两种socket通信方式,并结合"SeverTest"这一项目名称,我们来详细讨论如何在C#中实现这两种协议的服务器端功能。 首先,TCP(Transmission Control Protocol)是一种面向连接的、...
Socket编程在IT行业中是网络通信的基础,特别是在C#这样的编程语言中,Socket是实现TCP通讯的重要工具。本示例提供了一个完整的C# Socket通讯/TCP通讯的代码demo,旨在帮助开发者理解和应用网络通信技术。 首先,...
1. **Socket类**:这是C#中TCP通信的基础,它提供了创建和管理TCP连接的方法。Socket类提供了发送和接收数据的API,如Send和Receive。 2. **IP地址与端口号**:每个Socket都需要一个IP地址和一个端口号来标识其在...
在IT行业中,网络通信是至关重要的一个领域,而TCP(Transmission Control Protocol)Socket编程则是实现这一目标的关键技术。本文将详细讲解如何使用C#语言来实现TCP Socket,涵盖客户端和服务端的创建,以及如何...
在C#中,我们可以使用System.Net.Sockets命名空间中的Socket类来创建TCP客户端和服务器。通过建立连接、发送和接收数据,我们可以实现对TCP通信的全面测试。 接着,UDP(User Datagram Protocol,用户数据报协议)...
在TCP中处理粘包的关键是添加一种机制来区分不同的数据包。一种常见的方法是在每个数据包前添加一个“长度头”,这个长度头包含了接下来的数据包的字节数。这样,接收端在接收到数据后,可以通过读取长度头来知道接...
在C#中,Socket编程主要用于网络通信,包括TCP和UDP。Socket类位于`System.Net.Sockets`命名空间下,提供了创建、配置和控制网络套接字的功能。对于UDP通信,Socket类提供了必要的方法和属性来实现数据的发送和接收...
标题中的“c#基于socket 服务器端TCP程序”指的是使用C#语言编写的一套服务器应用程序,它利用了Socket类库来处理TCP(传输控制协议)连接。TCP是一种面向连接的、可靠的、基于字节流的传输层通信协议,广泛用于...
标题中的"C# Socket Tcp文件传输和文字聊天系统"是指使用C#编程语言,基于Socket和TCP协议实现的一个功能,它涵盖了文件传输和文字聊天两大功能。Socket是网络通信中的一个基本概念,它允许两个网络应用进行数据交换...