ServerSocket能否主动发消息

奔雷手 2012-10-20 05:47:02
ServerSocket ,ClientSocket
一台PC连接多个终端,但是前提是PC需要发消息到终端。
本是想PC作为 服务端 ,终端作为客户端,PC发送消息过去,终端会自动返回数据。
目前看到的资料均是 必须 由 客户端先发送消息到 服务端,服务端然后保存相关信息,然后再往客户端发送数据.

现在要求的是 客户端不首先发起通信,服务端根据数据库中保存的IP地址以及PORT 给每个客户端 轮询发送数据,客户端 返回数据。这个如何实现?
(也想过PC作为客户端,终端作为服务端,但是这样PC上不能够很好的反映当前所有终端的连接状况)
...全文
1076 16 打赏 收藏 转发到动态 举报
写回复
用AI写文章
16 条回复
切换为时间正序
请发表友善的回复…
发表回复
heyuhang2004 2013-03-20
  • 打赏
  • 举报
回复
建一个按钮: var i : integer; begin for i:=0 to ServerSocket1.Socket.ActiveConnections-1 do begin ServerSocket1.Socket.Connections[i].SendText('Hellow'); end; end;
haitao 2012-11-10
  • 打赏
  • 举报
回复
想服务器主动连接到客户端? 如果客户端位于防火墙后面,就不行了。。。。 即使是udp协议,也是需要服务器知道防火墙后的客户端的外部ip和端口号
lyhoo163 2012-11-10
  • 打赏
  • 举报
回复
Socket是COM模式,新的XE3的DateSnap好像是RESTful模式,支持回叫机制。
shuihan20e 2012-11-07
  • 打赏
  • 举报
回复
引用 8 楼 lch0422 的回复:
引用 7 楼 的回复: 你说一下你的具体需求,说不定我可以帮到你。 PC发送指令到 终端,终端接收到指令才会返回数据到PC(会自动返回数据),即PC不发送指令的话 终端不会返回数据。 我的想法是把 PC作为SERVER端,每个终端作为 CLIENT端。 PC,终端 的IP/PORT都已知。 看到的资料都是:TCP SOCKET通信 必须先是 CLIENT端 发起,然后SERVER端……
所谓服务器端,客户端都是相对的,你的这种想就变成了PC变成了客户端而已,有什么区别呢,只不过是CLIENT端来监听SERVER端而已,你可以考虑用UDP方式,广播
wylton 2012-10-25
  • 打赏
  • 举报
回复
同意10楼意见.

你想让pc机和终端机谁连接谁? 意思是你跟众多朋友通电话,谁先打给谁?你先打给他们,还是他们先打给你?
谁先谁是客户端.

一建立连接,不管谁是服务端,谁是客户端,都可以自由发送信息的.
kaikai_kk 2012-10-23
  • 打赏
  • 举报
回复
[Quote=引用 8 楼 的回复:]
引用 7 楼 的回复:
...

现在的情况是 把PC端当作 SERVER端,终端(CLIENT端) 不先发起 通信,即 在SERVER端没有获取到 SOCKET 信息 套接字 的情况下,SERVER端怎么发送消息到 CLIETN???
[/Quote]

Client一定要先与Server连接,既然有连接,就一定能获得socket;
你是想让Server去连接Client? 那岂不是搞反了,客户端变成服务嚣了
highbit 2012-10-23
  • 打赏
  • 举报
回复
[Quote=引用 8 楼 的回复:]
引用 7 楼 的回复:

你说一下你的具体需求,说不定我可以帮到你。

PC发送指令到 终端,终端接收到指令才会返回数据到PC(会自动返回数据),即PC不发送指令的话 终端不会返回数据。
我的想法是把 PC作为SERVER端,每个终端作为 CLIENT端。 PC,终端 的IP/PORT都已知。
看到的资料都是:TCP SOCKET通信 必须先是 CLIENT端 发起,然后SERVER端……
[/Quote]

你的需求有点类似聊天程序,其实PC端既是Server,也是Client,同样终端也是。
大致思路如下:
1.终端登录Server,Server保存Client的IP和Port等信息。
2.终端定时试连PC端,报告连接状态.
3.PC端定时检测终端连接状态.
4.PC端可以作为端主动发起与终端的通讯.
具体问题可以QQ讨论,我的QQ号:993515286
微积分g 2012-10-23
  • 打赏
  • 举报
回复
按你的思路,还是使用PC做客户端,终端做服务端算了,想在PC中全部显示所有终端的情况及统计,可以在一个程序中使用多个ClientSocket分别去连接每个终端嘛
kaikai_kk 2012-10-22
  • 打赏
  • 举报
回复
ServerSocket、ClientSocket是有连接的,即双方是一直保存持连接的
所以在客户端连接时(ServerSocket的onClientConnect事件),服务端用一个TList把客户端的Socket保存下来

服务端向客户端发消息时就用此Socket,Socket中已经有IP和PORT了
所以数据库中保存的IP地址以及PORT,其实是用不到的
shuihan20e 2012-10-22
  • 打赏
  • 举报
回复
你可以知道每个客户端的IP,但是端口这个不是确定的,除非你强制要求每个客户端必须用某个端口来连接服务器端

客户端不一定非要向服务器端发消息,但是必须要连接上服务器端才行
fang 2012-10-22
  • 打赏
  • 举报
回复
也就是你的PC做客户端用,主动向你的终端发起连接及请求,在你的PC端维护你所要管理的终端列表逐个发起连接及响应终端处理就可以了。
奔雷手 2012-10-22
  • 打赏
  • 举报
回复
[Quote=引用 7 楼 的回复:]

你说一下你的具体需求,说不定我可以帮到你。
[/Quote]
PC发送指令到 终端,终端接收到指令才会返回数据到PC(会自动返回数据),即PC不发送指令的话 终端不会返回数据。
我的想法是把 PC作为SERVER端,每个终端作为 CLIENT端。 PC,终端 的IP/PORT都已知。
看到的资料都是:TCP SOCKET通信 必须先是 CLIENT端 发起,然后SERVER端接收到消息后保存SOCKET之后 才会给CLIENT端返回消息。
现在的情况是 把PC端当作 SERVER端,终端(CLIENT端) 不先发起 通信,即 在SERVER端没有获取到 SOCKET 信息 套接字 的情况下,SERVER端怎么发送消息到 CLIETN???
highbit 2012-10-22
  • 打赏
  • 举报
回复
你说一下你的具体需求,说不定我可以帮到你。
奔雷手 2012-10-20
  • 打赏
  • 举报
回复
[Quote=引用 1 楼 的回复:]

socket连接建立后服务器端即可发送数据,不需要客户端首先发送数据。
[/Quote]
没有理解我的意思。
我要表达的意思是 SERVER端 CLIENT端 都知道对应的IP,PORT,
但是CLIENT端不先发起通信,也就是说 我把 终端 当客户端,但是通信必须是由SERVER即PC端 发起的,终端只是由PC端发送指令之后才会返回数据。
Geoff08Zhang 2012-10-20
  • 打赏
  • 举报
回复
只要连接建立成功,服务器就可以发送数据.这有很多winsock源码,你可以参考:
http://download.csdn.net/detail/geoff08zhang/4571358
pathletboy 2012-10-20
  • 打赏
  • 举报
回复
socket连接建立后服务器端即可发送数据,不需要客户端首先发送数据。

1,593

社区成员

发帖
与我相关
我的任务
社区描述
Delphi 网络通信/分布式开发
社区管理员
  • 网络通信/分布式开发社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

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