[求助][C#]Socket服务器的的代码为什么一般只公开start和stop方法,事件呢?

e1ki0lp 2017-05-27 01:29:33
最近要写一个服务器,用来和工业设备通讯,我这面是服务器,就在网上找了找服务器的代码。
找来找去看到MSDN的SocketAsyncEventArgs里面的例程不错,不过不是很全,
就去CodeProject找了两份完整版的:
https://www.codeproject.com/Articles/22918/How-To-Use-the-SocketAsyncEventArgs-Class
https://www.codeproject.com/Articles/83102/C-SocketAsyncEventArgs-High-Performance-So客户端cket-Cod
不过问题随之而来,这两份 例程里面的服务器都只有 start和stop两个公开方法,(或者多一个init的初始化方法)。我看服务器好像都这样。
C#的事件编程怎么去和它结合起来用?比如服务器start之后,如何实现客户端连线就触发accept事件,读结束就触发received事件,还有怎么向客户端主动send数据?为什么C#的服务器编程不把event加进去呢,难道是有什么弊端,还是我不会用?
刚接触网络编程实践,希望大家指导一下。
二楼是一段CodeProject上的例程,按照原文的说法是高性能服务器。
...全文
364 25 打赏 收藏 转发到动态 举报
写回复
用AI写文章
25 条回复
切换为时间正序
请发表友善的回复…
发表回复
e1ki0lp 2017-09-02
  • 打赏
  • 举报
回复
引用 3 楼 diaodiaop 的回复:
你看错了吧 是3个方法. 1`客户端连接. 2`客户端发送数据过来. 3`客户端断开 因为tcp/ip 其实也就3个 对于"开发者"来说有用.. 所以只有这3个 我觉得最好的了. 比如我的代码里

            var server = new SuperSocket.Server(port, MaxCon, MaxSize);
            server.Connection = new SuperSocket.BeginConnection(HaveCon);
            server.Receive = new SuperSocket.BeginReceive(BeginRecV2);
            server.Close = new SuperSocket.BeginClose(BeginClose);
            server.Start();
然后有3个事件

 public static bool HaveCon(SocketAsyncEventArgs ar)
 public static void BeginRecV2(byte[] data, SocketAsyncEventArgs ar)
 public static void BeginClose(SocketAsyncEventArgs ar)
就足够了完成任何东西了..什么wifi模块上位机 聊天服务器 如果你懂得websocket协议 一样适用.. 你这代码有点少吧.
谢谢,我终于写出来了,其实之前我也认为你的思路是对的,而且后来我实现的也是3个事件1个Send,就是写的很丑,在服务器里面维护一个客户端列表。 后来看了https://github.com/statianzo/Fleck一个C#写的websocket的代码 关键在于它的服务器Start(Action<> action),在这个地方传一个委托作为参数。 我借鉴它的设计模式改写之后的版本https://git.oschina.net/e1ki0lp/TcpServer 突然感觉找到了最佳实践。。。
e1ki0lp 2017-06-07
  • 打赏
  • 举报
回复
感谢3楼 diaodiaop. websocket确实是适合用来做我目前的应用情景的. 能保持长连接,服务器与客户端全双工通信.服务器既可以主动发送数据给客户端,客户端也可以主动发送数据到服务器. 服务器可以回复也可以不回复,双方一旦建立连接,就可以任意时刻互相发送数据. 和websocket不同的就是,我的应用情景需要"裸socket",就是说把websocket的那一套协议协商的数据头去掉. websocket有一些自己的数据头,主要是web相关,会添加到数据的头部.因为我不需要数据头,所以具体的协议我也没有去深入了解, 我只需要websocket的这一套流程,看了看Fleck库的源码,基本上了解了怎么去实现这个功能. 另外使用SocketAsyncEventArgs实现全双工,需要两个SocketAsyncEventArgs对象,一个用来异步发,一个用来异步收. 而不是有些人所说的两个socket对象. Socket网络编程确实是值得去学一下的.谢谢大家.
ownding 2017-06-03
  • 打赏
  • 举报
回复
引用 18 楼 Backspace110 的回复:
引用 17 楼 ownding 的回复:
[quote=引用 13 楼 Backspace110 的回复:] [quote=引用 11 楼 sp1234 的回复:] 可能你觉得这个开源代码写的比较“工整”所以觉得它“还不错”吧。这个代码我简单看了一下,是非常差的,好的异步程序在其基本框架代码中根本不出现什么 AutoResetEvent、WaitOne、Set 代码!
老师,我又看了一下,这段例程里的mutex只是在start中WaitOne,在stop中ReleaseMutex,这样对服务器的整个异步流程是没有影响的啊?而且mutex是静态的,只有当重新new一个服务器start的时候才会有影响吧?看样子mutex的目的只是为了防止多实例同时start。
WaitOne会带来一些问题的,主要是Semaphore。比如使用SocketAsyncEventArgs编写的服务器,使用Semaphore限制客户端的链接数,那么会带来一些问题。例如,服务端设置最大链接数为2,那么实际上可以连接3个客户端进来,但是程序会只显示有2个客户端连接,这时候将连接的两个客户端关掉,那么后面的客户端连接就会自动连入到服务端,到这里一切工作的都很好。但是如果我们先将后面等待连接的第三个客户端关掉呢,这时候问题就来了,之后再连入服务端,程序是不会有反应的,也就是没有办法再连入服务端了。 上面两个的CodeProject的程序都存在这样的问题。你可以去掉Semaphore限制连接数,那这样就没有刚才的问题了。 想使用SocketAsyncEventArgs自定义收发消息,可以参考我给你的示例。[/quote]你的程序并没有解决你说的问题.最大连接数设为2,一下连接3个客户端,实际上可以连接2个,关掉任意一个已经连上的客户端,之后无论如何操作就只能连接上1个客户端.另外你这个在多个客户端的连接的情况下,会向所有客户端都发送信息.[/quote] 取消掉最大连接数限制就没有上面的问题了啊。 至于该程序是向所有客户端发送的信息,自己稍微修改下就可以了,所有连人服务端的链接都保存在socketDic里。你只要知道特定客户端的IP,就可以参照向所有客户端发送信息的方法向特定客户端发送信息啊。
public void sendfromsocket(string data)
        {
            lock (socketDic)
            {
                foreach (KeyValuePair<string, Socket> kvp in socketDic)
                {
                    if (kvp.Value.Connected)
                    {
                        Console.WriteLine("sending data to IP:{0}.", kvp.Key);
                        Send2client(kvp.Value, data);
                    }
                }
            }
        }

        private  void Send2client(Socket server, string data)
        {
            byte[] msg = Encoding.UTF8.GetBytes(data);
            byte[] bytes = new byte[256];
            try
            {
                // send
                int byteCount = server.Send(msg, SocketFlags.None);
                Console.WriteLine("Sent {0} bytes.IP:{1}", byteCount, server.RemoteEndPoint.ToString());
            }
            catch (SocketException e)
            {
                Console.WriteLine("{0} Error code: {1}.", e.Message, e.ErrorCode);
            }
        }
就是上面两个方法,自己再稍微改下下就达到目的了。
e1ki0lp 2017-06-02
  • 打赏
  • 举报
回复
引用 21 楼 jy251 的回复:
[quote=引用 20 楼 Backspace110 的回复:] 网上搜了点资料,libuv好像有类似的解决方法,就是把要发送的信息插入到发送队列里,不过还有个问题就是这样怎么发送到指定客户端? 异步还是太难了,我想我可能要换个更简单的网络编程模型了.反正对性能要求不高.
首先,你要搞清楚,服务器发送的socket对象是什么,那个socket并不是服务器用于监听的socket,而是监听socket在监听之后创建的一个临时的应对客户端的socket对象。也就是说如果你的一个客户端连接,在accpet之后创建的一个线程中没有继续用下去了,那么你应该要释放掉这个临时socket。根据你的模型里面的方法来看,这个临时socket从accpet中被创建后一直传递到了receive里面,那么如果receive的异步函数中没有使用临时socket来发送数据,那么间隔了socket的超时时间,这个临时socket就不能用了。 也就是说,服务器端的反馈不可能做到随时反馈,因为上面说的原因之外,还有一个原因,客户端那边也不可能一直等待,要超时的。 而一般情况下,你看到的一个网络通讯连接保持时间非常长,有的人用的是心跳包,有的人是断开重连,只是在你看来是一个不中断的通讯连接罢了。 再来说说发送队列,这个必须有个前提,那就是服务器必须有一个与每一个客户端对应的临时socket列表维护工作,而且这个队列的发送只能通过这个临时socket来发送到客户端,当然了,我说的是流式socket,udp请无视。因为如果服务器没有维护客户端的临时socket的话,你服务器端要通过什么socket发送数据?发送给谁?除非你在客户端也写了一个监听,用于监听服务端的临时连接。 [/quote]其实accept之后就保存了接收到的socket, receive里的socket是他自己的,不是临时的,在第70和74行存在UseToken里.socket维护队列是我一开始就采用的方法,不过这个队列维护起来会很麻烦.主要还是应用情景奇葩.我现在考虑一个服务器只连一个客户端,然后有几个客户端就建几个服务器,对方是工业设备,直接操作socket发送裸数据的那种,无非就是他给我个启动信号,我过一段时间给他个坐标数据,非常规应用情景就不要用常规手段去解决了.
jy251 2017-06-02
  • 打赏
  • 举报
回复
引用 20 楼 Backspace110 的回复:
网上搜了点资料,libuv好像有类似的解决方法,就是把要发送的信息插入到发送队列里,不过还有个问题就是这样怎么发送到指定客户端? 异步还是太难了,我想我可能要换个更简单的网络编程模型了.反正对性能要求不高.
首先,你要搞清楚,服务器发送的socket对象是什么,那个socket并不是服务器用于监听的socket,而是监听socket在监听之后创建的一个临时的应对客户端的socket对象。也就是说如果你的一个客户端连接,在accpet之后创建的一个线程中没有继续用下去了,那么你应该要释放掉这个临时socket。根据你的模型里面的方法来看,这个临时socket从accpet中被创建后一直传递到了receive里面,那么如果receive的异步函数中没有使用临时socket来发送数据,那么间隔了socket的超时时间,这个临时socket就不能用了。 也就是说,服务器端的反馈不可能做到随时反馈,因为上面说的原因之外,还有一个原因,客户端那边也不可能一直等待,要超时的。 而一般情况下,你看到的一个网络通讯连接保持时间非常长,有的人用的是心跳包,有的人是断开重连,只是在你看来是一个不中断的通讯连接罢了。 再来说说发送队列,这个必须有个前提,那就是服务器必须有一个与每一个客户端对应的临时socket列表维护工作,而且这个队列的发送只能通过这个临时socket来发送到客户端,当然了,我说的是流式socket,udp请无视。因为如果服务器没有维护客户端的临时socket的话,你服务器端要通过什么socket发送数据?发送给谁?除非你在客户端也写了一个监听,用于监听服务端的临时连接。
e1ki0lp 2017-06-02
  • 打赏
  • 举报
回复
引用 15 楼 jy251 的回复:
[quote=引用 8 楼 Backspace110 的回复:] 确实我就是卡在这里,要event露出来,就要把socket也传出来,初步想法是直接传SocketAsyncEventArgs。这样的缺点就是事件里面能够修改的东西太多了,不过我想不到其他好方法了。 还有, 这个代码好像只支持客户端发送数据之后服务器回复一条数据,这种一来一回的方式,服务器怎么主动发送数据到客户端呢?
这样啊,你可以用委托和匿名函数,将send之类的功能性函数给封装起来,比如: Action<string> send = msg = > { socket.send(msg); } 这样封装的话,那么你就可以把这个委托给传递到外面去了,外面只能看到一个action的句柄,看不到你的socketarg了 你还可以用这个方法封装很多的函数提供出去,然后用一个自定义类型把这个函数作为成员展现出来[/quote] 我搜到的好多例程都是echo形式的服务器,客户端请求--服务器发送这种,如果客户端不发,就没办法触发用于发送的回调函数, 我现在改成了 只能异步接收的服务器,但是要把服务器发送插入到这个异步接收的流程中就很困难了, 网上搜了点资料,libuv好像有类似的解决方法,就是把要发送的信息插入到发送队列里,不过还有个问题就是这样怎么发送到指定客户端? 异步还是太难了,我想我可能要换个更简单的网络编程模型了.反正对性能要求不高.
e1ki0lp 2017-06-02
  • 打赏
  • 举报
回复
引用 18 楼 Backspace110 的回复:
引用 17 楼 ownding 的回复:
[quote=引用 13 楼 Backspace110 的回复:] [quote=引用 11 楼 sp1234 的回复:] 可能你觉得这个开源代码写的比较“工整”所以觉得它“还不错”吧。这个代码我简单看了一下,是非常差的,好的异步程序在其基本框架代码中根本不出现什么 AutoResetEvent、WaitOne、Set 代码!
老师,我又看了一下,这段例程里的mutex只是在start中WaitOne,在stop中ReleaseMutex,这样对服务器的整个异步流程是没有影响的啊?而且mutex是静态的,只有当重新new一个服务器start的时候才会有影响吧?看样子mutex的目的只是为了防止多实例同时start。
WaitOne会带来一些问题的,主要是Semaphore。比如使用SocketAsyncEventArgs编写的服务器,使用Semaphore限制客户端的链接数,那么会带来一些问题。例如,服务端设置最大链接数为2,那么实际上可以连接3个客户端进来,但是程序会只显示有2个客户端连接,这时候将连接的两个客户端关掉,那么后面的客户端连接就会自动连入到服务端,到这里一切工作的都很好。但是如果我们先将后面等待连接的第三个客户端关掉呢,这时候问题就来了,之后再连入服务端,程序是不会有反应的,也就是没有办法再连入服务端了。 上面两个的CodeProject的程序都存在这样的问题。你可以去掉Semaphore限制连接数,那这样就没有刚才的问题了。 想使用SocketAsyncEventArgs自定义收发消息,可以参考我给你的示例。[/quote]你的程序并没有解决你说的问题.最大连接数设为2,一下连接3个客户端,实际上可以连接2个,关掉任意一个已经连上的客户端,之后无论如何操作就只能连接上1个客户端.另外你这个在多个客户端的连接的情况下,会向所有客户端都发送信息.[/quote]不过,感谢你关于Semaphore部分的讲解.网络编程确实是挺困难的,我在考虑换个简单点的模型.其实对性能要求也不高,一上来就用windows下的异步网络模型,可能不太合适.
e1ki0lp 2017-06-02
  • 打赏
  • 举报
回复
引用 17 楼 ownding 的回复:
引用 13 楼 Backspace110 的回复:
[quote=引用 11 楼 sp1234 的回复:] 可能你觉得这个开源代码写的比较“工整”所以觉得它“还不错”吧。这个代码我简单看了一下,是非常差的,好的异步程序在其基本框架代码中根本不出现什么 AutoResetEvent、WaitOne、Set 代码!
老师,我又看了一下,这段例程里的mutex只是在start中WaitOne,在stop中ReleaseMutex,这样对服务器的整个异步流程是没有影响的啊?而且mutex是静态的,只有当重新new一个服务器start的时候才会有影响吧?看样子mutex的目的只是为了防止多实例同时start。
WaitOne会带来一些问题的,主要是Semaphore。比如使用SocketAsyncEventArgs编写的服务器,使用Semaphore限制客户端的链接数,那么会带来一些问题。例如,服务端设置最大链接数为2,那么实际上可以连接3个客户端进来,但是程序会只显示有2个客户端连接,这时候将连接的两个客户端关掉,那么后面的客户端连接就会自动连入到服务端,到这里一切工作的都很好。但是如果我们先将后面等待连接的第三个客户端关掉呢,这时候问题就来了,之后再连入服务端,程序是不会有反应的,也就是没有办法再连入服务端了。 上面两个的CodeProject的程序都存在这样的问题。你可以去掉Semaphore限制连接数,那这样就没有刚才的问题了。 想使用SocketAsyncEventArgs自定义收发消息,可以参考我给你的示例。[/quote]你的程序并没有解决你说的问题.最大连接数设为2,一下连接3个客户端,实际上可以连接2个,关掉任意一个已经连上的客户端,之后无论如何操作就只能连接上1个客户端.另外你这个在多个客户端的连接的情况下,会向所有客户端都发送信息.
ownding 2017-06-01
  • 打赏
  • 举报
回复
引用 13 楼 Backspace110 的回复:
引用 11 楼 sp1234 的回复:
可能你觉得这个开源代码写的比较“工整”所以觉得它“还不错”吧。这个代码我简单看了一下,是非常差的,好的异步程序在其基本框架代码中根本不出现什么 AutoResetEvent、WaitOne、Set 代码!
老师,我又看了一下,这段例程里的mutex只是在start中WaitOne,在stop中ReleaseMutex,这样对服务器的整个异步流程是没有影响的啊?而且mutex是静态的,只有当重新new一个服务器start的时候才会有影响吧?看样子mutex的目的只是为了防止多实例同时start。
WaitOne会带来一些问题的,主要是Semaphore。比如使用SocketAsyncEventArgs编写的服务器,使用Semaphore限制客户端的链接数,那么会带来一些问题。例如,服务端设置最大链接数为2,那么实际上可以连接3个客户端进来,但是程序会只显示有2个客户端连接,这时候将连接的两个客户端关掉,那么后面的客户端连接就会自动连入到服务端,到这里一切工作的都很好。但是如果我们先将后面等待连接的第三个客户端关掉呢,这时候问题就来了,之后再连入服务端,程序是不会有反应的,也就是没有办法再连入服务端了。 上面两个的CodeProject的程序都存在这样的问题。你可以去掉Semaphore限制连接数,那这样就没有刚才的问题了。 想使用SocketAsyncEventArgs自定义收发消息,可以参考我给你的示例。
jy251 2017-05-31
  • 打赏
  • 举报
回复
引用 9 楼 Backspace110 的回复:
那实际网络编程中,是怎么解决这个服务器反馈设计不通用的问题的?
既然是不通用,那么就没办法封装成通用模块,也就是说这部分的代码逻辑跟业务设计扣的太紧了,只能每个不同工程重新写,当然了,功能性小函数你倒是可以封装起来
jy251 2017-05-31
  • 打赏
  • 举报
回复
引用 8 楼 Backspace110 的回复:
确实我就是卡在这里,要event露出来,就要把socket也传出来,初步想法是直接传SocketAsyncEventArgs。这样的缺点就是事件里面能够修改的东西太多了,不过我想不到其他好方法了。 还有, 这个代码好像只支持客户端发送数据之后服务器回复一条数据,这种一来一回的方式,服务器怎么主动发送数据到客户端呢?
这样啊,你可以用委托和匿名函数,将send之类的功能性函数给封装起来,比如: Action<string> send = msg = > { socket.send(msg); } 这样封装的话,那么你就可以把这个委托给传递到外面去了,外面只能看到一个action的句柄,看不到你的socketarg了 你还可以用这个方法封装很多的函数提供出去,然后用一个自定义类型把这个函数作为成员展现出来
jy251 2017-05-31
  • 打赏
  • 举报
回复
引用 11 楼 sp1234 的回复:
可能你觉得这个开源代码写的比较“工整”所以觉得它“还不错”吧。这个代码我简单看了一下,是非常差的,好的异步程序在其基本框架代码中根本不出现什么 AutoResetEvent、WaitOne、Set 代码!
没看懂,如果没有这些信号量,怎么控制多线程啊。。。
e1ki0lp 2017-05-28
  • 打赏
  • 举报
回复
引用 11 楼 sp1234 的回复:
可能你觉得这个开源代码写的比较“工整”所以觉得它“还不错”吧。这个代码我简单看了一下,是非常差的,好的异步程序在其基本框架代码中根本不出现什么 AutoResetEvent、WaitOne、Set 代码!
老师,我又看了一下,这段例程里的mutex只是在start中WaitOne,在stop中ReleaseMutex,这样对服务器的整个异步流程是没有影响的啊?而且mutex是静态的,只有当重新new一个服务器start的时候才会有影响吧?看样子mutex的目的只是为了防止多实例同时start。
e1ki0lp 2017-05-28
  • 打赏
  • 举报
回复
引用 11 楼 sp1234 的回复:
可能你觉得这个开源代码写的比较“工整”所以觉得它“还不错”吧。这个代码我简单看了一下,是非常差的,好的异步程序在其基本框架代码中根本不出现什么 AutoResetEvent、WaitOne、Set 代码!
就是这样的。虽然工整的不一定好,但是好的一般都工整,C#异步服务器我只找到这两个工整的。,老师有什么相关的网络资料吗?
  • 打赏
  • 举报
回复
可能你觉得这个开源代码写的比较“工整”所以觉得它“还不错”吧。这个代码我简单看了一下,是非常差的,好的异步程序在其基本框架代码中根本不出现什么 AutoResetEvent、WaitOne、Set 代码!
e1ki0lp 2017-05-27
  • 打赏
  • 举报
回复
引用 2 楼 xuggzu 的回复:
楼主不喜欢自己研究啊,不过拿来主义前提是要理解啊。 那写代码都是应用的例子,写的也挺全的,但它并不是那种给你接口的写好的库。 SocketAsyncEventArgs是基于IOCP就是完成端口的包装,性能确实不错,而且被微软包装好后比c++下自己写应该方便很多。但必须理解它的工作原理,否则会被绕晕。 拿来后多看看,然后查相关资料,理解后根据需要照着改,不是很难。
IOPC一直没怎么理解透彻,也没在网上找到像样的例程,感觉无从下手,微软这两个算是我看着比较顺眼的。我就是想把这个和C#的事件机制结合起来,连接,接收,断开都暴露一个事件,不过“ 服务器主动发送”就不知道如何去实现了。
e1ki0lp 2017-05-27
  • 打赏
  • 举报
回复
引用 5 楼 jy251 的回复:
代码太长懒得看,我自己的理解啊 通讯编程里面,服务器的反馈设计比较不具备通用性,也许你这个项目中,客户端连接上服务器后就需要服务器马上发送一个欢迎反馈,也许你另外一个项目中,客户端要发送特定的内容后,服务器才需要反馈 这个跟你整个项目的通讯逻辑有管理 至于event的问题,我倒是觉得event是可以放出来的,只不过因为socket传输说到底还是二进制的传输,所以解包和封包的逻辑都可以分离出来,只不过event传出来的接收内容都是byte[]了。
那实际网络编程中,是怎么解决这个服务器反馈设计不通用的问题的?
引用 3 楼 diaodiaop 的回复:
你看错了吧 是3个方法. 1`客户端连接. 2`客户端发送数据过来. 3`客户端断开 因为tcp/ip 其实也就3个 对于"开发者"来说有用.. 所以只有这3个 我觉得最好的了. 比如我的代码里

            var server = new SuperSocket.Server(port, MaxCon, MaxSize);
            server.Connection = new SuperSocket.BeginConnection(HaveCon);
            server.Receive = new SuperSocket.BeginReceive(BeginRecV2);
            server.Close = new SuperSocket.BeginClose(BeginClose);
            server.Start();
然后有3个事件

 public static bool HaveCon(SocketAsyncEventArgs ar)
 public static void BeginRecV2(byte[] data, SocketAsyncEventArgs ar)
 public static void BeginClose(SocketAsyncEventArgs ar)
就足够了完成任何东西了..什么wifi模块上位机 聊天服务器 如果你懂得websocket协议 一样适用.. 你这代码有点少吧.
发帖有字数限制,链接里有全部代码,我只贴了核心部分。其实无非就是SocketAsyncEventArgsPool类和Token类没贴,在就没了,本身就是很少。
e1ki0lp 2017-05-27
  • 打赏
  • 举报
回复
引用 6 楼 jy251 的回复:
又稍微看了下你的代码,这个是iocp的模型,也就是完全端口,对网络套接字的利用率比较高,目前基本上这个也就是最效率的用法了,这个没问题 另外补充下,如果你的服务器想在receive之后,触发一个event,那么数据传出了服务器的逻辑代码,在外面来了,那么这个数据要如何处理,要何时反馈给客户端?有原因的啊,这种异步模型里面,,服务端接收到了一个数据之后,receive的回调函数其实是在一个线程中,那么如果你仅仅只是将数据取出来,不进行反馈,那么你的receive线程就会自动退出了,那么一些相关资源,你就难以获取到了,除非你在event中将这些资源也传输出来,比如客户端对应的socket对象、socketarg等。如果这么直接就传输出来了,那么久面临一个封装的问题,你到底是要封装到什么程度,是想让功能调用者完全看不到socket的操作,还是让调用者也可以使用socket进行调用?
确实我就是卡在这里,要event露出来,就要把socket也传出来,初步想法是直接传SocketAsyncEventArgs。这样的缺点就是事件里面能够修改的东西太多了,不过我想不到其他好方法了。 还有, 这个代码好像只支持客户端发送数据之后服务器回复一条数据,这种一来一回的方式,服务器怎么主动发送数据到客户端呢?
by_封爱 版主 2017-05-27
  • 打赏
  • 举报
回复
你看错了吧 是3个方法. 1`客户端连接. 2`客户端发送数据过来. 3`客户端断开 因为tcp/ip 其实也就3个 对于"开发者"来说有用.. 所以只有这3个 我觉得最好的了. 比如我的代码里

            var server = new SuperSocket.Server(port, MaxCon, MaxSize);
            server.Connection = new SuperSocket.BeginConnection(HaveCon);
            server.Receive = new SuperSocket.BeginReceive(BeginRecV2);
            server.Close = new SuperSocket.BeginClose(BeginClose);
            server.Start();
然后有3个事件

 public static bool HaveCon(SocketAsyncEventArgs ar)
 public static void BeginRecV2(byte[] data, SocketAsyncEventArgs ar)
 public static void BeginClose(SocketAsyncEventArgs ar)
就足够了完成任何东西了..什么wifi模块上位机 聊天服务器 如果你懂得websocket协议 一样适用.. 你这代码有点少吧.
ownding 2017-05-27
  • 打赏
  • 举报
回复
[quote=引用 4 楼 ownding 的回复:] 可以看这个示例:https://github.com/OwnDing/Blank_TCP_APP 上面的示例是基于CodeProject第二个链接https://www.codeproject.com/Articles/83102/C-SocketAsyncEventArgs-High-Performance-So客户端cket-Cod 的SocketAsyncEventArgs代码修改。 跳过了CodeProject里提到的程序收到信息就把信息发回客户端的步骤,可以自己随意发送信息到客户端。并且在程序的界面上显示连入客户端的IP和端口信息。
加载更多回复(5)

110,535

社区成员

发帖
与我相关
我的任务
社区描述
.NET技术 C#
社区管理员
  • C#
  • Web++
  • by_封爱
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

让您成为最强悍的C#开发者

试试用AI创作助手写篇文章吧