做了个小聊天工具大家帮忙测试给点意见啊 ( 积分: 100 )

  • 主题发起人 主题发起人 iamy
  • 开始时间 开始时间
I

iamy

Unregistered / Unconfirmed
GUEST, unregistred user!
Quick Message v1.0.0
测试版
下载地址
http://tzb.ntu.edu.cn/root/photo/net1-0-1.rar
无服务端局域网聊天工具
支持多彩文本,贴图,文件传输
文件传输基于http
聊天基于udp
开放端口3000、3001
 
Quick Message v1.0.0
测试版
下载地址
http://tzb.ntu.edu.cn/root/photo/net1-0-1.rar
无服务端局域网聊天工具
支持多彩文本,贴图,文件传输
文件传输基于http
聊天基于udp
开放端口3000、3001
 
下載了,不錯
 
不错,能不能共享原代码?
 
不错
希望可以共享代码!
 
原码搞出来分享下
 
希望得到源码 谢谢了
wanghy@emails.bjut.edu.cn
 
希望学习源码 谢谢了
breezee@21cn.com
 
不错。。 能不能把源码发一下谢谢
wxc211@163.com
 
送给老婆的
呵呵
暂时不公布
不好意思啊
我把udp多线程断点传送文件的那部分做好后公布里面的核心功能部分的代码
 
我也给老婆做了一个;
但只能针对有IP站点的机器使用,不知道你这个怎么使用的?
 
下了。还成。怎么不把语音,视频做上?
 
WinXP下运行出错:Access violation ...
建议增加“远程桌面共享”功能
 
以前的版本里存在问题
现在最新的版本还没有传上去
语音和视频我也想了
另外文件共享我想到了可以在校园网里做bt共享
通过支持断点和多线程的文件传输就可以实现了
总之想法还是挺多的,就是还需要时间来实现
这段时间在忙着做毕业设计和找工作

多谢各位提出宝贵意见
 
断点传输的解决方法
type
Tbuf_char=array[0..8191] of char;
Tbuf_byte=array[0..8191] of byte;



type

Tfilebuf=record
pos:integer;
size:integer;
buf:Tbuf_byte;
end;


///////////////////////////////////////////////////////
else if (ts.Strings[0]='file') then //文件访问
begin
//showmessage(ts.Strings[0]);
if fileexists(ts.Strings[1]) {and (pos(ts.Strings[1],alwdownfilelist.Text)<>0)} then
begin
//showmessage(ts.Strings[0]);
zeromemory(@buf,sizeof(buf));
p:=strtoint(ts.Strings[2]);
buf.pos:=p;
filestr:=Tfilestream.Create(ts.Strings[1],fmOpenRead);
buf.size:=filestr.Size;
filestr.Position:=(p-1)*sizeof(buf.buf);
filestr.Read(buf.buf,sizeof(buf.buf));
filestr.Destroy;
ABinding.SendTo(ABinding.PeerIP, ABinding.PeerPort, buf, sizeof(buf));
end;
end
/////////////////////////////////////////////
 
还有速度的问题
我老是觉得速度不够快
可能多用几个线程会好一点
不过我还没试
 
