小弟要整个聊天程序,其实用NMMsg组件很简单就实现了,可是老师要求用udp组件实现,小弟去网上找到了一个聊天程序用udp实现的,可是在delphi6环境下运行时说“stream write error”不知道是否程序自身有问题?请大虾们看看,拜托一定要帮忙,解决问题马上给分决不拖贴字!!!!
单元文件代码如下:
unit Unit1;interfaceuses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, NMUDP, ComCtrls, StdCtrls;type
TForm1 = class(TForm)
Edit1: TEdit;
Edit2: TEdit;
Button1: TButton;
Memo1: TMemo;
Memo2: TMemo;
StatusBar1: TStatusBar;
NMUDP1: TNMUDP;
Label1: TLabel;
Label2: TLabel;
procedure Button1Click(Sender: TObject);
procedure NMUDP1DataReceived(Sender: TComponent; NumberBytes: Integer;
FromIP: String; Port: Integer);
procedure Memo1Change(Sender: TObject);
procedure NMUDP1Status(Sender: TComponent; status: String);
procedure NMUDP1DataSend(Sender: TObject);
procedure NMUDP1BufferInvalid(var handled: Boolean;
var Buff: array of Char; var length: Integer);
private
{ Private declarations }
public
{ Public declarations }
end;var
Form1: TForm1;implementation{$R *.dfm}procedure TForm1.Button1Click(Sender: TObject);
Var MyStream:TMemoryStream; //在内存中建立一个数据块对象
TmpStr:string;
begin
NMUDP1.ReportLevel:=Status_basic; //指明通过Status和OnStatus事件返回的状态消息的内容
NMUDP1.RemoteHost:=edit1.Text; //远端主机的主机名或端口号
NMUDP1.RemotePort:=strtoint(edit2.Text); //端口号,可以用6767
Memo1.Enabled:=true;
Tmpstr:='聊天好吗?';
MyStream:= TMemoryStream.Create; //构造一个MyStream实例
try
MyStream.Write(TmpStr[1],length(Tmpstr)); //把'聊天好吗?'写入MyStream
NMUDP1.SendStream(MyStream); //把数据块发送出去
Finally
MyStream.Free; //释放数据块
end;end;procedure TForm1.NMUDP1DataReceived(Sender: TComponent;
NumberBytes: Integer; FromIP: String; Port: Integer);Var MyStream:TMemoryStream; //在内存中建立一个数据块对象
TmpStr:string;
begin
MyStream:= TMemoryStream.Create; //构造一个MyStream实例
try
NMUDP1.ReadStream(MyStream); //接收远方传来的数据流,保存到MyStream里面去
SetLength(Tmpstr,Numberbytes); //设置字符串的长度是Tmpstr的内容,用Numberbytes表示
MyStream.Read(Tmpstr,Numberbytes); //把MyStream的内容读给mpstr
//下面进行处理
if (Tmpstr='聊天好吗?') and (Memo1.Enabled=false) then
begin
//出现一个提示牌,你可以选择是否接受聊天
if MessageDlg(FromIP+': '+Tmpstr,mtconfirmation,[mbYes,MbNo],0)=mrYes then
begin
Edit1.Text:=FromIP; //把对方主机信息添加上去,可以实现聊天
Edit2.Text:=inttostr(port);
Memo1.Enabled:=true;
Memo1.SetFocus; //焦点给Memo1
end;
end
else
begin
//这是对方传过来的话,直接添加进Memo2
Memo2.Clear;
memo2.Lines.Add(Tmpstr);
end; finally
MyStream.Free; //释放MyStream
end;
end;procedure TForm1.Memo1Change(Sender: TObject);
Var MyStream:TMemoryStream; //在内存中建立一个数据块对象
TmpStr:string;
begin
NMUDP1.ReportLevel:=Status_basic; //指明通过Status和OnStatus事件返回的状态消息的内容
NMUDP1.RemoteHost:=edit1.Text; //远端主机的主机名或端口号
NMUDP1.RemotePort:=strtoint(edit2.Text); //端口号,可以用6767
Tmpstr:=Memo1.Text;
MyStream:= TMemoryStream.Create; //构造一个MyStream实例
try
MyStream.Write(TmpStr[1],length(Tmpstr)); //把'聊天好吗?'写入MyStream
NMUDP1.SendStream(MyStream); //把数据块发送出去
Finally
MyStream.Free; //释放数据块
end;
end;procedure TForm1.NMUDP1Status(Sender: TComponent; status: String);
begin
if statusBar1<>NIL then
statusBar1.SimpleText:=status;
end;procedure TForm1.NMUDP1DataSend(Sender: TObject);
begin
statusBar1.SimpleText:='数据已发送';
end;procedure TForm1.NMUDP1BufferInvalid(var handled: Boolean;
var Buff: array of Char; var length: Integer);
begin
//这个事件反映远端主机不存在
statusBar1.SimpleText:='远端主机不存在';
end;end.
单元文件代码如下:
unit Unit1;interfaceuses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, NMUDP, ComCtrls, StdCtrls;type
TForm1 = class(TForm)
Edit1: TEdit;
Edit2: TEdit;
Button1: TButton;
Memo1: TMemo;
Memo2: TMemo;
StatusBar1: TStatusBar;
NMUDP1: TNMUDP;
Label1: TLabel;
Label2: TLabel;
procedure Button1Click(Sender: TObject);
procedure NMUDP1DataReceived(Sender: TComponent; NumberBytes: Integer;
FromIP: String; Port: Integer);
procedure Memo1Change(Sender: TObject);
procedure NMUDP1Status(Sender: TComponent; status: String);
procedure NMUDP1DataSend(Sender: TObject);
procedure NMUDP1BufferInvalid(var handled: Boolean;
var Buff: array of Char; var length: Integer);
private
{ Private declarations }
public
{ Public declarations }
end;var
Form1: TForm1;implementation{$R *.dfm}procedure TForm1.Button1Click(Sender: TObject);
Var MyStream:TMemoryStream; //在内存中建立一个数据块对象
TmpStr:string;
begin
NMUDP1.ReportLevel:=Status_basic; //指明通过Status和OnStatus事件返回的状态消息的内容
NMUDP1.RemoteHost:=edit1.Text; //远端主机的主机名或端口号
NMUDP1.RemotePort:=strtoint(edit2.Text); //端口号,可以用6767
Memo1.Enabled:=true;
Tmpstr:='聊天好吗?';
MyStream:= TMemoryStream.Create; //构造一个MyStream实例
try
MyStream.Write(TmpStr[1],length(Tmpstr)); //把'聊天好吗?'写入MyStream
NMUDP1.SendStream(MyStream); //把数据块发送出去
Finally
MyStream.Free; //释放数据块
end;end;procedure TForm1.NMUDP1DataReceived(Sender: TComponent;
NumberBytes: Integer; FromIP: String; Port: Integer);Var MyStream:TMemoryStream; //在内存中建立一个数据块对象
TmpStr:string;
begin
MyStream:= TMemoryStream.Create; //构造一个MyStream实例
try
NMUDP1.ReadStream(MyStream); //接收远方传来的数据流,保存到MyStream里面去
SetLength(Tmpstr,Numberbytes); //设置字符串的长度是Tmpstr的内容,用Numberbytes表示
MyStream.Read(Tmpstr,Numberbytes); //把MyStream的内容读给mpstr
//下面进行处理
if (Tmpstr='聊天好吗?') and (Memo1.Enabled=false) then
begin
//出现一个提示牌,你可以选择是否接受聊天
if MessageDlg(FromIP+': '+Tmpstr,mtconfirmation,[mbYes,MbNo],0)=mrYes then
begin
Edit1.Text:=FromIP; //把对方主机信息添加上去,可以实现聊天
Edit2.Text:=inttostr(port);
Memo1.Enabled:=true;
Memo1.SetFocus; //焦点给Memo1
end;
end
else
begin
//这是对方传过来的话,直接添加进Memo2
Memo2.Clear;
memo2.Lines.Add(Tmpstr);
end; finally
MyStream.Free; //释放MyStream
end;
end;procedure TForm1.Memo1Change(Sender: TObject);
Var MyStream:TMemoryStream; //在内存中建立一个数据块对象
TmpStr:string;
begin
NMUDP1.ReportLevel:=Status_basic; //指明通过Status和OnStatus事件返回的状态消息的内容
NMUDP1.RemoteHost:=edit1.Text; //远端主机的主机名或端口号
NMUDP1.RemotePort:=strtoint(edit2.Text); //端口号,可以用6767
Tmpstr:=Memo1.Text;
MyStream:= TMemoryStream.Create; //构造一个MyStream实例
try
MyStream.Write(TmpStr[1],length(Tmpstr)); //把'聊天好吗?'写入MyStream
NMUDP1.SendStream(MyStream); //把数据块发送出去
Finally
MyStream.Free; //释放数据块
end;
end;procedure TForm1.NMUDP1Status(Sender: TComponent; status: String);
begin
if statusBar1<>NIL then
statusBar1.SimpleText:=status;
end;procedure TForm1.NMUDP1DataSend(Sender: TObject);
begin
statusBar1.SimpleText:='数据已发送';
end;procedure TForm1.NMUDP1BufferInvalid(var handled: Boolean;
var Buff: array of Char; var length: Integer);
begin
//这个事件反映远端主机不存在
statusBar1.SimpleText:='远端主机不存在';
end;end.
解决方案 »
免费领取超大流量手机卡,每月29元包185G流量+100分钟通话, 中国电信官方发货