高分问题,大家都来看看(里面有金字函数,免费赠送),我不知道错在哪里?(100分)

H

hhddff

Unregistered / Unconfirmed
GUEST, unregistred user!
看以下程序怎么解决,我是用ClientSocket和ServerSocket来实现传送抓屏数据。<br>我用ServerSocket往ClientSocket发送图象数据成功,但是<br>我用ClientSocket往ServerSocket发送图象数据但是有问题,请高手解决一下。<br>我的程序发送一半就出问题,显示 Error jpeg#52。<br>我很急!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!<br>Client数据<br>unit Clientfrm;<br><br>interface<br><br>uses<br>&nbsp; Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,<br>&nbsp; Dialogs, ScktComp,jpeg, StdCtrls;<br><br>type<br>&nbsp; TfrmClient = class(TForm)<br>&nbsp; &nbsp; Memo1: TMemo;<br>&nbsp; &nbsp; Edit1: TEdit;<br>&nbsp; &nbsp; Button1: TButton;<br>&nbsp; &nbsp; ClientSocket1: TClientSocket;<br>&nbsp; &nbsp; procedure FormCreate(Sender: TObject);<br>&nbsp; &nbsp; procedure FormClose(Sender: TObject; var Action: TCloseAction);<br>&nbsp; &nbsp; procedure Button1Click(Sender: TObject);<br>&nbsp; &nbsp; procedure ClientSocket1Connect(Sender: TObject;<br>&nbsp; &nbsp; &nbsp; Socket: TCustomWinSocket);<br>&nbsp; &nbsp; procedure ClientSocket1Error(Sender: TObject; Socket: TCustomWinSocket;<br>&nbsp; &nbsp; &nbsp; ErrorEvent: TErrorEvent; var ErrorCode: Integer);<br>&nbsp; &nbsp; procedure ClientSocket1Read(Sender: TObject; Socket: TCustomWinSocket);<br>&nbsp; &nbsp; procedure Button2Click(Sender: TObject);<br>&nbsp; private<br>&nbsp; &nbsp; { Private declarations }<br>&nbsp; public<br>&nbsp; &nbsp; { Public declarations }<br>&nbsp; end;<br><br>var<br>&nbsp; frmClient: TfrmClient;<br>&nbsp; &nbsp; c:longint;<br>&nbsp; m:tmemorystream;<br>&nbsp; m1:tmemorystream;<br><br>implementation<br><br>{$R *.dfm}<br><br><br>procedure TfrmClient.FormCreate(Sender: TObject);<br>begin<br>&nbsp; &nbsp;m:=tmemorystream.Create;<br>end;<br><br>procedure TfrmClient.FormClose(Sender: TObject; var Action: TCloseAction);<br>begin<br>&nbsp; m.free;<br>&nbsp; ClientSocket1.Close;<br>end;<br><br>procedure TfrmClient.Button1Click(Sender: TObject);<br>begin<br>&nbsp; try<br>&nbsp; &nbsp; &nbsp;clientsocket1.Close;<br>&nbsp; &nbsp; &nbsp;clientsocket1.Host := edit1.text;<br>&nbsp; &nbsp; &nbsp;clientsocket1.Open; //file://连接服务端<br>&nbsp; except<br>&nbsp; &nbsp; &nbsp;showmessage(edit1.text+#13#10+'未开机或未安装服务程序');<br>&nbsp; end;<br>end;<br><br>procedure TfrmClient.ClientSocket1Connect(Sender: TObject;<br>&nbsp; Socket: TCustomWinSocket);<br>begin<br>&nbsp; &nbsp; &nbsp; &nbsp; memo1.Lines.Add('ok'); <br>end;<br><br>procedure TfrmClient.ClientSocket1Error(Sender: TObject;<br>&nbsp; Socket: TCustomWinSocket; ErrorEvent: TErrorEvent;<br>&nbsp; var ErrorCode: Integer);<br>begin<br>&nbsp; &nbsp;caption:='连接'+edit1.text+'失败';<br>&nbsp; &nbsp;showmessage(edit1.text+#13#10+'未开机或未安装服务程序');<br>&nbsp; &nbsp;errorcode:=0;<br>end;<br><br>procedure TfrmClient.ClientSocket1Read(Sender: TObject;<br>&nbsp; Socket: TCustomWinSocket);<br>var<br>&nbsp; s,s1:string;<br>&nbsp; desk:tcanvas;<br>&nbsp; bitmap:tbitmap;<br>&nbsp; jpg:tjpegimage;<br>begin<br>&nbsp; s:=socket.ReceiveText;<br>&nbsp; memo1.lines.add(s);<br>&nbsp; if s='gets' then //file://客户端发出申请<br>&nbsp; begin<br>&nbsp; &nbsp;try<br>&nbsp; &nbsp; m1:=tmemorystream.Create;<br>&nbsp; &nbsp; bitmap:=tbitmap.Create;<br>&nbsp; &nbsp; jpg:=tjpegimage.Create;<br>&nbsp; &nbsp; desk:=tcanvas.Create; //以下代码为取得当前屏幕图象<br>&nbsp; &nbsp; desk.Handle:=getdc(hwnd_desktop);<br>&nbsp; &nbsp; with bitmap do<br>&nbsp; &nbsp; begin<br>&nbsp; &nbsp; &nbsp; &nbsp; width:=screen.Width;<br>&nbsp; &nbsp; &nbsp; &nbsp; height:=screen.Height;<br>&nbsp; &nbsp; &nbsp; &nbsp; canvas.CopyRect(canvas.cliprect,desk,desk.cliprect);<br>&nbsp; &nbsp; end;<br>&nbsp; &nbsp; jpg.Assign(bitmap); //file://将图象转成JPG格式<br>&nbsp; &nbsp; jpg.CompressionQuality:=10;//文件压缩大小设置<br>&nbsp; &nbsp; //m1.clear;<br>&nbsp; &nbsp; jpg.SaveToStream(m1); //file://将JPG图象写入流中<br>&nbsp; &nbsp; jpg.free;<br>&nbsp; &nbsp; m1.Position:=0;<br>&nbsp; &nbsp; s1:=inttostr(m1.size);<br>&nbsp; &nbsp; ClientSocket1.Socket.SendText('size/'+s1); //file://发送图象大小<br>&nbsp; &nbsp;finally<br>&nbsp; &nbsp; bitmap.free;<br>&nbsp; &nbsp; desk.free;<br>&nbsp; &nbsp;end;<br>&nbsp; end;<br>&nbsp; if s='okok' then //file://客户端已准备好接收图象<br>&nbsp; begin<br>&nbsp; &nbsp; m1.Position:=0;<br>&nbsp; &nbsp; ClientSocket1.Socket.SendStream(m1); //file://发送JPG图象<br>&nbsp; end;<br>&nbsp; //end; //附加<br>end;<br><br>procedure TfrmClient.Button2Click(Sender: TObject);<br>begin<br>&nbsp; &nbsp; &nbsp; &nbsp; ClientSocket1.Socket.SendText('ok');<br>end;<br><br>end.<br>//Server数据<br>unit ServerFrm;<br><br>interface<br><br>uses<br>&nbsp; Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,<br>&nbsp; Dialogs, StdCtrls, ScktComp, ExtCtrls,jpeg;<br><br>type<br>&nbsp; TfrnServer = class(TForm)<br>&nbsp; &nbsp; Image1: TImage;<br>&nbsp; &nbsp; Label1: TLabel;<br>&nbsp; &nbsp; Button2: TButton;<br>&nbsp; &nbsp; ServerSocket1: TServerSocket;<br>&nbsp; &nbsp; Memo1: TMemo;<br>&nbsp; &nbsp; procedure Button2Click(Sender: TObject);<br>&nbsp; &nbsp; procedure ServerSocket1ClientRead(Sender: TObject;<br>&nbsp; &nbsp; &nbsp; Socket: TCustomWinSocket);<br>&nbsp; &nbsp; procedure ServerSocket1ClientConnect(Sender: TObject;<br>&nbsp; &nbsp; &nbsp; Socket: TCustomWinSocket);<br>&nbsp; &nbsp; procedure FormCreate(Sender: TObject);<br>&nbsp; &nbsp; procedure FormClose(Sender: TObject; var Action: TCloseAction);<br>&nbsp; private<br>&nbsp; &nbsp; { Private declarations }<br>&nbsp; public<br>&nbsp; &nbsp; function GetMaskString(i:integer;s:string):string;<br>&nbsp; &nbsp; { Public declarations }<br>&nbsp; end;<br><br>var<br>&nbsp; frnServer: TfrnServer;<br>&nbsp; &nbsp; c:longint;<br>&nbsp; m:tmemorystream;<br>&nbsp; //m1:tmemorystream;<br>&nbsp; id: integer;<br><br>implementation<br><br>{$R *.dfm}<br><br>procedure TfrnServer.Button2Click(Sender: TObject);<br>var<br>&nbsp; &nbsp; &nbsp; &nbsp; Socket:TCustomWinSocket;<br>begin<br>&nbsp; &nbsp; &nbsp; &nbsp; Socket:=TCustomWinSocket.Create(id);<br>&nbsp; &nbsp; &nbsp; &nbsp; Socket.SendText('gets'); //file://发送申请,通知服务端需要屏幕图象<br>end;<br><br>procedure TfrnServer.ServerSocket1ClientRead(Sender: TObject;<br>&nbsp; Socket: TCustomWinSocket);<br>var<br>&nbsp; buffer:array [0..10000] of byte; //file://设置接收缓冲区<br>&nbsp; len:integer;<br>&nbsp; recvmsg,firstmsg,ll:string;<br>&nbsp; b:tbitmap;<br>&nbsp; j:tjpegimage;<br>begin<br>&nbsp; //if c=0 then //file://C为服务端发送的字节数,如果为0表示为尚未开始图象接收<br>&nbsp; //begin<br>&nbsp; len:=socket.ReceiveLength; //file://读出包长度<br>&nbsp; recvmsg := Socket.ReceiveText ;<br><br>&nbsp; firstmsg := GetMaskString(1,recvmsg);<br>&nbsp; if firstmsg = 'size' then<br>&nbsp; begin<br>&nbsp; &nbsp; ll:=GetMaskString(2,recvmsg);<br>&nbsp; &nbsp; memo1.Lines.Add('ll'+ll);<br>&nbsp; &nbsp; c:=strtoint(ll); //file://设置需接收的字节数<br>&nbsp; &nbsp; Socket:=TCustomWinSocket.Create(id);<br>&nbsp; &nbsp; Socket.SendText('okok'); //file://通知服务端开始发送图象<br>&nbsp; end<br>&nbsp; //end else<br>&nbsp; else begin //file://以下为图象数据接收部分<br>&nbsp; &nbsp; memo1.Lines.Add('len='+inttostr(len));<br>&nbsp; &nbsp; memo1.Lines.Add('c='+inttostr(c));<br>&nbsp; &nbsp; socket.ReceiveBuf(buffer,len); //file://接收数据包并读入缓冲区内<br>&nbsp; &nbsp; m.Write(buffer,len); //file://追加入流M中<br>&nbsp; &nbsp; if m.Size&gt;=c then //file://如果流长度大于需接收的字节数,则接收完毕<br>&nbsp; &nbsp; begin<br>&nbsp; &nbsp; &nbsp; &nbsp; m.Position:=0;<br>&nbsp; &nbsp; &nbsp; &nbsp; b:=tbitmap.Create;<br>&nbsp; &nbsp; &nbsp; &nbsp; j:=tjpegimage.Create;<br>&nbsp; &nbsp; &nbsp; &nbsp; try<br>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;j.LoadFromStream(m); //file://将流M中的数据读至JPG图像对象J中<br>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;b.Assign(j); //file://将JPG转为BMP<br>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;Image1.Picture.Bitmap.Assign(b); //file://分配给image1元件<br>&nbsp; &nbsp; &nbsp; &nbsp; finally //file://以下为清除工作<br>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;b.free;<br>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;j.free;<br>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;Serversocket1.Active:=false;<br>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;Serversocket1.Active:=true;<br>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;m.Clear;<br>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;c:=0;<br>&nbsp; &nbsp; &nbsp; &nbsp; end;<br>&nbsp; &nbsp; end;<br>&nbsp; end;<br>end;<br>procedure TfrnServer.ServerSocket1ClientConnect(Sender: TObject;<br>&nbsp; Socket: TCustomWinSocket);<br>begin<br>&nbsp; &nbsp; &nbsp; &nbsp; id := Socket.SocketHandle ;<br>&nbsp; &nbsp; &nbsp; &nbsp; memo1.Lines.Add('id='+inttostr(id));<br>end;<br><br>function TfrnServer.GetMaskString(i: integer; s: string): string;<br>var<br>&nbsp; itm:Tstringlist; //字符串列表<br>begin<br>&nbsp; &nbsp;itm:=tstringlist.Create;<br>&nbsp; &nbsp;itm.Delimiter:='/';<br>&nbsp; &nbsp;itm.DelimitedText:=s ;<br><br>&nbsp; &nbsp;if (i&gt;itm.Count) or (i&lt;1 ) then<br>&nbsp; &nbsp;begin<br>&nbsp; &nbsp; &nbsp;result:='';<br>&nbsp; &nbsp; &nbsp;itm.Free ;<br>&nbsp; &nbsp; &nbsp;exit;<br>&nbsp; &nbsp;end;<br><br>&nbsp; &nbsp;Result:=itm.strings[i-1];<br>&nbsp; &nbsp;itm.Free;<br>end;<br><br>procedure TfrnServer.FormCreate(Sender: TObject);<br>begin<br>&nbsp;m:=tmemorystream.Create;<br>&nbsp;ServerSocket1.open;<br>end;<br><br>procedure TfrnServer.FormClose(Sender: TObject; var Action: TCloseAction);<br>begin<br>&nbsp; ServerSocket1.close;<br>end;<br><br>end.<br>
 
