作者andymai (人生只有一次)
看板C_Sharp
标题Re: [问题] 呼叫对象为非同步
时间Mon Aug 20 23:40:59 2012
※ 引述《Abbee (阿比)》之铭言:
: 真不好意思,没受过socket的正规训练,
: 最近在写socket时,
: 遇到了一些问题,
: 我写的是甲server,
: 以下为作业流程
: client 送出查询→甲server再以socket方式送出查询→乙server
: 乙server查到资料後,以socket连入传送→甲server
: 所以甲server这支程式本身是:
: 1. 众多client的.net remoting server(多台)
: 2. 乙server(是多台,但数量不同)的socket client
: 3. 乙server的socket server
: 所以我需要等待乙server回覆结果,
: 再将结果回给client端...
: 但是乙server回覆是随机送回这数台甲server之一,
这个做法不能改吗?
因为随机收到的甲 Server 再送回正确的 甲 Server 是一个多余的流程
不能改的话~也许可以想想怎麽让甲 Server 间的资料共享
让每一台甲 Server 都可以处理
: 所以我在甲server上再加上:
: 4. 甲server同时也是另外几台甲server的server和client
: 这样的话, 若是乙server丢到别台机器的话,
: 我以资料上的编号判断後, 再丢回原机器处理...
: 小妹有以下问题想请教各位:
: 1. 我的甲server和乙server沟通是采用字串, 以字串前4码为讯息长度,
: (这是规定格式)
: 所以我接收socket的方式, 是先读入前4码, 判读後, 再将判读後数字-4,
: 将剩下的讯息再读入, 之後再回到读入前4码动作重覆继续...
: 请问这样是否会有什麽问题?
该不会是用 Json 吧? 这可能会有 Json 转换效率的问题
如果一定要用字串传的话~可能封包会很大~转换成正确资料也有转换上的效率问题
: 2. client端想作成同步的效果, 那我是否要在.net remoting的method内,
: 在作完送出socket动作後, 要不断跑回圈等待结果呢?
: 我是打算以讯息编号作dictionary, 记下从乙server回来的讯息,
: 在回圈内去查该dictionary是否有该编号的资料, 有的话取出处理,
: 并在取出同时删除该dictionary内的该笔资料~
: 请问有没有更好的建议呢? 总觉得跑回圈好像不太好...
client 不能改吗?就是 client 送出封包到甲 Server 後
甲 Server 记住该 client 连接资讯~这样就不用跑回圈~让一条 thread 耗在那边
client 端只要弄个正在进行的字或图就好了
等甲 Server 处理完後~再送回正确的 client 让它进行下去就好了
-----------------这段应该可以略过???------------------------------------
推文中您回应的"厂商把封包都写在db"~乙 Server 是厂商吧?
其实我很不解为什麽要这样做?不是应该直接把封包都送给甲 Server 就好了?
如果不能改~那就要想办法弄个 lock
让同一时间只有一台甲 Server 去处理 db 里的封包
------------------------------------------------------------------------
不好意思~刚刚反覆看了好几遍~总算应该是看懂了? XD
简单来讲~ client 根本没真的送出封包~而是透过写入 db 的方式去模拟?
真是开了我的眼界了...
其实要这样搞应该也不是不行~只是一定要在 db 模拟出一个 queue
就是让 client 写入要送的封包
弄个 stored procedure 让同一时间只有一台甲 Server 读到第一笔後
就删除该封包资料
处理完後在 db 的另一个 table 写入可让 client 查到结果的资料
但是除非 db 有主动通知 client 的功能
不然似乎免除不了 client 一直跑回圈去连 db 查结果
毕竟这不是真的可以互相连接的封包...
--
※ 发信站: 批踢踢实业坊(ptt.cc)
◆ From: 1.173.236.75
※ 编辑: andymai 来自: 1.173.236.75 (08/20 23:49)
※ 编辑: andymai 来自: 1.173.236.75 (08/21 00:16)