udp部分的代码
procedure Tform_main.idudpUDPRead(Sender: TObject; AData: TStream;
ABinding: TIdSocketHandle);
var
Dstream: TStringStream;
rs:string;
ts:Tstrings;
tfile:Tstrings;
filename:string;
T:TgetpcThread;
i:integer;
msg:string;
filestr:Tfilestream;
buf:Tfilebuf;
p:integer;
begin
udpbusy:=true;
Dstream := TStringStream.Create('');
try
ts:=Tstringlist.Create;
Dstream.CopyFrom(AData, AData.Size);
ts.Text:=dstream.DataString;
if (ts.Strings[0]='getpcinfo') then
begin
rs:=form_main.get_pc_ip(form_main.pc_name)+#13#10+form_main.user_name+#13#10+form_main.user_part+#13#10+form_main.pc_name+#13#10+form_chat.ac_setstatus.Caption;
ABinding.SendTo(ABinding.PeerIP, ABinding.PeerPort, rs[1], Length(rs));
end
else if (ts.Strings[0]='deleteuser') then //接受网络的删除用户消息
begin
if ABinding.PeerIP<>form_main.get_pc_ip(form_main.pc_name) then
form_chat.deleteuser(ABinding.PeerIP);
end
else if (ts.Strings[0]='useroff') then //接受网络的用户离开消息
begin
with form_chat.finduserbyip(ABinding.PeerIP) do
imageindex:=2;
end
else if (ts.Strings[0]='useron') then //接受网络的用户上线消息
begin
with form_chat.finduserbyip(ABinding.PeerIP) do
imageindex:=3;
end
else if (ts.Strings[0]='adduser') then //接受网络的用户添加消息
begin
//if ABinding.PeerIP<>form_main.get_pc_ip(form_main.pc_name) then
begin
t:=TgetpcThread.Create(true);
t.iplist:=Tstringlist.Create;
t.iplist.Add(ABinding.PeerIP);
t.reqadd:=false;
t.Resume;
end;
end
else if (ts.Strings[0]='adduser_login') then //接受网络的删除用户退出消息
begin
t:=TgetpcThread.Create(true);
t.iplist:=Tstringlist.Create;
t.iplist.Add(ABinding.PeerIP);
t.reqadd:=false;
t.Resume;
//if ABinding.PeerIP<>form_main.get_pc_ip(form_main.pc_name) then
//begin
form_chat.reqaddpc(ABinding.PeerIP,false);
//end;
end
else if (ts.Strings[0]='chat') then //接受网络的用户聊天消息
begin
//form_chat.getpcinfo(ABinding.PeerIP);
with form_chat.finduserbyip(ABinding.PeerIP) do
begin
if checked then
begin
msg:=''+formatdatetime('yy-mm-dd hh:mm:ss',now)+' 接收消息 ';
msg:=msg+form_main.get_user_infostring(caption,subitems.Strings[0],subitems.Strings[1],ABinding.PeerIP)+#13#10;
subitems.Strings[4]:=inttostr(strtoint(subitems.Strings[4])+1);
msg:=msg+httpdecode(ts.Strings[1])+#13#10+#13#10;
tim_writemsg.Enabled:=true;
if not tim_flasicon.Enabled then
tim_flasicon.Enabled:=true;
form_main.writemsg(msg);
form_main.playsound('message');
rs:='ok';
form_main.responsestatus(ABinding.PeerIP);
end
else
begin
rs:='';
end;
end;
ABinding.SendTo(ABinding.PeerIP, ABinding.PeerPort, rs[1], Length(rs));
end
else if (ts.Strings[0]='chat_off') then //接受网络的用户离开时的消息
begin
with form_chat.finduserbyip(ABinding.PeerIP) do
begin
if checked then
begin
msg:=''+formatdatetime('yy-mm-dd hh:mm:ss',now)+' 用户离开 ';
msg:=msg+form_main.get_user_infostring(caption,subitems.Strings[0],subitems.Strings[1],ABinding.PeerIP)+#13#10;
subitems.Strings[4]:=inttostr(strtoint(subitems.Strings[4])+1);
msg:=msg+httpdecode(ts.Strings[1])+#13#10+#13#10;
form_main.writemsg(msg);
if not tim_flasicon.Enabled then
tim_flasicon.Enabled:=true;
form_main.playsound('message');
rs:='ok';
end
else
begin
rs:='';
end;
end;
ABinding.SendTo(ABinding.PeerIP, ABinding.PeerPort, rs[1], Length(rs));
end
else if (ts.Strings[0]='getfile') then
begin
with form_chat.finduserbyip(ABinding.PeerIP) do
begin
rs:='';
if checked then
begin
msg:=''+formatdatetime('yy-mm-dd hh:mm:ss',now)+' 文件接收 ';
msg:=msg+form_main.get_user_infostring(caption,subitems.Strings[0],subitems.Strings[1],ABinding.PeerIP)+#13#10;
subitems.Strings[4]:=inttostr(strtoint(subitems.Strings[4])+1);
msg:=msg+'注意:来自网络的文件可能含有有害信息,请先对文件进行病毒检查再打开!'+#13#10+'接收时可直接点击“接收”,或在“接受”上点右键,选择“目标另存为”,或者使用下载工具下载。'+#13#10;
msg:=msg+'文件:'+#13#10;
tfile:=Tstringlist.Create;
tfile.Text:=httpdecode(ts.Strings[1]);
for i:=1 to tfile.Count do
begin
if tfile.Strings[i-1]<>'' then
begin
filename:=extractfilename(httpdecode(tfile.Strings[i-1]));
msg:=msg+''+filename+' )+']接收'+''+#13#10;
end;
end;
tfile.Destroy;
msg:=msg+#13#10;
form_main.writemsg(msg);
if not tim_flasicon.Enabled then
tim_flasicon.Enabled:=true;
form_main.playsound('message');
rs:='ok';
form_main.responsestatus(ABinding.PeerIP);
end;
ABinding.SendTo(ABinding.PeerIP, ABinding.PeerPort, rs[1], Length(rs));
end;
end
else if (ts.Strings[0]='file') then //文件访问
begin
//showmessage(ts.Strings[0]);
if fileexists(ts.Strings[1]) {and (pos(ts.Strings[1],alwdownfilelist.Text)<>0)} then
begin
//showmessage(ts.Strings[0]);
zeromemory(@buf,sizeof(buf));
p:=strtoint(ts.Strings[2]);
buf.pos:=p;
filestr:=Tfilestream.Create(ts.Strings[1],fmOpenRead);
buf.size:=filestr.Size;
filestr.Position:=(p-1)*sizeof(buf.buf);
filestr.Read(buf.buf,sizeof(buf.buf));
filestr.Destroy;
ABinding.SendTo(ABinding.PeerIP, ABinding.PeerPort, buf, sizeof(buf));
end;
end
else
begin
rs:='';
ABinding.SendTo(ABinding.PeerIP, ABinding.PeerPort, rs[1], Length(rs));
end;


ts.Free;
except
end;
dstream.Destroy;
udpbusy:=false;
end;
 
http部分
procedure Tform_main.idhtpCommandGet(AThread: TIdPeerThread;
ARequestInfo: TIdHTTPRequestInfo; AResponseInfo: TIdHTTPResponseInfo);
var
filename:string;
begin

if copy(arequestinfo.Document,0,6)='/file/' then
begin
filename:=httpdecode(ARequestInfo.QueryParams);
if fileexists(filename) and (pos(filename,alwdownfilelist.Text)<>0) then
begin
aresponseinfo.ContentType:='file';
idhtp.ServeFile(Athread,Aresponseinfo,httpdecode(ARequestInfo.QueryParams));
end
else
Aresponseinfo.ResponseNo:=404;

end
else if arequestinfo.Document='/chat_main' then
begin
aresponseinfo.ContentText:=pp_chat_main.Content;
end
else if arequestinfo.Document='/chat_script' then
begin
aresponseinfo.ContentText:=pp_chat_script.Content;
end
else
Aresponseinfo.Redirect('http://www.iamy.net');
end;
 
很好,可以拿去卖钱了
 
请下载最新版本
 
后退
顶部