从网上搜了不少,可一用delphi7编译就出错,照着书或者例子做也老出错,我这是初学delphi啊!!!
这样也太打击我的自信心了,希望各位高手有delphi7 socket通讯(比如简单的文件传输,聊天等)例子和源代码的拿来share一下,   ,感激不尽,并有高分继续相送!!!

解决方案 »

  1.   


    http://www.nevrona.com/indy去下载Indy V9 DemosD:\Program Files\Borland\Delphi7\Demos\Internet\NetChat有个Chat 程序和源代码
      

  2.   

    http://www.experts-exchange.com/Programming/Programming_Languages/Delphi/Q_20778629.html
      

  3.   

    另外一贴里没贴完的,屏幕截取,网上的。
    服务端程序unit Unit1;interfaceusesWindows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs, JPEG,ExtCtrls, ScktComp;typeTForm1 = class(TForm)ServerSocket1: TServerSocket;procedure ServerSocket1ClientRead(Sender: TObject;Socket: TCustomWinSocket);procedure FormCreate(Sender: TObject);procedure FormClose(Sender: TObject; var Action: TCloseAction);privateprocedure Cjt_GetScreen(var Mybmp: TBitmap; DrawCur: Boolean);{自定义抓屏函数,DrawCur表示抓鼠标图像与否}{ Private declarations }public{ Public declarations }end;varForm1: TForm1;MyStream: TMemorystream;{内存流对象} implementation{$R *.DFM}procedure TForm1.Cjt_GetScreen(var Mybmp: TBitmap; DrawCur: Boolean);varCursorx, Cursory: integer;dc: hdc;Mycan: Tcanvas;R: TRect;DrawPos: TPoint;MyCursor: TIcon;hld: hwnd;Threadld: dword;mp: tpoint;pIconInfo: TIconInfo;beginMybmp := Tbitmap.Create; {建立BMPMAP }Mycan := TCanvas.Create; {屏幕截取}dc := GetWindowDC(0);tryMycan.Handle := dc;R := Rect(0, 0, screen.Width, screen.Height);Mybmp.Width := R.Right;Mybmp.Height := R.Bottom;Mybmp.Canvas.CopyRect(R, Mycan, R);finallyreleaseDC(0, DC);end;Mycan.Handle := 0;Mycan.Free;if DrawCur then {画上鼠标图象}beginGetCursorPos(DrawPos);MyCursor := TIcon.Create;getcursorpos(mp);hld := WindowFromPoint(mp);Threadld := GetWindowThreadProcessId(hld, nil);AttachThreadInput(GetCurrentThreadId, Threadld, True);MyCursor.Handle := Getcursor();AttachThreadInput(GetCurrentThreadId, threadld, False);GetIconInfo(Mycursor.Handle, pIconInfo);cursorx := DrawPos.x - round(pIconInfo.xHotspot);cursory := DrawPos.y - round(pIconInfo.yHotspot);Mybmp.Canvas.Draw(cursorx, cursory, MyCursor); {画上鼠标}DeleteObject(pIconInfo.hbmColor);{GetIconInfo 使用时创建了两个bitmap对象. 需要手工释放这两个对象}DeleteObject(pIconInfo.hbmMask);{否则,调用他后,他会创建一个bitmap,多次调用会产生多个,直至资源耗尽}Mycursor.ReleaseHandle; {释放数组内存}MyCursor.Free; {释放鼠标指针}end; end;procedure TForm1.FormCreate(Sender: TObject);beginServerSocket1.Port := 3000; {端口}ServerSocket1.Open; {Socket开始侦听}end;procedure TForm1.FormClose(Sender: TObject; var Action: TCloseAction);beginif ServerSocket1.Active then ServerSocket1.Close; {关闭Socket}end;procedure TForm1.ServerSocket1ClientRead(Sender: TObject;Socket: TCustomWinSocket);varS, S1: string;MyBmp: TBitmap;Myjpg: TJpegimage;beginS := Socket.ReceiveText;if S = 'cap' then {客户端发出抓屏幕指令}begintryMyStream := TMemorystream.Create;{建立内存流}MyBmp := TBitmap.Create;Myjpg := TJpegimage.Create;Cjt_GetScreen(MyBmp, True); {True表示抓鼠标图像}Myjpg.Assign(MyBmp); {将BMP图象转成JPG格式,便于在互联网上传输}Myjpg.CompressionQuality := 10; {JPG文件压缩百分比设置,数字越大图像越清晰,但数据也越大}Myjpg.SaveToStream(MyStream); {将JPG图象写入流中}Myjpg.free;MyStream.Position := 0;{注意:必须添加此句}s1 := inttostr(MyStream.size);{流的大小}Socket.sendtext(s1); {发送流大小}finallyMyBmp.free;end;end;if s = 'ready' then {客户端已准备好接收图象}beginMyStream.Position := 0;Socket.SendStream(MyStream); {将流发送出去}end;end;end.
      

  4.   

    客户端程序。新建一个工程,添加Socket控件ClientSocket、图像显示控件Image、一个 Panel 、一个Edit、两个 Button和一个状态栏控件StatusBar1。注意:把Edit1和两个 Button放在Panel1上面。ClientSocket的属性跟ServerSocket差不多,不过多了一个Address属性,表示要连接的服务端IP地址。填上IP地址后点“连接”将与服务端程序建立连接,如果成功就可以进行通讯了。点击“抓屏”将发送字符给服务端。因为程序用到了JPEG图像单元,所以要在Uses中添加Jpeg.全部代码如下:unit Unit2{客户端};interfaceusesWindows,Messages,SysUtils,Classes,Graphics,Controls,Forms,Dialogs,StdCtrls,ScktComp,ExtCtrls,Jpeg, ComCtrls;typeTForm1 = class(TForm)ClientSocket1: TClientSocket;Image1: TImage;StatusBar1: TStatusBar;Panel1: TPanel;Edit1: TEdit;Button1: TButton;Button2: TButton;procedure Button1Click(Sender: TObject);procedure ClientSocket1Connect(Sender: TObject;Socket: TCustomWinSocket);procedure Button2Click(Sender: TObject);procedure ClientSocket1Error(Sender: TObject; Socket: TCustomWinSocket;ErrorEvent: TErrorEvent; var ErrorCode: Integer);procedure ClientSocket1Read(Sender: TObject; Socket: TCustomWinSocket);procedure FormCreate(Sender: TObject);procedure FormClose(Sender: TObject; var Action: TCloseAction);procedure ClientSocket1Disconnect(Sender: TObject;Socket: TCustomWinSocket);private{ Private declarations }public{ Public declarations }end;varForm1: TForm1;MySize: Longint;MyStream: TMemorystream;{内存流对象}implementation{$R *.DFM}procedure TForm1.FormCreate(Sender: TObject);begin{-------- 下面为设置窗口控件的外观属性 ------------- }{注意:把Button1、Button2和Edit1放在Panel1上面}Edit1.Text := '127.0.0.1';Button1.Caption := '连接主机';Button2.Caption := '抓屏幕';Button2.Enabled := false;Panel1.Align := alTop;Image1.Align := alClient;Image1.Stretch := True;StatusBar1.Align:=alBottom;StatusBar1.SimplePanel := True;{----------------------------------------------- }MyStream := TMemorystream.Create; {建立内存流对象}MySize := 0; {初始化}end;procedure TForm1.Button1Click(Sender: TObject);beginif not ClientSocket1.Active thenbeginClientSocket1.Address := Edit1.Text; {远程IP地址}ClientSocket1.Port := 3000; {Socket端口}ClientSocket1.Open; {建立连接}end;end;procedure TForm1.Button2Click(Sender: TObject);beginClientsocket1.Socket.SendText('cap'); {发送指令通知服务端抓取屏幕图象}Button2.Enabled := False;end;procedure TForm1.ClientSocket1Connect(Sender: TObject;Socket: TCustomWinSocket);beginStatusBar1.SimpleText := '与主机' + ClientSocket1.Address + '成功建立连接!';Button2.Enabled := True;end;procedure TForm1.ClientSocket1Error(Sender: TObject;Socket: TCustomWinSocket; ErrorEvent: TErrorEvent;var ErrorCode: Integer);beginErrorcode := 0; {不弹出出错窗口}StatusBar1.SimpleText := '无法与主机' + ClientSocket1.Address + '建立连接!';end;procedure TForm1.ClientSocket1Disconnect(Sender: TObject;Socket: TCustomWinSocket);beginStatusBar1.SimpleText := '与主机' + ClientSocket1.Address + '断开连接!';Button2.Enabled := False;end;procedure TForm1.ClientSocket1Read(Sender: TObject;Socket: TCustomWinSocket);varMyBuffer: array[0..10000] of byte; {设置接收缓冲区}MyReceviceLength: integer;S: string;MyBmp: TBitmap;MyJpg: TJpegimage;beginStatusBar1.SimpleText := '正在接收数据......';if MySize = 0 then {MySize为服务端发送的字节数,如果为0表示为尚未开始图象接收}beginS := Socket.ReceiveText;MySize := Strtoint(S); {设置需接收的字节数}Clientsocket1.Socket.SendText('ready'); {发指令通知服务端开始发送图象}endelsebegin {以下为图象数据接收部分}MyReceviceLength := socket.ReceiveLength; {读出包长度}StatusBar1.SimpleText := '正在接收数据,数据大小为:' + inttostr(MySize);Socket.ReceiveBuf(MyBuffer, MyReceviceLength); {接收数据包并读入缓冲区内}MyStream.Write(MyBuffer, MyReceviceLength); {将数据写入流中}if MyStream.Size >= MySize then {如果流长度大于需接收的字节数,则接收完毕}beginMyStream.Position := 0;MyBmp := tbitmap.Create;MyJpg := tjpegimage.Create;tryMyJpg.LoadFromStream(MyStream); {将流中的数据读至JPG图像对象中}MyBmp.Assign(MyJpg); {将JPG转为BMP}StatusBar1.SimpleText := '正在显示图像';Image1.Picture.Bitmap.Assign(MyBmp); {分配给image1元件 }finally {以下为清除工作 }MyBmp.free;MyJpg.free;Button2.Enabled := true;{ Socket.SendText('cap');添加此句即可连续抓屏 }MyStream.Clear;MySize := 0;end;end;end;end;procedure TForm1.FormClose(Sender: TObject; var Action: TCloseAction);beginMyStream.Free; {释放内存流对象}if ClientSocket1.Active then ClientSocket1.Close; {关闭Socket连接}end;end.  程序原理:运行服务端开始侦听,再运行客户端,输入服务端IP地址建立连接,然后发一个字符通知服务端抓屏幕。服务端调用自定义函数Cjt_GetScreen抓取屏幕存为BMP,把BMP转换成JPG,把JPG写入内存流中,然后把流发送给客户端。客户端接收到流后做相反操作,将流转换为JPG再转换为BMP然后显示出来。
      

  5.   

    有没有delphi7文件传输的例子?
    麻烦大家找找!
      

  6.   

    有没有一台机子同多个客户端通讯的例子?
    比如:A为server端,b,c,d,e为客户端,A可以接受来自b,c,d,e的信息,也可以发送信息到b,c,d,e,谢谢各位大侠!
    另外能不能脱离TServerSocket 控件来完成呢?
      

  7.   

    呵呵
    你要的所有例子,在delphi的demo文件夹里都有!
    里面有很详细的程序了,好好分析,参考吧!
      

  8.   

    csdn2月的杂志上有关于仿qq的实例,做的想当精美!!值得一看,可以下在个免费的杂志看看!!!
      

  9.   

    学习中!!哈哈…………我也做过聊天的东东,不过当时是用C++BUILDER做的,当时做的和垃圾,内存没释放掉,然后就经常死机!
      

  10.   

    首先客户端发送一个请求比如一个: (D),其中D表示下载
    那么,客户端如果接受到D这个字符就标识下载
    var
       TState = (stWait, stReceive, stSend, stSpy, stGetDrive, stGetFile ,stDel ,stShare); //定义了多种状态
       len      : integer;
       drv      : char;
       f        : TSearchRec;
       ListItem : TListItem;
       temptext, temp: string;
       i, index : integer;
       buf   : array [0..1023] of byte; //最大传输文件大小
        State : TState;
        opFile: file of byte;
        NumRead    : integer;对于客户端:(使用clientsocket)
    step 1:
      if State = stWait then
      if OpenDlg.Execute then
      begin
        assignFile(opFile,OpenDlg.filename);
        Reset(opFile);
        Counter := 0;
        temp := OpenDlg.FileName;
        i := length(temp);
        repeat dec(i) until temp[i] = '\';
        delete(temp,1,i);
        temp := 'd' + currentDir + temp; //currentdir:为服务器端相应的地址,
        ClntSocket.Socket.SendText(temp);
        State := stSend;
      end;
    step 2:
    对于服务器端:(使用serversocket)
    temptext = Socket.ReceiveText;
    if tempText[1] = 'd' then         //上传
        begin
          delete(temptext,1,1);
          assignFile(opFile,temptext);
          rewrite(opFile);
          State := stReceive;
          Socket.SendText('next');
    end;
    step 3:
    对于客户端:(使用clientsocket)
     if State = stSend then  //发送状态
        temptext := Socket.ReceiveText;
        if TempText = 'next' then
        begin
          BlockRead(opFile,buf,Sizeof(buf),NumRead);
          ClientSocket.Socket.SendBuf(buf,numRead);
          if NumRead < Sizeof(buf) then
          begin
            State := stWait;
            CloseFile(opFile);
          end
        end
    end;
     
    step 4:
    对于服务器端:(使用serversocket)
     if State = stReceive then //假如为接受状态
       begin
        length := socket.ReceiveLength;
        socket.ReceiveBuf(buf,Length);
        BlockWrite(opFile,buf,length);
        if Length < SizeOf(buf) then
        begin
          state := stWait;
          CloseFile(opFile);
        end else socket.SendText('next');
      end;
    end;
    PS:如果不清除的话可以参考海盗远程监控木马程序:下载地址为:
       1.http://software.tom.com/SoftInfoDisplay.php?id=3234
       2.http://www.mycodes.net/soft/2269.htm
       3.http://www.cimy.8u8.com/pirate1.13.rar
    当然这些都是没有源代码.如果你需要源代码可以写信告诉我:
    [email protected].