`

C#的socket程序(转)

    博客分类:
  • C#
阅读更多
其实只要用到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 C#socket

    在C#中,Socket类是进行网络编程的基础,允许开发者创建高性能的网络应用程序。下面将详细阐述C# Socket编程的核心概念、TCP连接的建立与关闭过程,以及示例程序中的"TheacherSever"和"StudentApp"可能代表的角色。 ...

    C# Socket连接池

    Socket连接池是网络编程中一个重要的优化手段,它在C#中主要应用于提高网络通信的效率和稳定性。本文将深入探讨“C# Socket连接池”的实现原理、优势以及如何利用线程池技术来构建和优化它。同时,我们也会提及...

    C#Socket高并发_socket_socket并发_c#socket_C#_socket高并发_源码.zip

    本资源“C# Socket高并发_socket_socket并发_c#socket_C#_socket高并发_源码.zip”显然提供了使用C#语言进行Socket高并发编程的示例代码和实践。以下是对这个主题的详细解释: C# Socket编程: C#是微软开发的一种...

    C# socket 通信程序

    本文将深入探讨“C# socket 通信程序”的相关知识点,旨在帮助开发者理解并实现自己的socket通信程序。 首先,让我们了解什么是Socket。Socket,又称为套接字,是操作系统提供的一种进程间通信(IPC)机制,特别是...

    界面良好的c# socket程序

    在这个场景下,我们关注的是一个使用C#语言编写的、具有友好界面的Socket程序,它包括了客户端(client)和服务器端(server)两部分,运行于.NET环境中。下面将详细介绍这个项目中的相关知识点。 首先,C#是一种...

    C# Socket编程完成控制台服务器端和web客户端(调试通过)

    C# Socket 编程是指使用 C# 语言实现的 Socket 编程技术,用于创建网络通信的服务器端和客户端程序。在本例中,我们将创建一个控制台服务器端和一个 web 客户端,使用 Socket 编程技术实现它们之间的通信。 一、C# ...

    C#Socket通信稳定完整版类库实例

    Socket通信在IT行业中是网络编程的基础,特别是在C#这样的多平台开发环境中,Socket通信库的使用至关重要。...通过理解Socket通信的基本原理和C#中的相关类库,开发者可以构建出高效、稳定的服务端和客户端应用程序。

    c# socket设置代理

    Socket是网络编程中的一个抽象概念,它代表了应用程序与网络协议栈之间的接口。在C#中,`System.Net.Sockets`命名空间下的`Socket`类为我们提供了创建、配置和管理网络连接的能力。通过Socket,我们可以实现客户端与...

    c# Socket长连接 短链接 自己封装 通讯

    C#是一种广泛用于构建桌面和Web应用程序的编程语言,它提供了强大的网络编程能力,其中包括Socket通信。Socket是网络通信的基础,允许应用程序通过Internet进行双向通信。 标题“c# Socket长连接 短链接 自己封装 ...

    C# Socket 通信,客户端服务器端

    Socket,也称为套接字,是网络通信中的一个接口,它允许应用程序通过网络发送和接收数据。在C#中,我们可以使用System.Net.Sockets命名空间中的Socket类来创建和操作Socket对象。 服务器端的实现通常涉及以下步骤:...

    c#socket断开重连

    在IT行业中,网络通信是不可或缺的一部分,而C#语言提供了强大的Socket编程接口,...在提供的`c#Socket断开重连.cs`源代码文件中,应包含这些功能的具体实现,读者可以通过阅读和分析代码来深入理解相关概念和技术。

    C# socket封装类和组件含例程全部开源

    在.NET编程环境中,C#语言提供了丰富的库支持网络通信,其中Socket是进行低级网络通信的基本组件。本资源“C# socket封装类和组件含例程全部开源”提供了一套全面且强大的C# Socket封装,旨在简化开发过程,提高代码...

    C# Socket异步通信+事件与委托+通信程序与界面分离

    在C#编程中,Socket是网络通信的基础,它允许应用程序通过网络进行数据交换。本教程主要探讨如何使用C#的Socket实现异步通信,并结合事件和委托来处理通信过程中的消息传递,以及如何将通信逻辑与用户界面(UI)分离,...

    c# socket 传输文件

    在C#编程中,Socket是网络通信的基础组件,它提供了进程间、网络间通信的低级接口。在本文中,我们将深入探讨如何使用C# Socket类进行文件传输,包括文件的发送和接收,以及在此过程中可能遇到的关键技术和注意事项...

    C# socket 转发程序

    C# 编写 异步 转发程序 带日志功能 ,xml 配置

    C#socket 大文件传输 分段传输 C#DEMO

    C#socket 大文件传输 分段传输 C#DEMO

    c# socket与基恩士plc通讯、和扫码枪通讯程序源码

    【亲测实用】c# socket与基恩士plc通讯、和扫码枪通讯程序源码 文件类型:程序源代码 主要功能: 工业通讯,c# socket与基恩士plc通讯、和扫码枪通讯 适合人群:新手及有一定经验的开发人员

    C# socket异步长连接

    本文将深入探讨"C# socket异步长连接"这一主题,包括其概念、工作原理以及如何在实际开发中实现。 首先,我们要理解什么是Socket。Socket是网络通信中的一个接口,它允许应用程序通过TCP/IP协议与另一台计算机进行...

    c# Socket 多线程 分包 发送/接受数据

    在C#中,Socket编程是网络通信的基础,它允许应用程序通过网络进行数据传输。多线程和分包技术则是提高程序并发性和优化数据处理的有效手段。以下是对标题和描述中涉及的知识点的详细解释: 1. **C# Socket**: C#...

    C#Socket聊天程序

    本项目“C# Socket聊天程序”旨在模仿QQ的基本功能,仅支持发送消息,利用了Socket编程进行数据传输。在这里,我们将深入探讨Socket通信的基础知识、C#中的Socket类以及如何构建一个简单的聊天应用程序。 首先,...

Global site tag (gtag.js) - Google Analytics