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 错误 不知道是哪里的问题
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 错误 不知道是哪里的问题
刚学 很多都不懂不知道哪位大虾米有用winsock写的chat
不要用网络控件的
如果闲分少可以在加点~``
delphi的winsock程序除了一点点语法不一样外,调用的函数名,参数这些都是一样的。