我想使用C/S模型编写一个服务器串口控制程序,应该怎么实现了?(30分)

  • 主题发起人 主题发起人 zkking
  • 开始时间 开始时间
Z

zkking

Unregistered / Unconfirmed
GUEST, unregistred user!
使用clientsocket 和serversocket控件,客户端发出数据,服务器先初始化串口,接收到
数据后,向串口发送出去,而且希望能够采用多线程,就是同时会有多个客户端发送请求
服务器能响应吗?如果不对,还有什么错误吗?以上两个控件能够实现互联网的连接吗?

小弟是网络编程的新手,问题问得幼稚得话,还请见谅啊
 
是不是太简单没有人愿意回答了,难道分数嫌少了。
 
能够响应,也能够实现互联
 
绝对可以在Internet上传送数据。
不要用多线程,在服务器端用
ServerSocket1.ActiveConnections 取得并发客户连接数
ServerSocket1.Socket.Connections[index]取得连接的TCustomWinSocket实例。
通过这个实例就可以知道连接对方的IP,Port等信息了。
TServerSocket响应的事件是OnClientRead
 
谢谢szf的帮助,但是为什么不能使用多线程了,serversocket不是支持多线程吗?,
 
不是不能,而是不必要。
使用Socket传送流(比如大文件)的情况下的进候,使用Stream编程上很方便,但需要使用阻塞式的Socket,
为了程序的运行的流畅性,就需要使用多线程了。
因此,如果是几百到几千字节的小量数据就没有必要了这样做了,用Socket的事件驱动来编程,比较容易些。
其实使用事件驱动,如果处理得好,即使几十个用户连上来,程序一样可以很流畅的。
 
谢谢了,您有这方面的程序吗,就是您说得时间驱动上的处理,我的msn为:
zkking@hotmail.com
 
给个例子吧,如下:
unit Unit1;

interface

uses
Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs,
ScktComp;

type
TForm1 = class(TForm)
ServerSocket1: TServerSocket;
procedure ServerSocket1Accept(Sender: TObject;
Socket: TCustomWinSocket);
procedure ServerSocket1ClientConnect(Sender: TObject;
Socket: TCustomWinSocket);
procedure ServerSocket1ClientDisconnect(Sender: TObject;
Socket: TCustomWinSocket);
procedure ServerSocket1ClientError(Sender: TObject;
Socket: TCustomWinSocket; ErrorEvent: TErrorEvent;
var ErrorCode: Integer);
procedure ServerSocket1ClientRead(Sender: TObject;
Socket: TCustomWinSocket);
private
{ Private declarations }
public
{ Public declarations }
end;

var
Form1: TForm1;

implementation

{$R *.DFM}

procedure TForm1.ServerSocket1Accept(Sender: TObject;
Socket: TCustomWinSocket);
begin
if not AllowConnect(Socket.RemoteAddress) then //验证远程主机的IP是否允许它连接
Socket.Close; //函数AllowConnect请自定义,如果
//没有限制连接,这个事件句柄就不用写了
end;

procedure TForm1.ServerSocket1ClientConnect(Sender: TObject;
Socket: TCustomWinSocket);
begin
LogMessage('有IP地址为'+Socket.RemoteAddress+'的主机已经连接');
end;

procedure TForm1.ServerSocket1ClientDisconnect(Sender: TObject;
Socket: TCustomWinSocket);
begin
LogMessage('有IP地址为'+Socket.RemoteAddress+'的主机断开了它的连接');
end;

procedure TForm1.ServerSocket1ClientError(Sender: TObject;
Socket: TCustomWinSocket; ErrorEvent: TErrorEvent;
var ErrorCode: Integer);
begin
LogMessage('与IP地址为'+Socket.RemoteAddress+'的主机连接发生错误!');
Socket.Close;
ErrorCode :=0; //如果你不想程序抛出异常,请把ErrorCode置为0
end;

procedure TForm1.ServerSocket1ClientRead(Sender: TObject;
Socket: TCustomWinSocket);
var ms: TMemoryStream;
len: Integer;
begin
len := Socket.ReceiveLength
LogMessage('接收到IP地址为'+Socket.RemoteAddress+
'的主机发送的数据,长度为='+
IntToStr(len)+'字节');
ms := TMemoryStream.Create;
try
ms.SetSize(len);
Socket.ReceiveBuf(ms.Memory,len);
//这时,已经把本次事件在网络上所收到的数据存到流中了。
//下面,想怎么用就怎么用。
finally
ms.Free;
end;
end;

end.
 
谢谢,我搞定了,能和你联系吗:zkking@hotmail.com
 
后退
顶部