一个Socket局域网通信程序的问题(100分)

  • 主题发起人 主题发起人 Jelly0228
  • 开始时间 开始时间
J

Jelly0228

Unregistered / Unconfirmed
GUEST, unregistred user!
想用Socket技朮写一个局域网通信程序。主要功能是要实现能在所在安装了该程序的机器间相互进行通信(发送信息﹑传送文件)。
我的设计思路为﹕当程序运行后﹐即默认为Server端﹐可以接收各Client端的信息﹔当需要发送信息给局域网内其它人时﹐则动态将其变为Client端﹐信息发送完后再修改为Server端。
问题就出在这里﹕因为我在发送信息的时候已经变为了Client端﹐那是不是在发送信息的这段时间里﹐我不能收到从其它Client发送过来的信息??
不知我的思路是否正确﹐请各位大虾请点一二。

先谢了﹗
 
晕,服务端也可以发数据丫,只要判断链接是否一直有效就行了.
 
唉丫唉丫﹐lxs000兄说得极是﹐刚刚试了一下﹐TclientSocket和TserverSocket可以同时激活的。那幺﹐这个问题就不是问题了。我想顺便请教一下﹐怎样实现传送档案丫??最好给出一个详细一点的代码﹐别一句SendBuf就OK了丫~~

谢了谢了﹗
 
楼上的,没有那么简单,我研究了两个星期没有研究出来啊.
 
嗯﹐刚好我现在也在研究这个问题﹐到时谁弄出来谁要分享出来啊~~
 
哪位大虾能给出一个用Socket传送文件的例子??给点思路也好。问题解决﹐马上结贴。
 
我认为这个问题不应该问,
应该自己查看资料和文档后,
仔细思考做出来。
动不动就要代码看似快实际慢。
没经过自己仔细思考
对知识的理解就不会那么深刻。
 
楼上说的颇有道理啊!!看文档资料才是真正的程序员啊!!看代码看是快,其实是,很慢的一种学习方法。
你要代码,那还不如找家公司帮你做一个,什么都解决拉。
 
杂个你们老在这种问题上饶来饶去,使用多进程可以解决!我开发的<千里马烟草数据传输系统>
可以解决啊!需要就发email: zsp586@sohu.com
 
不知道你是用什么控件什么连接方法,不过建议用TCP啦,不用写太多代码控制流量和纠错,我建议应该是这样:写一个专门的服务器做中转,其他的都做成客户端。用户发消息和传文件都是通过服务器中转。
 
偶做了一个传送文件的例子,是用WinSock做的;

http://www.aidelphi.com/ShowTopic.asp?TopicID=449&amp;PageIDX=1&amp;SpaceID=37

同时有一个用Indy中TIdUDPClient控件和TIdUDPServer做的:

http://www.aidelphi.com/ShowTopic.asp?TopicID=1173&amp;PageIDX=1&amp;SpaceID=37

一个利用TNMUDP控件实现远程抓屏的Demo(其实只是传送图片的):

http://www.aidelphi.com/ShowTopic.asp?TopicID=450&amp;PageIDX=1&amp;SpaceID=37
 
客户端程序也建立监听的socket,而服务器端也建立发送的client的socket就行了,没细看,反正以前的贴子多多
 
#Socket Error 10061是什么意思/如何解决阿?
 
非常感谢各位的参与以及讨论。
我参照网上的一个例子写好了一个。写好之后才发现中了一个致命的缺点﹕我没有写在线程里﹐结果是当传送大文件的时候﹐整个程序都好象停在那儿一样了。所以我现在需要改成多线程的。
我用Socket传送文件得采用Client与Server一问一答的方式﹐整个过程大致这样(一定是Client传送给Server)﹕
1. Client发送信息通知Server﹕我要传送文件了;
2. Server收到通知后再通知Client﹕我准备好了;
3. Client收到通知后开始传送文件﹔
4. Server接收完毕后再告诉Client接收完了﹔
5. Client接到”接收完毕”后的通知再作其它处理…..

在这五个步骤缺一不可的前提下﹐如何改成多线程?给点提示﹑建议吧~~

给此贴再加100分
 
