亲爱的朋友们,久违了!这段时间我们像暂时停靠的列车,默默积蓄能量只为此刻的重新启程。
最近在干嘛,其实从重庆回来以后我一直在研究传奇的引擎,我记得很早很早之前就有粉丝朋友建议我录制,只是我那时候都不知道什么是传奇引擎。现在虽然知道了什么是引擎,但是我也仅仅是对里面的代码比较感兴趣,所以就有了这篇文章
聊到传奇引擎,有一个网络控件(JSocket),我相信做的传奇的多多少少都听过这个控件。我之前的文章里面也有关于网络的介绍,只是都是基于 Windows 的系统环境自己编写的,自己编写的代码总会或多或少存在一些问题,同时辅助工作也不会像开源库那样做的那么到位
介绍
所以我就开启了 Delphi 网络库的搜寻之路,一共有两个要求
开源,之所以要求是开源,因为我不想使用和谐版
依然在更新,这一点其实很重要,只有一直更新的库才有使用的必要。
根据以上两点我搜到了 delphi-cross-socket 和 DIOCP-V5 两个库,那为什么选择使用 delphi-cross-socket 呢,原因是里面有注释、同时代码比较规范,同时这个库也有缺点,就是说可能只是一个底板,更多的功能需要自己去实现,例如:重连、心跳。优点我就不说了,大家有兴趣的话自己去 GitHub 看就可以了,最后贴上 GitHub 地址:
https://github.com/winddriver/Delphi-Cross-Socket
这篇文章说一个事情,虽然官方带有案例,只是我觉得那些案例不太适合我,所以这篇文章算是 delphi-cross-socket 这个库的一个快速入门
中间我也在犹豫到底是用 cross 还是 v5,直到直播的时候遇到一个朋友说他经过压力测试,这两个库相差无几
当然还有一个问题,就是 cross 对于低版本的 Delphi 不支持,尤其是不支持泛型操作的版本,而 DIOCP-V5 则恰恰相反
客户端
需要注意的是 cross 的客户端和服务器使用都是 TCrossSocket 类
ounter(lineounter(lineounter(lineounter(lineounter(lineounter(lineounter(lineounter(lineounter(lineounter(lineounter(lineounter(lineounter(lineounter(lineounter(lineounter(lineounter(lineounter(lineounter(lineounter(lineounter(lineounter(lineounter(lineounter(lineounter(lineounter(lineounter(lineounter(lineounter(lineounter(lineounter(lineounter(lineounter(line//初始化procedure TForm1.FormCreate(Sender: TObject);begin FSocket := TCrossSocket.Create(0);//建立连接,该事件发生的函数必须是类中的函数 FSocket.OnConnected := OnConnected;//读取数据 FSocket.OnReceived := OnReceived;//发送数据 FSocket.OnSent := OnSend;end;//连接服务器procedure TForm2.Button1Click(Sender: TObject);begin FSocket.Connect('127.0.0.1', 10086,procedure (const Connection: ICrossConnection; const Success: Boolean)begin TThread.Queue(nil, // 同步到主线程 procedure begin if Success then begin Memo1.Lines.Add('连接成功'); end else begin Memo1.Lines.Add('连接失');
end; end );
end
);
end;
像 OnSend 这样的函数都是自己定义的,但是在等号左边的不是自己定义的,至于自己定义的函数对应的参数,像下面这样,当然也可以点进去看
ounter(lineounter(lineprocedure TForm1.OnConnected(const Sender: TObject; const AConnection: ICrossConnection);
服务器端
初始化和客户端一样,所以这里就省略掉了
ounter(lineounter(lineounter(lineounter(lineounter(lineounter(lineounter(lineounter(lineounter(lineounter(lineounter(lineounter(lineounter(lineounter(lineounter(lineounter(lineounter(lineounter(lineounter(lineounter(line//启动监听procedure TForm1.Button1Click(Sender: TObject);begin //启动侦听 ,Listen(IP,端口号,侦听的结果的回调过程) FSocket.Listen('127.0.0.1', 10086, procedure(const AListen: ICrossListen; const ASuccess: Boolean) begin TThread.Queue(nil, procedure begin if ASuccess then //%s 代表的是字符串,%d 代表的是数字 Memo1.Lines.Add(Format('侦听成功,服务器启动的 IP:%s,端口号:%d', ['127.0.0.1', 10086])) else Memo1.Lines.Add('侦听失败'); end);
end);endend;
结语
到此一个最简化的 delphi-cross-socket 入门程序就算结束了,不知道各位看明白没有
你有什么看法?评论区等你