110,535
社区成员
发帖
与我相关
我的任务
分享
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);
}
}
就是上面两个方法,自己再稍微改下下就达到目的了。[quote=引用 20 楼 Backspace110 的回复:] 网上搜了点资料,libuv好像有类似的解决方法,就是把要发送的信息插入到发送队列里,不过还有个问题就是这样怎么发送到指定客户端? 异步还是太难了,我想我可能要换个更简单的网络编程模型了.反正对性能要求不高.
网上搜了点资料,libuv好像有类似的解决方法,就是把要发送的信息插入到发送队列里,不过还有个问题就是这样怎么发送到指定客户端? 异步还是太难了,我想我可能要换个更简单的网络编程模型了.反正对性能要求不高.
[quote=引用 8 楼 Backspace110 的回复:] 确实我就是卡在这里,要event露出来,就要把socket也传出来,初步想法是直接传SocketAsyncEventArgs。这样的缺点就是事件里面能够修改的东西太多了,不过我想不到其他好方法了。 还有, 这个代码好像只支持客户端发送数据之后服务器回复一条数据,这种一来一回的方式,服务器怎么主动发送数据到客户端呢?
老师,我又看了一下,这段例程里的mutex只是在start中WaitOne,在stop中ReleaseMutex,这样对服务器的整个异步流程是没有影响的啊?而且mutex是静态的,只有当重新new一个服务器start的时候才会有影响吧?看样子mutex的目的只是为了防止多实例同时start。 [quote=引用 13 楼 Backspace110 的回复:] [quote=引用 11 楼 sp1234 的回复:] 可能你觉得这个开源代码写的比较“工整”所以觉得它“还不错”吧。这个代码我简单看了一下,是非常差的,好的异步程序在其基本框架代码中根本不出现什么 AutoResetEvent、WaitOne、Set 代码!
老师,我又看了一下,这段例程里的mutex只是在start中WaitOne,在stop中ReleaseMutex,这样对服务器的整个异步流程是没有影响的啊?而且mutex是静态的,只有当重新new一个服务器start的时候才会有影响吧?看样子mutex的目的只是为了防止多实例同时start。 [quote=引用 11 楼 sp1234 的回复:] 可能你觉得这个开源代码写的比较“工整”所以觉得它“还不错”吧。这个代码我简单看了一下,是非常差的,好的异步程序在其基本框架代码中根本不出现什么 AutoResetEvent、WaitOne、Set 代码!
老师,我又看了一下,这段例程里的mutex只是在start中WaitOne,在stop中ReleaseMutex,这样对服务器的整个异步流程是没有影响的啊?而且mutex是静态的,只有当重新new一个服务器start的时候才会有影响吧?看样子mutex的目的只是为了防止多实例同时start。 可能你觉得这个开源代码写的比较“工整”所以觉得它“还不错”吧。这个代码我简单看了一下,是非常差的,好的异步程序在其基本框架代码中根本不出现什么 AutoResetEvent、WaitOne、Set 代码!
那实际网络编程中,是怎么解决这个服务器反馈设计不通用的问题的?
确实我就是卡在这里,要event露出来,就要把socket也传出来,初步想法是直接传SocketAsyncEventArgs。这样的缺点就是事件里面能够修改的东西太多了,不过我想不到其他好方法了。 还有, 这个代码好像只支持客户端发送数据之后服务器回复一条数据,这种一来一回的方式,服务器怎么主动发送数据到客户端呢?
可能你觉得这个开源代码写的比较“工整”所以觉得它“还不错”吧。这个代码我简单看了一下,是非常差的,好的异步程序在其基本框架代码中根本不出现什么 AutoResetEvent、WaitOne、Set 代码!
可能你觉得这个开源代码写的比较“工整”所以觉得它“还不错”吧。这个代码我简单看了一下,是非常差的,好的异步程序在其基本框架代码中根本不出现什么 AutoResetEvent、WaitOne、Set 代码!
可能你觉得这个开源代码写的比较“工整”所以觉得它“还不错”吧。这个代码我简单看了一下,是非常差的,好的异步程序在其基本框架代码中根本不出现什么 AutoResetEvent、WaitOne、Set 代码!
楼主不喜欢自己研究啊,不过拿来主义前提是要理解啊。 那写代码都是应用的例子,写的也挺全的,但它并不是那种给你接口的写好的库。 SocketAsyncEventArgs是基于IOCP就是完成端口的包装,性能确实不错,而且被微软包装好后比c++下自己写应该方便很多。但必须理解它的工作原理,否则会被绕晕。 拿来后多看看,然后查相关资料,理解后根据需要照着改,不是很难。
代码太长懒得看,我自己的理解啊 通讯编程里面,服务器的反馈设计比较不具备通用性,也许你这个项目中,客户端连接上服务器后就需要服务器马上发送一个欢迎反馈,也许你另外一个项目中,客户端要发送特定的内容后,服务器才需要反馈 这个跟你整个项目的通讯逻辑有管理 至于event的问题,我倒是觉得event是可以放出来的,只不过因为socket传输说到底还是二进制的传输,所以解包和封包的逻辑都可以分离出来,只不过event传出来的接收内容都是byte[]了。
你看错了吧 是3个方法. 1`客户端连接. 2`客户端发送数据过来. 3`客户端断开 因为tcp/ip 其实也就3个 对于"开发者"来说有用.. 所以只有这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();
就足够了完成任何东西了..什么wifi模块上位机 聊天服务器 如果你懂得websocket协议 一样适用.. 你这代码有点少吧.public static bool HaveCon(SocketAsyncEventArgs ar) public static void BeginRecV2(byte[] data, SocketAsyncEventArgs ar) public static void BeginClose(SocketAsyncEventArgs ar)
又稍微看了下你的代码,这个是iocp的模型,也就是完全端口,对网络套接字的利用率比较高,目前基本上这个也就是最效率的用法了,这个没问题 另外补充下,如果你的服务器想在receive之后,触发一个event,那么数据传出了服务器的逻辑代码,在外面来了,那么这个数据要如何处理,要何时反馈给客户端?有原因的啊,这种异步模型里面,,服务端接收到了一个数据之后,receive的回调函数其实是在一个线程中,那么如果你仅仅只是将数据取出来,不进行反馈,那么你的receive线程就会自动退出了,那么一些相关资源,你就难以获取到了,除非你在event中将这些资源也传输出来,比如客户端对应的socket对象、socketarg等。如果这么直接就传输出来了,那么久面临一个封装的问题,你到底是要封装到什么程度,是想让功能调用者完全看不到socket的操作,还是让调用者也可以使用socket进行调用?
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协议 一样适用..
你这代码有点少吧.