我試著自己寫了一個多線程傳送文件的程式﹐能編譯通過﹐問題就是不知道為什么不能跑到Server端去﹗
下面是源碼﹐很簡單的﹐請大蝦幫我看看。我所用的控件名稱都沒有改的﹐所以你要調試也很方便。但是要將ClientSocket1的ClientType設為ctBlocking,ServerSocket1的ServerType設為stThreadBlocking。
還有﹐我也知道這個程序現在還不能在不同機器間傳送﹐這都沒有關系﹐我只要能在同一台上傳送文件就行了﹗

問題一旦搞掂﹐共200分相送!

unit Unit1;

interface

uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, StdCtrls, ScktComp;

type
TForm1 = class(TForm)
ClientSocket1: TClientSocket;
ServerSocket1: TServerSocket;
Button1: TButton;
OpenDialog1: TOpenDialog;
procedure FormCreate(Sender: TObject);
procedure Button1Click(Sender: TObject);
procedure ServerSocket1GetThread(Sender: TObject;
ClientSocket: TServerClientWinSocket;
var SocketThread: TServerClientThread);
private
{ Private declarations }
public
{ Public declarations }
end;

ClientStread=class(TThread)
protected
procedure GetFileFromStream;
procedure Execute;override;
end;

ServerStread=class(TServerClientThread)
public
procedure ClientExecute;override;
end;

var
Form1: TForm1;
FF: String;

implementation

{$R *.dfm}

procedure TForm1.FormCreate(Sender: TObject);
begin
ServerSocket1.Active:=True;
ClientSocket1.Active:=False;
end;

{ TClientStread }

procedure ClientStread.Execute;
begin
inherited;
FreeOnTerminate:= True;
Synchronize(GetFileFromStream);
end;

procedure ClientStread.GetFileFromStream;
var
S: TWinSocketStream;
F: TFileStream;
FN: String;
// Buf: Pointer;
begin
with Form1.OpenDialog1 do
begin
Execute;
if FileName<>'' then
begin
FN:=FileName;
FF:=ExtractFileName(FN);
Form1.ClientSocket1.Host:='172.17.8.205';
Form1.ClientSocket1.Active:=True;
S:=TWinSocketStream.Create(Form1.ClientSocket1.Socket,60000);
F:=TFileStream.Create(FN,fmOpenRead or fmShareDenyNone);

try
S.CopyFrom(F,0);
{ GetMem(Buf,F.size);
F.Seek(0,soFromBeginning);
F.ReadBuffer(Buf^,F.Size); }
finally
S.Free;
F.Free;
// Form1.ClientSocket1.Active:=False;
end; //End Try

end; //End if FileName<>'' then
end; //End with Form1.OpenDialog1 do
end;

procedure TForm1.Button1Click(Sender: TObject);
begin
ClientStread.Create(False);
end;


{ ServerStread }

procedure ServerStread.ClientExecute;
var
RBuf: Array [0..4095] of char;
S: TWinSocketStream;
F: TFileStream;
BytesRead:Integer;
begin
inherited;
While (not Terminated) and (ClientSocket.Connected) do
begin
try
S:= TWinSocketStream.Create(ClientSocket,60000);
F:= TFileStream.Create('C:/'+FF,fmCreate);
try
FillChar(RBuf,10,0);
if S.WaitForData(5000) then
Repeat
BytesRead:=S.Read(RBuf,SizeOf(RBuf));
if BytesRead=0 then
ClientSocket.Close
else F.WriteBuffer(RBuf,BytesRead);
Until Not S.WaitForData(2000);
finally
S.Free;
ClientSocket.Close;
F.Free;
end; //End try finally
except
HandleException;
end; //End try except
end;

end;

procedure TForm1.ServerSocket1GetThread(Sender: TObject;
ClientSocket: TServerClientWinSocket;
var SocketThread: TServerClientThread);
begin
SocketThread:= TServerClientThread.Create(False,ClientSocket);
end;

end.
 
Sorry﹐我還是將這個問題分開另開貼。
幫助我請到這兒﹕http://www.delphibbs.com/delphibbs/dispq.asp?lid=2220464
 
filename:='c:/aaa.exe'
buf:=Tmemorystream.create;
buf1:=Tmemorystream.create;
buf1.loadfile(filename);
buf.writebuffer(filename[1],length(filename));
buf.copystream(buf1,buf.size);
clientsocket1.sendstream(buf);
clientsocket.disconnect; 成功的例子
 
東方鐵哥﹐
謝謝你的例子﹐不過我需要的是在線程傳送與接收文件。
 
后退
顶部