- 浏览: 786766 次
- 性别:
- 来自: 大连
文章分类
- 全部博客 (417)
- ASP.NET MVC (18)
- WEB基础 (24)
- 数据库 (69)
- iPhone (20)
- JQuery (3)
- Android (21)
- UML (8)
- C# (32)
- 移动技术 (19)
- 条码/RFID (6)
- MAC (8)
- VSS/SVN (6)
- 开卷有益 (4)
- 应用软件 (1)
- 软件工程 (1)
- java/Eclipse/tomcat (61)
- 英语学习 (2)
- 综合 (16)
- SharePoint (7)
- linux (42)
- Solaris/Unix (38)
- weblogic (12)
- c/c++ (42)
- 云 (1)
- sqlite (1)
- FTp (2)
- 项目管理 (2)
- webservice (1)
- apache (4)
- javascript (3)
- Spring/Struts/Mybatis/Hibernate (4)
- 航空业务 (1)
- 测试 (6)
- BPM (1)
最新评论
-
dashengkeji:
1a64f39292ebf4b4bed41d9d6b21ee7 ...
使用POI生成Excel文件,可以自动调整excel列宽等(转) -
zi_wu_xian:
PageOffice操作excel也可以设置表格的行高列宽,并 ...
使用POI生成Excel文件,可以自动调整excel列宽等(转) -
wanggang0321:
亲,我在pptx(office2007以上版本)转pdf的时候 ...
JODConverter]word转pdf心得分享(转) -
xiejanee:
楼主:你好!我想请问下 你在代码中用DOMDocument* ...
Xerces-C++学习之——查询修改XML文档 (转)
其实只要用到Socket联接,基本上就得使用Thread,是交叉使用的。
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程序里头可以管理这些会话了,设置设置超时。
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程序里头可以管理这些会话了,设置设置超时。
发表评论
-
invoke
2013-03-15 15:53 0object Object.Invoke(Delegate ... -
JQuery的WebServices调用
2013-03-14 14:12 0http://blog.sina.com.cn/s/blog_ ... -
c# list和string
2012-10-26 15:16 978C# List和String互相转换 (2011-06- ... -
.net mysql-connector-net
2012-10-19 11:10 1011引用DLL引用 mysql-connector-net包中的M ... -
c# 操作mysql
2012-10-19 10:21 931using System;using System.Confi ... -
c# DataTable.copy .clone
2012-10-17 18:17 4129C# DataTable.Copy()和.Clone()的使用 ... -
C#中避免相同MDI子窗口重复打开的方法(转)
2012-10-17 13:40 1147方法一: 直接检测 ... -
C# 中使用JSON - DataContractJsonSerializer
2012-10-11 14:47 690http://www.cnblogs.com/coderzh/ ... -
.NET WHERE子句用途
2012-05-04 14:52 1522where 子句用于指定类型约束,这些约束可以作为泛型声明 ... -
c#泛型
2012-05-04 14:51 1061http://hjf1223.cnblogs.com/arch ... -
汉字转换成拼音的类(转)
2012-02-27 16:41 63844引用地址: http://blog.csdn.net/huig ... -
ASP.NET内置对象(转)
2011-12-08 13:53 3152http://www.cnblogs. ... -
asp.net webservice
2011-12-04 15:22 1839asp.net webservice 概述与 ... -
iis发布asp.net网站(转)
2011-11-23 10:32 3357iis发布asp.net 网站 ... -
win7 里配置iis 和asp.net步骤,及发布asp.net网站全程(转)
2011-11-23 10:15 5505分享 win7 里配置 iis 和a ... -
类似Windows Search的文件搜索系统
2011-11-23 09:42 1316转自:http://www.cnblogs.com/wu ... -
操作PDF文档功能的相关开源项目探索—iTextSharp 和PDFBox
2011-11-23 09:40 1975转自www.th7.cn第七城市 操作 PDF 文档功 ... -
pdf
2011-12-10 13:28 1180http://www.cnblogs.com/q1490722 ... -
iis asp.net安装顺序
2011-11-17 13:47 946如果先安装IIS再安装 .Net Framework。一切OK ... -
IIS配置
2011-11-17 13:18 820http://bbs.51cto.com/thread-488 ...
相关推荐
在C#中,Socket类是进行网络编程的基础,允许开发者创建高性能的网络应用程序。下面将详细阐述C# Socket编程的核心概念、TCP连接的建立与关闭过程,以及示例程序中的"TheacherSever"和"StudentApp"可能代表的角色。 ...
Socket连接池是网络编程中一个重要的优化手段,它在C#中主要应用于提高网络通信的效率和稳定性。本文将深入探讨“C# Socket连接池”的实现原理、优势以及如何利用线程池技术来构建和优化它。同时,我们也会提及...
本资源“C# Socket高并发_socket_socket并发_c#socket_C#_socket高并发_源码.zip”显然提供了使用C#语言进行Socket高并发编程的示例代码和实践。以下是对这个主题的详细解释: C# Socket编程: C#是微软开发的一种...
本文将深入探讨“C# socket 通信程序”的相关知识点,旨在帮助开发者理解并实现自己的socket通信程序。 首先,让我们了解什么是Socket。Socket,又称为套接字,是操作系统提供的一种进程间通信(IPC)机制,特别是...
在这个场景下,我们关注的是一个使用C#语言编写的、具有友好界面的Socket程序,它包括了客户端(client)和服务器端(server)两部分,运行于.NET环境中。下面将详细介绍这个项目中的相关知识点。 首先,C#是一种...
C# Socket 编程是指使用 C# 语言实现的 Socket 编程技术,用于创建网络通信的服务器端和客户端程序。在本例中,我们将创建一个控制台服务器端和一个 web 客户端,使用 Socket 编程技术实现它们之间的通信。 一、C# ...
Socket通信在IT行业中是网络编程的基础,特别是在C#这样的多平台开发环境中,Socket通信库的使用至关重要。...通过理解Socket通信的基本原理和C#中的相关类库,开发者可以构建出高效、稳定的服务端和客户端应用程序。
Socket是网络编程中的一个抽象概念,它代表了应用程序与网络协议栈之间的接口。在C#中,`System.Net.Sockets`命名空间下的`Socket`类为我们提供了创建、配置和管理网络连接的能力。通过Socket,我们可以实现客户端与...
C#是一种广泛用于构建桌面和Web应用程序的编程语言,它提供了强大的网络编程能力,其中包括Socket通信。Socket是网络通信的基础,允许应用程序通过Internet进行双向通信。 标题“c# Socket长连接 短链接 自己封装 ...
Socket,也称为套接字,是网络通信中的一个接口,它允许应用程序通过网络发送和接收数据。在C#中,我们可以使用System.Net.Sockets命名空间中的Socket类来创建和操作Socket对象。 服务器端的实现通常涉及以下步骤:...
在IT行业中,网络通信是不可或缺的一部分,而C#语言提供了强大的Socket编程接口,...在提供的`c#Socket断开重连.cs`源代码文件中,应包含这些功能的具体实现,读者可以通过阅读和分析代码来深入理解相关概念和技术。
在.NET编程环境中,C#语言提供了丰富的库支持网络通信,其中Socket是进行低级网络通信的基本组件。本资源“C# socket封装类和组件含例程全部开源”提供了一套全面且强大的C# Socket封装,旨在简化开发过程,提高代码...
在C#编程中,Socket是网络通信的基础,它允许应用程序通过网络进行数据交换。本教程主要探讨如何使用C#的Socket实现异步通信,并结合事件和委托来处理通信过程中的消息传递,以及如何将通信逻辑与用户界面(UI)分离,...
在C#编程中,Socket是网络通信的基础组件,它提供了进程间、网络间通信的低级接口。在本文中,我们将深入探讨如何使用C# Socket类进行文件传输,包括文件的发送和接收,以及在此过程中可能遇到的关键技术和注意事项...
C# 编写 异步 转发程序 带日志功能 ,xml 配置
C#socket 大文件传输 分段传输 C#DEMO
【亲测实用】c# socket与基恩士plc通讯、和扫码枪通讯程序源码 文件类型:程序源代码 主要功能: 工业通讯,c# socket与基恩士plc通讯、和扫码枪通讯 适合人群:新手及有一定经验的开发人员
本文将深入探讨"C# socket异步长连接"这一主题,包括其概念、工作原理以及如何在实际开发中实现。 首先,我们要理解什么是Socket。Socket是网络通信中的一个接口,它允许应用程序通过TCP/IP协议与另一台计算机进行...
在C#中,Socket编程是网络通信的基础,它允许应用程序通过网络进行数据传输。多线程和分包技术则是提高程序并发性和优化数据处理的有效手段。以下是对标题和描述中涉及的知识点的详细解释: 1. **C# Socket**: C#...
本项目“C# Socket聊天程序”旨在模仿QQ的基本功能,仅支持发送消息,利用了Socket编程进行数据传输。在这里,我们将深入探讨Socket通信的基础知识、C#中的Socket类以及如何构建一个简单的聊天应用程序。 首先,...