很少使用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;另外,现在我用的处理方式只能接收文字,有什么好办法进行图片或者文件传输么?socket文件传输TCP/IP控件图片
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;另外,现在我用的处理方式只能接收文字,有什么好办法进行图片或者文件传输么?socket文件传输TCP/IP控件图片
我知道有些控件非常好用,但是由于还会和其他系统沟通,所以只能使用最基本的控件。
服务端就不要用了,每个连接都自动开启一个线程,当客户端少的时候也没什么问题
客户端多了后(比如1000个连接)之后,系统资源严重浪费
如果是做服务器端,操作系统环境是Windows的话,完成端口技术是非常不错的选择
当你设置为阻塞(Blocked)模式时,
行为就会像你描述的那样。
将其设为非阻塞模式,
可能可以获得你要的结果。话说回来,如果你要建构稳定的大型系统,你还是要认真学习阻塞模式,理论上阻塞模式比较稳定。
当然,凡事都有例外,
也许你的应用就是用非阻塞模式比较稳定也说不定。
所以造成了传递信息之后就无法再接收信息的这种效果。