Socket控件能否双向传输?
很少使用Socket控件,发现它只能单向传输数据,所以,我只能用类似下面的方法,采用两个socket,一个用于发送,一个用于接收。请问有没有知道有什么更好的处理方式?
procedure TDM.TcpClient1Connect(Sender: TObject);
var
str1: string;
begin
str1:= '#1#'+ gConfig.stdid+ ','+ gConfig.stdid;
TcpClient1.Sendln(str1);
TcpClient1.Disconnect;
TcpClient2.RemoteHost:= gConfig.host;
TcpClient2.RemotePort:= inttostr(gConfig.port- 1);
TcpClient2.Connect;
end;
procedure TDM.TcpClient2Connect(Sender: TObject);
var
str1: UTF8STRING;
str2, cmd, sInfo: string;
a: integer;
begin
str1:= TcpClient2.Receiveln;
str2:= UTF8toansi(str1);
cmd:= readBetween(str1, '#', '#', a);
sInfo:= copy(str2, a, length(str2));
if cmd= '101' then begin
UserInfo:= sInfo;
DeviceState:= 1;
end;
TcpClient2.Disconnect;
end;
另外,现在我用的处理方式只能接收文字,有什么好办法进行图片或者文件传输么?
------解决方案--------------------我客户端用的是TIdTCPClient,发送用WriteLn,接收用ReadLn。好像还不错,希望对你有帮助。
------解决方案--------------------indy控件不错,只不过indy采用阻塞方式处理,所以客户端使用没什么太大问题
服务端就不要用了,每个连接都自动开启一个线程,当客户端少的时候也没什么问题
客户端多了后(比如1000个连接)之后,系统资源严重浪费
如果是做服务器端,操作系统环境是Windows的话,完成端口技术是非常不错的选择
------解决方案--------------------肯定是双向的
二进制内容,有流方式收发函数的
------解决方案--------------------关键在于你设置控件的阻塞模式。
当你设置为阻塞(Blocked)模式时,
行为就会像你描述的那样。
将其设为非阻塞模式,
可能可以获得你要的结果。
话说回来,如果你要建构稳定的大型系统,你还是要认真学习阻塞模式,理论上阻塞模式比较稳定。
当然,凡事都有例外,
也许你的应用就是用非阻塞模式比较稳定也说不定。
------解决方案--------------------主從雙向..
------解决方案--------------------socket 本来就是双向的,可以用自带的TTcpClient 和 TTCpServer ,这两个控件是非常不错的。