建立了Socket服务端,服务器数据有变动,想要推送给客户端,如果是C/S模式,使用Socket自然没问题;如果是B/S呢,没有Socket怎么办?
html5支持WebSocket,这是一个不错的改善。
想起没有顺丰、韵达、各种通等之类快递的日子,你以为远方的朋友会给你邮寄包裹——虽然不会有人这样做——然后你就翻山越岭天天去邮局问,“有没有我的包裹啊”,运气好的话,有,你领回去了,运气不好,对不起接着坚持来问吧。于是,跑啊跑啊,累个半死不活。
不过就你自己累,邮局无所谓,反正不用给你送货上门。
但架不住人多啊,更多的像你一样的人有你那样的想法了,跑邮局,人多邮局就出问题了,每天只回答有没有包裹这个问题都忙到嘴没工夫闭上的地步,无法进行日常的发信和拍电报业务了。
于是邮局崩溃了。
这时,快递产生了。
他们负责送货上门。住在城市中的人幸福了,不用跑邮局了。不过住在乡下的人还是郁闷,他们以为快递会平等对待给他们送货上门,也不跑邮局了,可等来等去,等到了一句话:乡下交通不便,恕不配送。。
kao kao kao
html5 WebSocket同样遇到了这样的尴尬。对IE,它只兼容10以及以上的版本(其它浏览器不考虑,IE是大户)。对于6789这些依旧没能淘汰掉的老古董,开发人员只能采用别的方式解决。
有人说Nodejs可以。
不错,确实可以。
不过我想说的是,Nodejs的socket.io应该是判断了浏览器的兼容性之后做出的选择吧?支持web socket的采用websocket,不支持的采用别的方式(跑邮局)?
工作也这么多年了,script一直是我的弱项。。。。
虽然照猫画虎使用nodejs及socket.io写出了同样的功能,但心里总是没底。。。打脸-ing
我说nodejs没别的意思,只是我不会。。。
***********************************************************分割线***********************************************************
之前有看园子里的文章,知道使用Flash的socket可以解决兼容性的问题,但由于flex已经好几年没碰了,就没心思去搞。
使用nodejs处理之后由于底气不足不敢在线上服务器用啊,于是转头copy别人的代码使用flash去解决socket问题,搞来搞去园友的文章不是抄别人的就是给出的flash是只适合自己用的,总也调试不通,干脆自己搞,也就是重拾一下as和flex而已。
不多说废话了(打脸-ing),上代码吧。
***********************************************************分割线***********************************************************
首先,创建Socket服务端,c#代码(我是使用Windows服务作Socket服务端,至于别的方式请自行脑补):
1 using System;
2 using System.Collections.Generic;
3 using System.ComponentModel;
4 using System.Data;
5 using System.Diagnostics;
6 using System.Linq;
7 using System.Net;
8 using System.Net.Sockets;
9 using System.Reflection;
10 using System.ServiceProcess;
11 using System.Text;
12 using log4net;
13
14 namespace YourNameSpace
15 {
16 partial class FlashSocket : ServiceBase
17 {
18 private static readonly ILog Logger = LogManager.GetLogger(MethodBase.GetCurrentMethod().DeclaringType);
19 private static Socket server;
20
21 private static Socket handSocket;
22
23 private static string message = "testset";
24 /// <summary>
25 /// 需要维护的一个Socket Client集合
26 /// </summary>
27 private static List<Socket> Clients = new List<Socket>();
28 public FlashSocket()
29 {
30 InitializeComponent();
31 }
32
33 protected override void OnStart(string[] args)
34 {
35 // TODO: 在此处添加代码以启动服务。
36 CreateSocketServer();
37 System.Timers.Timer tmr = new System.Timers.Timer();
38 tmr.Interval = 1000 * 3;
39 tmr.Elapsed += (sender, e) =>
40 {
41 DoWork();
42 };
43 tmr.Start();
44 }
45
46
47 protected override void OnStop()
48 {
49 // TODO: 在此处添加代码以执行停止服务所需的关闭操作。
50 }
51
52 #region 创建Socket服务端
53
54 private static void CreateSocketServer()
55 {
56 AllowDomain ad = new AllowDomain();
57 server = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);
58 server.Bind(new IPEndPoint(IPAddress.Parse("192.168.5.134"), 2013));
59 server.Listen(int.MaxValue);
60 server.BeginAccept(InsertClientToCollection, server);
61 }
62 #endregion
63
64 #region 有新客户端访问的时候添加进来
65 /// <summary>
66 /// 有新客户端访问的时候添加到客户端集合中
67 /// </summary>
68 /// <param name="ar"></param>
69 private static void InsertClientToCollection(IAsyncResult ar)
70 {
71 try
72 {
73 var socket = ar.AsyncState as Socket;
74 if (socket != null)
75 {
76 Clients.Add(socket.EndAccept(ar));
77 server.BeginAccept(InsertClientToCollection, server);
78 Logger.InfoFormat("新用户连接{0}", socket.LocalEndPoint);
79 }
80 }
81 catch (Exception ex)
82 {
83 Logger.Error(ex);
84 }
85 }
86
87 #endregion
88 #region
89 private void DoWork()
90 {
91 message = DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss") + "