小弟编写了一个实时传送信息软件。遇到一个小问题。
问题:就是客户端与服务端连接上以后,在客户端输入传送的消息后,按回车发送消息!(发送消息是由回车来触发的)问题就出现了(刚编译好时,在本地机上没有出现什么问题,在两台机子上调试时,就出现“list index out of bounds(1)"错误。以后连在本地机上也会出现这样问题。)我怀疑是服务器接受客户端的消息时出现的错误。本程序在win2000和delphi6编译客户端:
unit Unit1;interfaceuses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, ScktComp, ExtCtrls, ComCtrls, StdCtrls, Buttons;type
TForm1 = class(TForm)
M1: TMemo;
Label1: TLabel;
edtHost: TEdit;
edtPort: TEdit;
btnConnect: TButton;
bntDisConnect: TButton;
Button1: TButton;
Edit1: TEdit;
S1: TStatusBar;
Bevel1: TBevel;
Label2: TLabel;
Client: TClientSocket;
Timer1: TTimer;
procedure btnConnectClick(Sender: TObject);
procedure bntDisConnectClick(Sender: TObject);
procedure Edit1KeyPress(Sender: TObject; var Key: Char);
procedure ClientConnect(Sender: TObject; Socket: TCustomWinSocket);
procedure ClientRead(Sender: TObject; Socket: TCustomWinSocket);
procedure FormClose(Sender: TObject; var Action: TCloseAction);
procedure Button1Click(Sender: TObject);
procedure FormCreate(Sender: TObject);
procedure Timer1Timer(Sender: TObject); procedure ClientDisconnect(Sender: TObject; Socket: TCustomWinSocket);
private
{ Private declarations }
public
{ Public declarations }
end;var
Form1: TForm1;
TotalLen:Integer;
implementation
Uses ShellAPI;
var
i:real;
{$R *.dfm}procedure TForm1.btnConnectClick(Sender: TObject);
begin
Client.Address:=edtHost.Text;//指定主机IP
Client.Port:=strtoint(edtPort.Text);//设置端口
Client.Active:=true;end;procedure TForm1.bntDisConnectClick(Sender: TObject);
begin
Client.Active:=False;
S1.Panels.Items[0].Text:='连接断开';
end;procedure TForm1.Edit1KeyPress(Sender: TObject; var Key: Char);
begin
if key=#13 then
begin
Timer1.Enabled:=true;
if not Client.Active then
btnConnectClick(Sender);
Client.Socket.SendText(Edit1.Text);
Edit1.SelectAll;
key:=#0;
end;
end;procedure TForm1.ClientConnect(Sender: TObject; Socket: TCustomWinSocket);
begin
S1.Panels.Items[0].Text:='已经连接';
S1.Panels.Items[1].Text:='';
end;procedure TForm1.ClientRead(Sender: TObject; Socket: TCustomWinSocket);
var
re:pchar;
sbuf:string;
relong:integer;begin
re:=nil;
while socket.ReceiveLength>0 do
begin
//申请内存
Timer1.Enabled:=false;
re:=AllocMem(socket.ReceiveLength);
try
relong:=socket.ReceiveLength;
Socket.ReceiveBuf(re^,Socket.ReceiveLength);
sBuf:=strpas(re);
Setlength(sbuf,relong); //计算字节数
TotalLen:=TotalLen+relong;
S1.Panels.Items[1].Text:='总接受字数(Byte):'+IntToStr(TotalLen);
S1.Update; finally
freemem(re);
end;
M1.Lines.Add(sbuf);
end;
end;procedure TForm1.FormClose(Sender: TObject; var Action: TCloseAction);
begin
if Client.Active then
Client.Close;end;procedure TForm1.Button1Click(Sender: TObject);
begin
ShellExecute(self.Handle,nil,Pchar(Application.EXEname),nil,nil,SW_Normal);
end;procedure TForm1.FormCreate(Sender: TObject);
begin
edtHost.Text:='192.168.0.19';
edtPort.Text:='15333';
TotalLen:=0;
i:=0;
//S1.Panels.Items[2].Text:='往返时间'+inttostr(i)+'毫秒';
end;procedure TForm1.Timer1Timer(Sender: TObject);
begin
i:=i+1;
S1.Panels.Items[2].Text:='往返时间'+floattostr(i)+'毫秒';
end;procedure TForm1.ClientDisconnect(Sender: TObject;
Socket: TCustomWinSocket);
begin
S1.Panels.Items[0].Text:='与主机断开连接';
S1.Panels.Items[1].Text:='';
M1.Lines.Clear;
edit1.Text:='';
end;end.
问题:就是客户端与服务端连接上以后,在客户端输入传送的消息后,按回车发送消息!(发送消息是由回车来触发的)问题就出现了(刚编译好时,在本地机上没有出现什么问题,在两台机子上调试时,就出现“list index out of bounds(1)"错误。以后连在本地机上也会出现这样问题。)我怀疑是服务器接受客户端的消息时出现的错误。本程序在win2000和delphi6编译客户端:
unit Unit1;interfaceuses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, ScktComp, ExtCtrls, ComCtrls, StdCtrls, Buttons;type
TForm1 = class(TForm)
M1: TMemo;
Label1: TLabel;
edtHost: TEdit;
edtPort: TEdit;
btnConnect: TButton;
bntDisConnect: TButton;
Button1: TButton;
Edit1: TEdit;
S1: TStatusBar;
Bevel1: TBevel;
Label2: TLabel;
Client: TClientSocket;
Timer1: TTimer;
procedure btnConnectClick(Sender: TObject);
procedure bntDisConnectClick(Sender: TObject);
procedure Edit1KeyPress(Sender: TObject; var Key: Char);
procedure ClientConnect(Sender: TObject; Socket: TCustomWinSocket);
procedure ClientRead(Sender: TObject; Socket: TCustomWinSocket);
procedure FormClose(Sender: TObject; var Action: TCloseAction);
procedure Button1Click(Sender: TObject);
procedure FormCreate(Sender: TObject);
procedure Timer1Timer(Sender: TObject); procedure ClientDisconnect(Sender: TObject; Socket: TCustomWinSocket);
private
{ Private declarations }
public
{ Public declarations }
end;var
Form1: TForm1;
TotalLen:Integer;
implementation
Uses ShellAPI;
var
i:real;
{$R *.dfm}procedure TForm1.btnConnectClick(Sender: TObject);
begin
Client.Address:=edtHost.Text;//指定主机IP
Client.Port:=strtoint(edtPort.Text);//设置端口
Client.Active:=true;end;procedure TForm1.bntDisConnectClick(Sender: TObject);
begin
Client.Active:=False;
S1.Panels.Items[0].Text:='连接断开';
end;procedure TForm1.Edit1KeyPress(Sender: TObject; var Key: Char);
begin
if key=#13 then
begin
Timer1.Enabled:=true;
if not Client.Active then
btnConnectClick(Sender);
Client.Socket.SendText(Edit1.Text);
Edit1.SelectAll;
key:=#0;
end;
end;procedure TForm1.ClientConnect(Sender: TObject; Socket: TCustomWinSocket);
begin
S1.Panels.Items[0].Text:='已经连接';
S1.Panels.Items[1].Text:='';
end;procedure TForm1.ClientRead(Sender: TObject; Socket: TCustomWinSocket);
var
re:pchar;
sbuf:string;
relong:integer;begin
re:=nil;
while socket.ReceiveLength>0 do
begin
//申请内存
Timer1.Enabled:=false;
re:=AllocMem(socket.ReceiveLength);
try
relong:=socket.ReceiveLength;
Socket.ReceiveBuf(re^,Socket.ReceiveLength);
sBuf:=strpas(re);
Setlength(sbuf,relong); //计算字节数
TotalLen:=TotalLen+relong;
S1.Panels.Items[1].Text:='总接受字数(Byte):'+IntToStr(TotalLen);
S1.Update; finally
freemem(re);
end;
M1.Lines.Add(sbuf);
end;
end;procedure TForm1.FormClose(Sender: TObject; var Action: TCloseAction);
begin
if Client.Active then
Client.Close;end;procedure TForm1.Button1Click(Sender: TObject);
begin
ShellExecute(self.Handle,nil,Pchar(Application.EXEname),nil,nil,SW_Normal);
end;procedure TForm1.FormCreate(Sender: TObject);
begin
edtHost.Text:='192.168.0.19';
edtPort.Text:='15333';
TotalLen:=0;
i:=0;
//S1.Panels.Items[2].Text:='往返时间'+inttostr(i)+'毫秒';
end;procedure TForm1.Timer1Timer(Sender: TObject);
begin
i:=i+1;
S1.Panels.Items[2].Text:='往返时间'+floattostr(i)+'毫秒';
end;procedure TForm1.ClientDisconnect(Sender: TObject;
Socket: TCustomWinSocket);
begin
S1.Panels.Items[0].Text:='与主机断开连接';
S1.Panels.Items[1].Text:='';
M1.Lines.Clear;
edit1.Text:='';
end;end.
解决方案 »
- locate 不能定位~
- 用代码实现EXCEL直接写到SQL2000数据库已经建好的表中
- 服务程序/install 与CreateService安装的程序为什么不一样
- 大虾帮忙将Selection.AutoFill Destination:=Range("L3:L"),Type:=xlFillDefault 翻译成Delphi语句?
- 我的结婚旅行相片集,欢迎大家欣赏http://www.happy-city.com
- 走了﹐真的只是到此一游
- Delphi基础何为好?
- 一个很简单的SQL查询问题!
- 大虾们,让你们做一道很好的题目
- 求word文档->pdf文档的函数或控件!!
- 如何获得FTP中的文件列表,包括子文件夹。
- dbgrideh简单问题
应该是这样的。
是指相应的客户机连接 index号
ServerSocket 上要选一个客户端的连接,而你选了一个不存在的连接