请教:UDP聊天程序中出现“stream write error”错误的问题

54see 2003-02-14 03:40:41
我参考(全搬)着书上的例程做的UDP聊天程序,在调试时每次发送信息时都出现“stream write error”,请问是哪里出错?
是不是一定要安装UDP协议?我还没专门去安装,不知是不是win2000自己就有的,我只有TCP/IP协议,如果一定另外安装UDP协议,怎么安装,哪里有?我在win2000系统里都没发现这个协议。
是不是
MyStream.Write(s[1],Length(s));
这句有错误?我也查其他的资料,但没发现什么不同。
附发送段程序:

  procedure TForm1.Button1Click(Sender: TObject);

  var MyStream:TMemoryStream; //定义一个TMemoryStream类型的变量

  s:string;

  begin

  Nmudp1.RemoteHost:=Edit2.Text; //指定远端主机的IP地址

  s:=Edit1.Text;

  if s<>'' then //当输入的内容不为空时发送数据

  begin

  MyStream:=TMemoryStream.Create;

  MyStream.Write(s[1],Length(s)); //将变量s中的内容写入MyStream

  Nmudp1.SendStream(MyStream); //发送数据

  MyStream.Free; //释放变量

  Edit1.Text:=''; //清空输入框

  Memo1.Lines.Add(s); //语句s显示在Memo1中

  end;

  end;
谢谢!
...全文
240 12 打赏 收藏 转发到动态 举报
写回复
用AI写文章
12 条回复
切换为时间正序
请发表友善的回复…
发表回复
kingtingshuo 2003-09-15
  • 打赏
  • 举报
回复
study
hbwjz 2003-09-12
  • 打赏
  • 举报
回复
不需要服务器的,udp是无连接协议。我自己就编过这样的聊天室
aiku 2003-09-11
  • 打赏
  • 举报
回复
我用的是delphi的winsocket控件编写了一个简单的聊天室软件!
编译通过,但有时会出现list index out ofbounds(1)错误。请高手赐教!
如果要源代码请于我联系:我的email:kubizhu@hotmail.com(请注明源代码)
stall 2003-09-11
  • 打赏
  • 举报
回复
你这个问题我也磁到过,当你设置的REOMTEPORT不存在或对方的程序未打开,未建立起你指定的REMOTEPORT时就会出现这个问题。
heguo 2003-06-11
  • 打赏
  • 举报
回复
然后接受有回应的所有IP

这个聊天程序是不是没有服务器?还是临时指定一个服务器的?

如果我在192.168.1.xxx网段测试还能通过吗?
pdsinfo 2003-06-11
  • 打赏
  • 举报
回复
对192.168.0.255广播就可以了
heguo 2003-06-11
  • 打赏
  • 举报
回复
http://expert.csdn.net/Expert/topic/1905/1905156.xml?temp=.2795221

请教疑问:
现有一聊天程序,局域网内任何机器登录,就会在所有用户的在线列表里添加,请问他是怎么实现的?
这个程序登录时没有提示要输入服务器IP,也不需要指定端口号,就直接登录到聊天界面了.看上去像是不需要服务器的.也没有数据库.
方案1.遍历网段内所有IP的默认端口,获取已登录此聊天程序的用户列表,逐个发送消息,通知:我登录啦.然后打开自己的端口,把在线用户添加到自己的在线列表中.
方案2.类似于net send * msg之类的原理,向网段内所有IP广播一条消息:我登录啦.如果收到回应,就确定在线.

我对协议,网络没什么概念,我不知道我在说些什么.但我想了解这个程序工作的浅显的原理.登录过程序消息是怎么传递的,希望有高人指点一二.
方案一,方案二估计都不是什么切实可地的方案.:)
我知道他用winsock实现,用到udp协议.
我在192.168.0.XXX网段测试的.
再问:udp是不是只能在局域网内广播消息?

我还测试过:第一个登录者退出后,第二个第三个还是可以继续正常的聊天通讯的.



Joker101 2003-04-26
  • 打赏
  • 举报
回复
1、无需单独安装udp协议,它是基于tcp/ip的,装了tcpip就支持了
2、MyStream.Write(s[1],Length(s)); 没有什么问题,应该是其他地方的问题,remoteport不知道你有没有在属性里指定,没有是不行的
dude 2003-04-26
  • 打赏
  • 举报
回复
楼主的remoteport不加可以吗?那发到那个port去阿?
tcp/ip是协议组,好像是包含了udp的
dude 2003-04-26
  • 打赏
  • 举报
回复
{接受}
procedure TForm1.UdpSocketSendReceive(Sender: TObject; Buf: PAnsiChar;
var DataLen: Integer);
var
str:array[0..1000] of char;
begin
str:='';
UdpSocketSend.ReceiveBuf(str,DataLen);
Memo1.Lines.Add(str);
end;
{发送}
procedure TForm1.Button1Click(Sender: TObject);
var
strarr:array[0..1000] of char;
Str:string;
len:integer;
begin
Str:=Edit1.Text;
if length(str)=0 then len:=1 else len:=length(str);
StrpCopy(strarr,Str);
Memo1.Lines.Add(Edit1.Text);
UdpSocketSend.RemoteHost:=HeIP.Text;
UdpSocketSend.RemotePort:=HePort.Text;
UdpSocketSend.SendBuf(strarr,len);

end;
procedure TForm1.Button2Click(Sender: TObject);
begin
UdpSocketSend.LocalPort:=MyPort.Text;
UdpSocketSend.RemoteHost:=HeIP.Text;
UdpSocketSend.RemotePort:=HePort.Text;
UdpSocketSend.Active:=true;
end;


请问那里错了阿?
8341 2003-02-20
  • 打赏
  • 举报
回复
在98下就没有,在2000下就报错
yinshanyun 2003-02-18
  • 打赏
  • 举报
回复
傅远山:yinshanyun@sohu.com
我有两个函数,运行很少报错,给你用用:

function UDPSend(NMUDP1: TNMUDP; const sSend: string; const iLen: integer):integer;
var
MyStream: TMemoryStream;
TmpStr: String;
Begin
Result := 0;
TmpStr := sSend;
MyStream := TMemoryStream.Create;
try
MyStream.Write(TmpStr[1], iLen);
NMUDP1.SendStream(MyStream);
finally
MyStream.Free;
end;
end;

function UDPRecv(NMUDP1: TNMUDP; var sRecv: string; const NumberBytes: integer):integer;
var
MyStream: TMemoryStream;
TmpStr: String;
begin
Result := 0;
MyStream := TMemoryStream.Create;
try
NMUDP1.ReadStream(MyStream);
SetLength(TmpStr,NumberBytes);
MyStream.Read(TmpStr[1],NumberBytes);
finally
MyStream.Free;
end;
sRecv := TmpStr;
end;

1,593

社区成员

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

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