刚学delphi在网上找了一个关于udp通信的程序,编译通过了但是,运行时总是提示:Stream Write error!请各位帮忙看一看,我的时w2K+dp6

SailorK 2003-11-25 02:08:19
打开Delphi,新建Application, 放置以下几个控件:
  Panel1, Panel2, Edit1, ListBox1, Memo1, Button1, Button2, BitBtn1, Nmudp1

源程序如下:
unit main;

interface

uses
 Windows,messages,SysUtils,Classes,Graphics,Controls,Forms,Dialogs,StdCtrls,
 Buttons,ExtCtrls,NMUDP,Menus,ComCtrls,WinSock; //增加WinSock

type
 TForm1 = class(TForm)
 NMUDP1: TNMUDP;
 Panel1: TPanel;
 Panel2: TPanel;
 Label1: TLabel;
 Edit1: TEdit;
 BitBtn1: TBitBtn;
 Memo1: TMemo;
 Panel3: TPanel;
 Panel4: TPanel;
 ListBox1: TListBox;
 Button1: TButton;
 Button2: TButton;
 procedure FormShow(Sender: TObject);
 procedure BitBtn1Click(Sender: TObject);
 procedure NMUDP1DataReceived(Sender: TComponent; NumberBytes: Integer;
      FromIP: String; Port: Integer);
 procedure Edit1KeyPress(Sender: TObject; var Key: Char);
 procedure Button1Click(Sender: TObject);
 procedure Button2Click(Sender: TObject);
 private
  { Private declarations }
 public
  { Public declarations }
end;

var
 Form1: TForm1;
 ComputerName: array[0..127] of Char;

implementation

{$R *.DFM}

procedure TForm1.FormShow(Sender: TObject);
var
 sz: dword;
begin
 sz := SizeOf(Computername);
 GetComputerName(ComputerNamesz);//得到本机的标识
 ListBox1.Items.Clear;
 ListBox1.Items.Add(’大家’);//在网友清单中,增加”大家”和
 ListBox1.Items.Add(ComputerName);//本机名称
 ListBox1.ItemIndex:=0;
end;

procedure TForm1.BitBtn1Click(Sender: TObject);
var
 MyStream: TMemoryStream;
 TmpStr: String;
 i:integer;
Begin
 if Edit1.Text<>’’ then //如果所说的内容不为空则发送
 begin
  NMUDP1.ReportLevel := Status_Basic;
  NMUDP1.RemotePort :=8888;//端口为:8888,可以自己定义,但必须与LocalPort相一致。
  if ListBox1.Items[ListBox1.ItemIndex]=ComputerName then
   Edit1.Text:=ComputerName+’自言自语道:’+Edit1.Text
   //如果和自己对话.
  Else
  Edit1.Text:=ComputerName+’对’+ListBox1.Items[listbox1.itemindex]+’说:’     +Edit1.Text;
  TmpStr :=Edit1.text;
  MyStream := TMemoryStream.Create;
  try
   MyStream.Write(TmpStr[1],Length(Edit1.Text));
   if ListBox1.ItemIndex=0 then
   begin
    for i:=1 to ListBox1.Items.Count-1 do
    begin //如果选择”大家”,则对所有的网友发送信息
     NMUDP1.RemoteHost :=ListBox1.Items[i];//远程主机的名称或地址.
     NMUDP1.SendStream(MyStream);//发送信息.
    End;
   end
   else
   begin //如果私聊
    NMUDP1.RemoteHost :=ListBox1.Items[ListBox1.itemindex];
    //仅对所选中的网友.
    NMUDP1.SendStream(MyStream);
   End;
  finally
   MyStream.Free;
  end;
  Edit1.Text:=’’;
  Edit1.SetFocus;
 end
 else
  Edit1.SetFocus;
end;

procedure TForm1.NMUDP1DataReceived(Sender: TComponent;NumberBytes: Integer;         FromIP:String;Port: Integer);
var
 MyStream: TMemoryStream;
 TmpStr: String;
