Socket的多线程问题
1.如果有多个ClientSocket连接到一个ServerSocket上
如何得到连接的ClientSocket的个数
2。怎样利用ClientSocket和ServerSocket编写多线程程序
如:
现有多个ClientSocket连接到一个ServerSocket上
现在要对每个连接建立一个线程分别响应客户请求,应怎么写
问题点数:100、回复次数:52Top
1 楼aimin(天剑)回复于 2000-12-04 23:09:00 得分 50
1.在serversocket的OnThreadStart、OnThreadEnd事件设个计数器即可。
2.将你要提供的服务写成一个线程程序,OnGetTread时生成一个线程即可。
我做过一个例子,没在手边,如果需要给我发mail.Top
2 楼zwz()回复于 2000-12-05 07:57:00 得分 0
我也需要!Top
3 楼vfrog(小蛙)回复于 2000-12-05 08:33:00 得分 0
aimin:
我也需要这个例子。多谢。另外,有一事不明,用DELPHI中的控件SERVERSOCKET和ClientSocket创建连接时,特别慢是什么原因?包括DELPHI自带的例子CHAT。
EMAIL: vfrog@sina.com.cnTop
4 楼BCB(天下三分明月夜,二分无赖是扬州)回复于 2000-12-05 09:33:00 得分 20
TServerSocket.ServerType的值为stNonBlocking(缺省值)时,
只有一个缺省线程,不会产生其它线程,编程简单,
可以同时传送数据,互不干扰:
1.个数:ServerSocket1.Socket.ActiveConnections;
2.每响应一个连接:
ServerSocket1.Socket.Connections数组就会多一项;
这个数组类型是TCustomWinSocket [ ];
ServerSocket1有很多事件:
OnAccept(Socket: )
OnClientConnect (Socket: )
OnClientRead(Socket: )等
都有一个Socket类型的参数,通过此Socket参数就可
区分是哪一个客户发来的,互不干扰;例如:
TForm1.ServerSocket1ClientWrite(Sender:TObject Sender,
Socket:TCustomWinSocket)
Socket.RemoteAddress 发送客户的IP地址
Socket.RemoteHost 发送客户的地址别名
Top
5 楼WorldCreater(造化天尊)回复于 2000-12-05 12:39:00 得分 0
to aimin :
my email: primary@email.com.cn
thank you!
看到你的回答时:我已在 OnGetSocket和 OnGetThread事件里
创建了线程。不知道对不对。我甚至不知道在 TServerClientThread
里怎么接收和发送数据。让你见笑了
另外:得到连接的ClientSocket的个数,ServerSocket它自己没有一个计数器吗
Top
6 楼WorldCreater(造化天尊)回复于 2000-12-05 12:50:00 得分 0
能不能说说下载软件的
Socket 连接的过程
为了表示我的谢意,我给这个帖子加50分Top
7 楼BCB(天下三分明月夜,二分无赖是扬州)回复于 2000-12-05 13:51:00 得分 0
我看了你们的贴子和其它贴子,
弄不懂你们为什么提到Socket就想到用多线程?
同步方式才需要多线程,
缺省方式是异步方式,不需要是多线程啊。
请同行指点迷津!!!
Top
8 楼zwz()回复于 2000-12-05 14:11:00 得分 0
to aimin:
如果你有一个有关socket的多线程的例子,请给我发一份。谢谢!
Email:zhangwz@tonghua.com.cnTop
9 楼wx_zhang()回复于 2000-12-05 14:20:00 得分 0
to aimin:
mail to me , wx_zhang365@sina.com, thanks Top
10 楼aimin(天剑)回复于 2000-12-05 15:14:00 得分 0
我的例子已经测试完的,在delphi 5.0 下,马上发给各位,serversocket必须设成阻塞方式。
mail已经发送成功了,没收到的EMAIL通知我。Top
11 楼aimin(天剑)回复于 2000-12-05 15:21:00 得分 0
to:BCB
试想不用多线程的话,每个客户端连接的状态你都要保存,而且不同的情况还要判断,进行不同的处理(比如说:SMTP服务器和POP3服务器),累不累?采用多线程的话,每个线程处理的都是一个完整的会话,简便多了。这好象聊天,一个人对一个人轻松又清楚,一个人对100个人,七嘴八舌的,得把他累死!!^-^Top
12 楼WorldCreater(造化天尊)回复于 2000-12-05 19:33:00 得分 0
我好象会读写了,不知道对不对:
读:ClientSocket, ServerSocket
读或写客户端(read or send to client):
TWinSocketStream *pStream = new TWinSocketStream(ClientSocket, 60000);
pStream->read
pStream->write
Top
13 楼WorldCreater(造化天尊)回复于 2000-12-05 19:40:00 得分 0
to: aimin
设成阻塞方式的 是什么意义的 多线程( 对不起,我还没看 )
对每次 OnReadClient 事件读出的数据产生一个线程处理么?
应该是一个客户端一个线程(我的理解)Top
14 楼WorldCreater(造化天尊)回复于 2000-12-05 20:04:00 得分 0
有人告诉我连接个数可由
ServerSocket1.Socket.ActiveConnections
得到(我在大富翁论坛的提问 www.delphibbs.com/delphibbs )
Top
15 楼aimin(天剑)回复于 2000-12-05 22:41:00 得分 0
to: WorldCreater
Socket是流操作,阻塞方式(ThreadBlocking)实际上相当于一种分时处理,别人不用时你用。可以采用多线程的方法“模拟”实现多个连接。
我的例子中实际也是采用ServerSocket1.Socket.ActiveConnections获得连接个数,当然也可以象我上面说的,设计数器来统计线程的数量。
你的读、写方式好象不太对,太麻烦了吧!
看完我的程序后有问题可以讨论。Top
16 楼WorldCreater(造化天尊)回复于 2000-12-06 22:30:00 得分 0
暂时我手边没有 Delphi 不能看代码
不知建立的连接能不能交互的
即: Client 发一个消息给 Server 后
等待 Server 做出一个回答,然后再发一个消息 .......
直到 Client 发消息后才拆除连接 或 Client 断开连接后,
Server 才拆除连接
Top
17 楼aimin(天剑)回复于 2000-12-07 00:22:00 得分 0
当然可以,不知你看我的例子了没有,你可以自已定通信协议!!Top
18 楼WorldCreater(造化天尊)回复于 2000-12-07 10:07:00 得分 0
能不能说说
我手边实在没有Delphi
只有 C++ build
只能用写字板看
麻烦你了Top
19 楼airhorse(编程至尊宝)回复于 2000-12-07 20:54:00 得分 0
TServerSocket 控件 只是一个,简单的 inprise 帮你写好的侦听线程。要作出一个处理多个客户连接的 Server。早着呢?
1、有线程池
2、消息处理
3、线程同步机制
好几个月的工作量
Top
20 楼WorldCreater(造化天尊)回复于 2000-12-07 22:18:00 得分 0
to aimin:
我看了你的程序,好象只是客户端向服务器端发出一个消息后
服务器作出一个线程响应。客户端没有在接收到数据后
再向服务器发消息,要求响应
procedure TForm1.ClientSocket1Read(Sender: TObject;
Socket: TCustomWinSocket);
var
buffer:array [0..900] of char;
i,j:integer;
s1:string;
begin
i:=socket.ReceiveLength;
Socket.ReceiveBuf (Buffer, i);
s1:='';
for j:=1 to i do s1:=s1+buffer[j];
showmessage('Read: '+s1);
end;
我曾在这个过程里,接收到数据后
Socket.Send( "xxx" );向服务器再发一个消息
要求服务器响应,但程序就停在这儿了
procedure TForm1.ClientSocket1Read(Sender: TObject;
Socket: TCustomWinSocket);
还有,客户端也设成阻塞模式时 ctBlocking
客户端收不数据
不知是什么原因Top
21 楼aimin(天剑)回复于 2000-12-08 00:11:00 得分 0
to WorldCreater:
SERVER端每产生一个客户连接时生成一个线程,客户端不要设成阻塞模式,因为那样客户端也要做成多线程方式 ,没必要。
至于双方的通信,你可以自已定义会话协议,在TForm1.ClientSocket1Read中判断SERVER发送过来的消息是什么意思,再作出响应就行了。
我的客户端程序发送接收方法都有了。Top
22 楼aimin(天剑)回复于 2000-12-08 11:53:00 得分 0
某些同志的E-MAIL发不过去,有想要程序的给我发MAIL。oam@chinese.comTop
23 楼WorldCreater(造化天尊)回复于 2000-12-08 12:36:00 得分 0
客户端当然也要做成多线程的
因为客户端要交互的啊Top
24 楼aimin(天剑)回复于 2000-12-08 14:45:00 得分 0
不对,如果客户端需要交互,可以在客户端的程序中设一个多线程的SERVERSOCKET,这就好象插头和插座,CLIENTSOCKET与CLIENTSOCKET是不能通信的。Top
25 楼WorldCreater(造化天尊)回复于 2000-12-08 18:40:00 得分 0
我认为发出请求的为客户
比如一个 icq 应当有 一个 ServerSocket 和 一个 ClientSocket
ServerSocket用于响应别人的请求, ClientSocket用于向别人发出请求
如果我现在要实现这样的一种对话:
我用 ClientSocket 发起请求
me: send "a"
server: answer me "x" or "y"
me: if me receive "x"
me send to server "b"
if me receive "y"
me send to server "c"
server: if "b" answer me "m"
if"c" answer me "n"
.........
这样不断地对话直到我通知可以断线,或我直接断开
这该怎么做Top
26 楼WorldCreater(造化天尊)回复于 2000-12-08 18:43:00 得分 0
就象打电话一样
请多多指教,呵呵
分数有的是,希望能彻底弄清楚Top
27 楼WorldCreater(造化天尊)回复于 2000-12-08 18:50:00 得分 0
也许我说的还不是很清楚
我要做的是用一个客户端发起请求后
在服务器创建一个线程响应我的请求后
在不断开连接的情况下
进行多次的交互活动Top
28 楼aimin(天剑)回复于 2000-12-08 22:39:00 得分 0
我明白你的意思,我为什么说要自定义通信协议就是这个意思,如果服务器端的线程不结束或连接不关闭,这个线程的连接就一直存在(至少SERVER端的线程是那么认为的),CLIENT端也可以一直等待。当然除非是任何一端接到结束的标记。Top
29 楼aimin(天剑)回复于 2000-12-08 22:52:00 得分 0
通信有一个共性,都是客户端申请,服务端响应,客户端再申请,。。。
所以说象你要求的功能不难实现,
服务器端的线程不要终止,接到消息就响应,一直到连接断开或接到结束标志。
客户端在CLIENTSOCKET1READ事件中等着,有回应就判断,再回答;因为是单线程的,可以设置一个定时器,一定时间内没有回应,就发送一个空信号,就象SMTP中的NOOP一样,为的是判断连接是否未断(当然服务器端也是一样)。
这里面关键是定义协议。我一再强调,设计协议是至关重要的,没有协议,双方(多方)就没有办法通信。所以说你还是把要求说得具体一点。
我们还是通过MAIL来交流吧。Top
30 楼WorldCreater(造化天尊)回复于 2000-12-08 22:57:00 得分 0
to aimin:
我的email: primary@email.com.cnTop
31 楼WorldCreater(造化天尊)回复于 2000-12-14 19:30:00 得分 0
诸位对不起
也许这个问题我会等很久才结束
不过请放心,该给的分决不会少的Top
32 楼WorldCreater(造化天尊)回复于 2000-12-26 22:04:00 得分 0
我看了一个问题,不知道 是现在就给大家分发分数好
还是再过一阵子,因为我现在有事,暂时不能做这个问题
大家决定好吗
http://www.csdn.net/expert/TopicView.asp?id=52338Top
33 楼halfone(蛮牛)回复于 2001-01-02 12:45:00 得分 0
to aimin:
如果你有一个有关socket的多线程的例子,请给我发一份。谢谢!
Email:manniuyemanniu@sina.comTop
34 楼saoren(saoren)回复于 2001-01-02 17:17:00 得分 30
1:
ServerSocket1.Socket.ActiveConnections;
2:
Server端:
type MyServerSocketThread=class(TServerClientThread);
private
...
public
constructor Create(CreateSuspended: Boolean; ASocket: TServerClientWinSocket;
procedure ClientExecute;override;
..
end;
procedure TForm1.Oncreate;
begin
with ServerSocket1 do
begin
ServerType := stThreadBlocking;
OnGetThread := GetThread;//GetThread是自己写的事件。
end;
end;
procedure TForm1.GetThread(Sender: TObject; ClientSocket: TServerClientWinSocket;
var SocketThread: TServerClientThread);
begin
SocketThread:=TMyServerSocketThread.Create(false,ClientSocket);
end;
procedure TmyServerSocketThread.Create(CreateSuspended: Boolean; ASocket: TServerClientWinSocket;
begin
...//自己写了。
end;
//Client link Thread. how do you do?? in here
procedure TMyServerSocketThread.ClientExecute;
begin
...
end;
有例子可看,\delphi5\source\vcl\scktsrvr.dpr.
那里的从TServerSocket继承的子类用法,还有它的客户端线程,TService的用法,很详细的。以上的东西我也是从那看来的。Top
35 楼saoren(saoren)回复于 2001-01-02 17:17:00 得分 0
1:
ServerSocket1.Socket.ActiveConnections;
2:
Server端:
type MyServerSocketThread=class(TServerClientThread);
private
...
public
constructor Create(CreateSuspended: Boolean; ASocket: TServerClientWinSocket;
procedure ClientExecute;override;
..
end;
procedure TForm1.Oncreate;
begin
with ServerSocket1 do
begin
ServerType := stThreadBlocking;
OnGetThread := GetThread;//GetThread是自己写的事件。
end;
end;
procedure TForm1.GetThread(Sender: TObject; ClientSocket: TServerClientWinSocket;
var SocketThread: TServerClientThread);
begin
SocketThread:=TMyServerSocketThread.Create(false,ClientSocket);
end;
procedure TmyServerSocketThread.Create(CreateSuspended: Boolean; ASocket: TServerClientWinSocket;
begin
...//自己写了。
end;
//Client link Thread. how do you do?? in here
procedure TMyServerSocketThread.ClientExecute;
begin
...
end;
有例子可看,\delphi5\source\vcl\scktsrvr.dpr.
那里的从TServerSocket继承的子类用法,还有它的客户端线程,TService的用法,很详细的。以上的东西我也是从那看来的。Top
36 楼guowzgyc(Developer)回复于 2001-01-04 09:51:00 得分 0
to aimin:
如果你有一个有关socket的多线程的例子,请给我发一份。谢谢!
Email:gyc@drpacific.comTop
37 楼WorldCreater(造化天尊)回复于 2001-01-09 23:57:00 得分 0
有点奇怪
ServerSocket为阻塞模式
当 ClientSocket 业为阻塞模式时能收到数据
为异步模式时 ServerSocket 好像收到的都是 0 字节Top
38 楼WorldCreater(造化天尊)回复于 2001-02-18 22:41:00 得分 0
很久没来这了
为表示我的歉意
我再加50分
然后结账
Top
39 楼WorldCreater(造化天尊)回复于 2001-02-18 22:42:00 得分 0
奇怪了
我不能再加分Top
40 楼WorldCreater(造化天尊)回复于 2001-02-18 22:45:00 得分 0
你最多只能给20分,分数增加后超过了。, 返回上一页。
抱歉Top
41 楼voyager(Hi,Hi)回复于 2001-02-19 12:06:00 得分 0
谁收到例子的,给小弟一份:voyage007@netease.comTop
42 楼why_wf(假面人)回复于 2001-02-23 21:14:00 得分 0
I want a copy!mail:why4tc@sina.com
thanksTop
43 楼gjq2000(小兵)回复于 2001-04-29 11:26:00 得分 0
to aimin:
救命,如果你有一个有关socket的多线程的例子,请给我发一份。谢谢!
Email:gjq1998@163.netTop
44 楼elecs(出尘)回复于 2001-06-07 11:31:00 得分 0
to aimin:
如果你有一个有关socket的多线程的例子,能否给我发一份。谢谢!!!
Email:elecs@sina.com
Top
45 楼cooloney(酷龙)回复于 2001-06-07 20:10:00 得分 0
to aimin:
谢谢你,我现在在搞毕业设计,这好需要你这方面的例子,可以发一个给我马?
我的email:cooloney@163.net
再次谢谢!!Top
46 楼wangjb(天蓝的我)回复于 2001-07-05 18:03:11 得分 0
to aimin:
麻烦你给我发一个SERVER端为阻塞,CLIENT端为非阻塞的例子,我试了几天不得要领
我的EMAIL:wjb1681@sina.com.cn
多谢!!Top
47 楼liyee(liyee)回复于 2001-07-07 23:24:14 得分 0
to aimin:
急需阻塞方式的多线程客户服务器通讯的例子,帮帮我!
我的mail : jcfcomm555@263.net.
我提议加20分Top
48 楼hellojw(呵呵,是我吗)回复于 2001-07-18 18:40:57 得分 0
我也急的要命,给我一份好吗ganzhipeng@21cn.com
谢谢!!!!!Top
49 楼xionghm(MMX)回复于 2001-07-19 15:34:36 得分 0
to aimin:
如果你有一个有关socket的多线程的例子,请给我发一份。谢谢!
我现在好着急,好多东东搞不懂。
Email:xionghm@263.netTop
50 楼hellojw(呵呵,是我吗)回复于 2001-07-20 09:57:57 得分 0
to aimin:
如果你有一个有关socket的多线程的例子,请给我发一份。谢谢!
我现在好着急,接个项目就是这个。
Email:ganzhipeng@21cn.comTop
51 楼duanfeng(段玉)回复于 2001-09-27 16:16:57 得分 0
to aimin:
我也不太懂
Email:duansoft@21cn.comTop
52 楼leafage(yejl)回复于 2001-09-30 13:05:14 得分 0
to aimin:
请给我发一份。谢谢!
Email:yejl2000@21cn.com Top




