unit Unit1;interfaceuses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs,winsock2, StdCtrls;type
  TForm1 = class(TForm)
    Edit1: TEdit;
    Memo1: TMemo;
    Button1: TButton;
    procedure FormCreate(Sender: TObject);
    procedure Button1Click(Sender: TObject);
  private
    { Private declarations }
  public
    { Public declarations }
  end;
const bufsize=1024;
var
  Form1: TForm1;
  wd:Twsadata;
  server:Tsocket;
  ca:TsockADDrIn;
  ip:pchar;
  port:integer;
  buf:array[0..bufsize]of string;
  flag:boolean;implementation{$R *.dfm}
uses unit2;
var T1:Trecv;
procedure TForm1.FormCreate(Sender: TObject);
begin
flag:=false;
if WSAStartup($0101,wd)<>0 then exit;
server:=socket(pf_inet,sock_stream,ipproto_ip);
if server=invalid_socket then exit;
port:=1304;
ip:='127.0.0.1';
ca.sin_family :=pf_inet;
ca.sin_port   :=htons(port);
ca.sin_addr.S_addr:=inet_addr(ip);
if connect(server, @ca ,sizeof(ca))<>0 then
exit
else flag:=true;end;procedure TForm1.Button1Click(Sender: TObject);
var buf:array[0..1] of string;
begin
if flag then
  begin  T1:=Trecv.create(true);
  T1.memo2:=memo1;
  T1.Resume;  //Trecv.create(false);
  buf[0]:=edit1.text;
  send(server,buf,sizeof(buf)+1,0);
 // memo1.Lines.Add('wo:'+buf[0]);
  end
else
  showmessage('Please connect!!!');
end;end.
///////////////////////////////////////////////////////////
unit Unit2;interfaceuses
  Classes,unit1,StdCtrls,winsock2;type
  Trecv = class(TThread)
  private
    { Private declarations }
    rebuf:array[0..1]of string;
  protected
    procedure Execute; override;
    procedure Addmesg;
  public
    memo2:Tmemo;
    constructor create(suspends:boolean);  end;implementation
procedure Trecv.Addmesg;
  begin
  memo2.Lines.Add(rebuf[0])
  end;
constructor Trecv.create(suspends:boolean);
   begin
   inherited create(suspends);
   end;{ Important: Methods and properties of objects in visual components can only be
  used in a method called using Synchronize, for example,      Synchronize(UpdateCaption);  and UpdateCaption could look like,    procedure Trecv.UpdateCaption;
    begin
      Form1.Caption := 'Updated in a thread';
    end; }{ Trecv }procedure Trecv.Execute;
begin
  { Place thread code here }
  while flag do
  begin
  recv(server,rebuf,sizeof(rebuf),0);
  //form1.Memo1.Lines.Add(rebuf[0]);
  synchronize(Addmesg);
  end;
end;end.
老提示EAccessviolation 错误  不知道是哪里的问题

解决方案 »

  1.   

    恩  memo2没create  但修改了下还不是行  又有新的错误产生感觉整个都乱糟糟的一团 
    刚学 很多都不懂不知道哪位大虾米有用winsock写的chat 
    不要用网络控件的 
    如果闲分少可以在加点~``
      

  2.   

    一般都用的indy组件,如果不用,你找点C++写的winsock,就知道怎么写了
    delphi的winsock程序除了一点点语法不一样外,调用的函数名,参数这些都是一样的。