begin
 MyStream := TMemoryStream.Create;
 try
  NMUDP1.ReadStream(MyStream);
  SetLength(TmpStrNumberBytes);
  MyStream.Read(TmpStr[1]NumberBytes);
  Memo1.Lines.Add(TmpStr); //显示对话的内容.
 finally
  MyStream.Free;
 end;
end;

procedure TForm1.Edit1KeyPress(Sender: TObject; var Key: Char);
var
 MyStream: TMemoryStream;
 TmpStr: String;
 i:integer;
Begin
 if (key=#13) and (Edit1.Text<>’’) then
 //如果所说的内容不为空,且最后一个按键为”Enter”则发送。
 begin
  NMUDP1.ReportLevel := Status_Basic;
  NMUDP1.RemotePort :=8888;
  if ListBox1.Items[ListBox1.ItemIndex]=ComputerName then
   Edit1.Text:=ComputerName+’自言自语道:’+Edit1.Text
 else
  Edit1.Text:=ComputerName+’对’+ListBox1.Items[listbox1.itemindex]+’说:’     +Edit1.Text;
  TmpStr :=Edit1.text;
  MyStream := TMemoryStream.Create;
  try
   MyStream.Write(TmpStr[1],Length(Edit1.Text));
   if ListBox1.ItemIndex=0 then
   begin
    for i:=1 to ListBox1.Items.Count-1 do
    begin
     NMUDP1.RemoteHost :=ListBox1.Items[i];
     NMUDP1.SendStream(MyStream);
    end;
   end
   else
   begin
    NMUDP1.RemoteHost :=ListBox1.Items[ListBox1.itemindex];
    NMUDP1.SendStream(MyStream);
   end;
  finally
   MyStream.Free;
  end;
  Edit1.Text:=’’;
  edit1.SetFocus;
 end
 else
  Edit1.SetFocus;
 end;
end;

procedure TForm1.Button1Click(Sender: TObject);
var
 InputString:String;
begin //增加网友,输入的可以是IP地址或计算机名称。
 InputString:=InputBox(’增加人员’,’IP地址或计算机名’,’’);
 if Inputstring<>’’ then ListBox1.Items.Add(Inputstring);
 ListBox1.ItemIndex:=0;
end;

procedure TForm1.Button2Click(Sender: TObject);
begin //删除当前选中的网友,但”大家”不能被删除.
 if ListBox1.ItemIndex<>0 then
  ListBox1.Items.Delete(ListBox1.ItemIndex);
end;

end.

  这样,一个简单的聊天工具就做好了,只要双方同时运行本程序,且将对方的计算机名称或IP地址加入到网友中即可实现实时聊天了一个属于自己版权的聊天程序,就这样编写成功了。程序运行时,自动加入两个网友:”大家”和本地计算机名称.当然,你可以增加更多的内容,使程序更加的完善,以求更多的功能。
...全文
304 3 打赏 收藏 转发到动态 举报
写回复
用AI写文章
3 条回复
切换为时间正序
请发表友善的回复…
发表回复
wlw88 2003-11-26
  • 打赏
  • 举报
回复
建议看一下Delphi自带的例子。应该可以解决。
SailorK 2003-11-25
  • 打赏
  • 举报
回复
谢谢 summax(夏天的冰)
1。取 Length(Edit1.Text) 的长度.而不是 Length(TmpStr)。其实这两个是一样的请看 procedure TForm1.BitBtn1Click(Sender: TObject);中的TmpStr :=Edit1.text;
2。我改了一下,还是“Stream Write error!”
修改后的源代码如下:
unit Unit1;

interface

uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, StdCtrls, NMUDP, Buttons,ComCtrls, Menus,ExtCtrls,WinSock;

type
TForm1 = class(TForm)
Panel1: TPanel;
Panel2: TPanel;
Edit1: TEdit;
Button1: TButton;
Button2: TButton;
BitBtn1: TBitBtn;
NMUDP1: TNMUDP;
ListBox1: TListBox;
Memo1: TMemo;
procedure Formshow(Sender: TObject);
procedure BitBtn1Click(Sender: TObject);
procedure edit1keypress(Sender: TObject; var Key: Char);
procedure Button1Click(Sender: TObject);
procedure Button2Click(Sender: TObject);
procedure nmudpdatareceive(Sender: TComponent; NumberBytes: Integer;
FromIP: String; Port: Integer);

private
{ Private declarations }
public
{ Public declarations }
end;

var
Form1: TForm1;
Computername:array[0..127] of Char;

implementation

{$R *.dfm}

procedure TForm1.Formshow(Sender: TObject);
var
sz:dword;
begin
sz:=SizeOf(Computername);
GetComputerName(Computername,sz);
listbox1.Items.Clear;
listbox1.Items.Add('´ó¼Ò');
listbox1.Items.Add(ComputerName);
listbox1.ItemIndex:=0;
end;

procedure TForm1.BitBtn1Click(Sender: TObject);
var
MyStream:TMemoryStream;
TmpStr:String;
i:integer;
begin
if edit1.Text<>'' then
begin
nmudp1.ReportLevel:=1;//Status_Basic;
nmudp1.RemotePort:=8888;
if listBox1.Items[listbox1.ItemIndex]=ComputerName then
Edit1.Text:=ComputerName+'×ÔÑÔ×ÔÓïµÀ:'+Edit1.Text
else
edit1.Text:=ComputerName+'¶Ô'+listBox1.Items[listbox1.ItemIndex]+'µÀ:'+Edit1.Text;
TmpStr:=edit1.Text;
MyStream:=TMemoryStream.Create;
try
MyStream.Write(TmpStr[1],Length(TmpStr));
if listbox1.ItemIndex=0 then
begin
for i:=1 to listbox1.Items.Count-1 do
begin
nmudp1.RemoteHost:=listbox1.Items[i];
nmudp1.SendStream(MyStream);
end;
end
else
begin
nmudp1.RemoteHost:=listbox1.Items[listbox1.Itemindex];
nmudp1.SendStream(MyStream);
end;
finally
MyStream.Free;
end;
edit1.Text:='';
edit1.SetFocus;
end

else
edit1.SetFocus;
end;


procedure TForm1.edit1keypress(Sender: TObject; var Key: Char);

begin
if(key=#13)and(edit1.Text<>'')then
begin
bitbtn1.Click;
end;

end;


procedure TForm1.Button1Click(Sender: TObject);
var
inputstring:String;
begin
inputstring:=InputBox('Ôö¼ÓÈËÔ±','ip µØÖ·»ò¼ÆËã»úÃû','');
if inputstring<>''then listbox1.Items.Add(inputstring);
listbox1.ItemIndex:=0;
end;

procedure TForm1.Button2Click(Sender: TObject);
begin
if listbox1.ItemIndex<>0 then
listbox1.Items.Delete(listbox1.ItemIndex);
end;


procedure TForm1.nmudpdatareceive(Sender: TComponent; NumberBytes: Integer;
FromIP: String; Port: Integer);
var
MyStream:TMemoryStream;
TmpStr:String;
begin
MyStream:=TMemoryStream.Create;
try
nmudp1.ReadStream(MyStream);
SetLength(TmpStr,NumberBytes);
MyStream.Read(TmpStr[1],NumberBytes);
memo1.Lines.Add(TmpStr);
finally
MyStream.Free;
end;
end;

end.

summax 2003-11-25
  • 打赏
  • 举报
回复
1.为什么要取 Length(Edit1.Text) 的长度.而不是 Length(TmpStr) 呢?
2.这句改成这样不就不用重复那么多代码了吗?
 if (key=#13) and (Edit1.Text<>’’) then
  //如果所说的内容不为空,且最后一个按键为”Enter”则发送。
  begin
BitBtn1.Click;
end;

1,593

社区成员

发帖
与我相关
我的任务
社区描述
Delphi 网络通信/分布式开发
社区管理员
  • 网络通信/分布式开发社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