有没有高手,来看看,请怎么回事?<br>为什么出错??????
 
没用过,不过印象中只能从Server发到Client你是不是在两边都开上一个Server和一个Clienth,我记得Delphi中的聊天程序就是这样做的
 
还用自己写,重复劳动。<br>以前好多人都写了,自己找找不要枉费精力。
 
你对Server有写的权限吗?<br>
 
自己动手,丰衣足食,不从基础干起,永远也成不了高手
 
jpeg Error #52是什么问题?<br>*******************************************************************<br>&nbsp;请问我从服务器往客户传数据流,就可以用,可以读出数据流<br>&nbsp; &nbsp; len:=socket.ReceiveLength; //file://读出包长度<br>&nbsp; &nbsp; socket.ReceiveBuf(buffer,len); //file://接收数据包并读入缓冲区内<br>&nbsp; &nbsp; m.Write(buffer,len); //file://追加入流M中<br>*******************************************************************<br>&nbsp;但是我从客户端往服务器发送数据流时,就不行。<br>&nbsp;是不是用TWinServerSocket,而不是用TCustomWinSocket。<br>&nbsp;服务器端的socket.ReceiveBuf(buffer,len); 总是出错,请问怎么解决?
 
我可以来回写,我用SendText可以来回传送Text,但是Stream就不行。
 
我对网络变成不熟,但看了一些聊天程序的例子,所有的例子都是开两个空间,我觉得总是有原因的吧?delhpi/demos下游例子,你自己看看吧!
 
有没有人做过,?
 
那是因为,你没有把发送的流完整正确的接收过来,接收的数据是错误的
 
请问怎么解决?
 
顶部