/ Forside / Teknologi / Udvikling / Delphi/Pascal / Nyhedsindlæg
Login
Glemt dit kodeord?
Brugernavn

Kodeord


Reklame
Top 10 brugere
Delphi/Pascal
#NavnPoint
oldwiking 603
jrossing 525
rpje 520
EXTERMINA.. 500
gandalf 460
gubi 270
DJ_Puden 250
PARKENSS 230
technet 210
10  jdjespers.. 200
Snakke sammen over lokalt net
Fra : Harald


Dato : 12-04-02 13:24

Hej

Jeg har et "server" program kørende på en bestemt PC på et lokalt netværk,
og så har jeg 1 eller flere "klient" programmer kørende på andre PC´er på
lokal nettet.

Server og klient programmerne har behov for at kunne sende beskeder til
hinanden, jeg har tænkt på at bruge TCP. Dvs. at hver gang et klient program
startes opretter det en TCP firbindelse til server programmet. På denne måde
ved server programmet hele tiden hvor mange klienter der er koblet på og kan
uden problemer sende en besked til dem alle.

Er det en måde at gøre det på eller findes der en smartere?

Mvh
HK




 
 
Ingolf (12-04-2002)
Kommentar
Fra : Ingolf


Dato : 12-04-02 18:31

Brug TCP/IP. Det er nok det smarteste. TCP/IP er efterhånden standarden
indenfor alt netværk. Men der selvfølgelig også IPX, men nok om det.

Jeg har engang lavet et program der snakkede sammen med klienter og server
gennem filer på disken. Dette krævede at jeg havde et delt dir, som alle
kunne få adgang til. Den først instans der startes op, fungerede som server.
De dertil startede instancer kommer op som klienter. Programmet virker
perfekt. Og man kunne sende beskeder til alle, eller individuelle
instancer.. sjovt at lave, men ikke en elegant løsning!!

Check Hori's DirectX extensions, og komponenter. Det er meget nemt at bruge:
http://www.yks.ne.jp/~hori/index-e.html

Her er koden til en Chat, som er et lille sample program til ovenstående
komponenter.

unit Main;

interface

uses
Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs,
StdCtrls, DXPlay, DirectX, Gauges,winbasic;

const
MaxActiveFiles = 100;

DXCHAT_MESSAGE = 0;
DXDATA_MESSAGE = 1;
DXREQ_SEND_MESSAGE = 2;

type
TDXChatMessage = record
MessageType: DWORD; { MessageType is absolutely necessary. }
Len: Integer;
C: array[0..0] of Char;
end;

TDXDATAMessage = record
MessageType: DWORD; { MessageType is absolutely necessary. }
Len: word;
data: array[0..0] of byte;
end;

datapointer = ^datatype;
datatype = array[0..65535] of byte;


type
TMainForm = class(TForm)
DXPlay1: TDXPlay;
Memo1: TMemo;
Edit1: TEdit;
Button1: TButton;
Button2: TButton;
CheckBox1: TCheckBox;
Label1: TLabel;
Label2: TLabel;
Label3: TLabel;
Label4: TLabel;
ListBox1: TListBox;
Label5: TLabel;
OpenDialog1: TOpenDialog;
Label6: TLabel;
Label7: TLabel;
Button3: TButton;
Button4: TButton;
Gauge1: TGauge;
procedure DXPlay1AddPlayer(Sender: TObject; Player: TDXPlayPlayer);
procedure DXPlay1DeletePlayer(Sender: TObject; Player: TDXPlayPlayer);
procedure FormDestroy(Sender: TObject);
procedure FormCreate(Sender: TObject);
procedure DXPlay1Message(Sender: TObject; Player: TDXPlayPlayer; Data:
Pointer;
DataSize: Integer);
procedure Button1Click(Sender: TObject);
procedure Edit1KeyDown(Sender: TObject; var Key: Word;
Shift: TShiftState);
procedure DXPlay1Open(Sender: TObject);
procedure MySendMEssage(PlayerID : integer; textmsg : string);
procedure Button2Click(Sender: TObject);
procedure MySendData(PlayerID : integer; data : datapointer; len :word);
procedure Button3Click(Sender: TObject);
procedure Button4Click(Sender: TObject);
Procedure RequestFileSend(PlayerID : integer; filetableindex : word);
end;

var
MainForm: TMainForm;
ioerr : integer;

implementation

{$R *.DFM}

procedure TMainForm.DXPlay1AddPlayer(Sender: TObject; Player:
TDXPlayPlayer);
begin
Memo1.Lines.Add(Format(' %s entered a room.', [Player.Name]));
end;

procedure TMainForm.DXPlay1DeletePlayer(Sender: TObject;
Player: TDXPlayPlayer);
begin
Memo1.Lines.Add(Format(' %s left a room.', [Player.Name]));
end;

procedure TMainForm.DXPlay1Open(Sender: TObject);
var
i: Integer;
begin
for i:=0 to DXPlay1.Players.Count-1 do
if DXPlay1.Players[i].RemotePlayer then
Memo1.Lines.Add(Format(' %s is entering a room.',
[DXPlay1.Players[i].Name]));
end;

procedure TMainForm.FormDestroy(Sender: TObject);
begin
DXPlay1.Close;
application.Terminate;
end;




procedure TMainForm.FormCreate(Sender: TObject);
begin
// TCP/IP init
try
DXPlay1.Open;
except
on E: Exception do
begin
Application.ShowMainForm := False;
Application.HandleException(E);
Application.Terminate;
end;
end;
MainForm.Caption := Format('%s : %s', [DXPlay1.ProviderName,
DXPlay1.SessionName]);


filemode:=0;
activefiles:=0;
randomize;

end;


procedure TMainForm.MySendMEssage(PlayerID : integer; textmsg : string);
var
Msg: ^TDXChatMessage;
MsgSize: Integer;
begin

MsgSize := SizeOf(TDXChatMessage)+Length(textmsg);
GetMem(Msg, MsgSize);
try
Msg.MessageType := DXCHAT_MESSAGE;
Msg.Len := Length(textmsg);
StrLCopy(@Msg^.c, PChar(textmsg), Length(textmsg));

{ The message is sent all. }
DXPlay1.SendMessage(PlayerID, Msg, MsgSize);

finally
FreeMem(Msg);
end;
end;



procedure TMainForm.MySendData(PlayerID : integer; data : datapointer; len :
word);
var
Msg: ^TDXDATAMessage;
MsgSize: Integer;
begin

MsgSize := SizeOf(TDXDATAMessage)+Len;
GetMem(Msg, MsgSize);
try
Msg.MessageType := DXDATA_MESSAGE;
Msg.Len := len;
move(data,msg^.data,len);
// StrLCopy(@Msg^.c, PChar(textmsg), Length(textmsg));

{ The message is sent. }
DXPlay1.SendMessage(PlayerID, Msg, MsgSize);

finally
FreeMem(Msg);
end;
end;


Procedure TMainForm.RequestFileSend(PlayerID : integer; filetableindex :
word);

var
Msg: ^TDXDATAMessage;
MsgSize: Integer;
tmpfilerec : filetablerec;
begin

MsgSize := SizeOf(TDXDATAMessage)+SizeOf(Filetablerec);
GetMem(Msg, MsgSize);
try
Msg.MessageType := DXREQ_SEND_MESSAGE;
Msg.Len := msgsize;
tmpfilerec:=filetable[filetableindex];
move(tmpfilerec,msg^.data,sizeof(filetablerec));
// StrLCopy(@Msg^.c, PChar(textmsg), Length(textmsg));

{ The message is sent. }
DXPlay1.SendMessage(PlayerID, Msg, MsgSize);

finally
FreeMem(Msg);
end;
end;




procedure TMainForm.DXPlay1Message(Sender: TObject; Player: TDXPlayPlayer;
Data: Pointer; DataSize: Integer);
var
s: string;
tel : word;
tmpfilerec : filetablerec;
offse : word;


begin
case DXPlayMessageType(Data) of
DXCHAT_MESSAGE:
begin
if TDXChatMessage(Data^).Len<=0 then
s := ''
else begin
SetLength(s, TDXChatMessage(Data^).Len);
StrLCopy(PChar(s), @TDXChatMessage(Data^).c, Length(s));
end;

memo1.Lines.Add('Message from PlayerID: '+inttostr(player.ID));
Memo1.Lines.Add(Format('%s> %s', [Player.Name, s]));

// MySendMessage(player.ID,'Message accepted!');
end;

DXDATA_MESSAGE:
begin



end;
DXREQ_SEND_MESSAGE:
begin // some user wants to send a file ... let him ?
offse:=sizeof(TDXDATAMessage);
move(data^,tmpfilerec,sizeof(tmpfilerec));
memo1.Lines.Add('File send request arrived...');

memo1.Lines.Add(tmpfilerec.filename);



end;

end;
end;

procedure TMainForm.Button1Click(Sender: TObject);
var
Msg: ^TDXChatMessage;
MsgSize: Integer;
begin
MsgSize := SizeOf(TDXChatMessage)+Length(Edit1.Text);
GetMem(Msg, MsgSize);
try
Msg.MessageType := DXCHAT_MESSAGE;
Msg.Len := Length(Edit1.Text);
StrLCopy(@Msg^.c, PChar(Edit1.Text), Length(Edit1.Text));

{ The message is sent all. }
DXPlay1.SendMessage(DPID_ALLPLAYERS, Msg, MsgSize);

{ The message is sent also to me. }
DXPlay1.SendMessage(DXPlay1.LocalPlayer.ID, Msg, MsgSize);

Edit1.Text := '';
finally
FreeMem(Msg);
end;
end;

procedure TMainForm.Edit1KeyDown(Sender: TObject; var Key: Word;
Shift: TShiftState);
begin
if Key=VK_RETURN then
begin
Button1Click(nil);
key := 0;
end;
end;

procedure TMainForm.Button2Click(Sender: TObject);

var
tel: word;

begin
if dxplay1.IsHost then checkbox1.Checked:=true else
checkbox1.Checked:=false;

label2.Caption:=dxplay1.TCPIPSetting.HostName;
label4.caption:=inttostr(dxplay1.TCPIPSetting.Port);
listbox1.Clear;

for tel:=0 to dxplay1.Players.Count-1 do
listbox1.Items.Add(dxplay1.players[tel].name+' -
'+inttostr(dxplay1.players[tel].id));

dxplay1.TCPIPSetting.HostName:='THESESSION';
end;

end.


Håber det hjælper dig.

Venligst
Ingolf



Harald (13-04-2002)
Kommentar
Fra : Harald


Dato : 13-04-02 18:51

"Ingolf" <DoNot_Spam_ingolf@musling.dk> skrev i en meddelelse
news:oSEt8.28731$iY5.964856@news010.worldonline.dk...
> Brug TCP/IP. Det er nok det smarteste. TCP/IP er efterhånden standarden
> indenfor alt netværk. Men der selvfølgelig også IPX, men nok om det.
>
> Jeg har engang lavet et program der snakkede sammen med klienter og server
> gennem filer på disken. Dette krævede at jeg havde et delt dir, som alle
> kunne få adgang til. Den først instans der startes op, fungerede som
server.
> De dertil startede instancer kommer op som klienter. Programmet virker
> perfekt. Og man kunne sende beskeder til alle, eller individuelle
> instancer.. sjovt at lave, men ikke en elegant løsning!!
>
> Check Hori's DirectX extensions, og komponenter. Det er meget nemt at
bruge:
> http://www.yks.ne.jp/~hori/index-e.html
>
> Her er koden til en Chat, som er et lille sample program til ovenstående
> komponenter.

<klip en masse kode>

> Håber det hjælper dig.

Jow tak, jeg tror jeg holder in til TCP.

Mvh
HK




René Jensen (14-04-2002)
Kommentar
Fra : René Jensen


Dato : 14-04-02 17:32

Harald wrote:
> Jeg har et "server" program kørende på en bestemt PC på et lokalt netværk,
> og så har jeg 1 eller flere "klient" programmer kørende på andre PC´er på
> lokal nettet.
>
> Server og klient programmerne har behov for at kunne sende beskeder til
> hinanden, jeg har tænkt på at bruge TCP. Dvs. at hver gang et klient program
> startes opretter det en TCP firbindelse til server programmet. På denne måde
> ved server programmet hele tiden hvor mange klienter der er koblet på og kan
> uden problemer sende en besked til dem alle.
>
> Er det en måde at gøre det på eller findes der en smartere?

Måske, jeg ved det ikke, men til ren chat, kan man benytte Delphi's egen
komponent ClientSocket og ServerSocket, som ligger under Internet
fanebladet, det er muligt at disse kun findes i nyere versioner af
Delphi 4/5/6 og kun i Enterprise udgaverne.
Det er kanont nemt at lave kommunikation imellem to PC'ere i LAN, det
bliver en anelse mere tricky, hvis en af clienterne sidder bag firewall
og for slet ikke at tale om at begge sidder bag firewall. -Men holder du
dig til LAN, så burde ikke give dig nogle større problemer.

Husk at læse om de forskellige events til henholdsvis ClientSocket og
ServerSocket, lavede selv et klient program sammen med en ven (hvor han
så lavede server programmet), og vi lavet et ganske simpelt program til
at sende beskeder og filer til hinanden på lørdag eftermiddag, så er det
selvf. bare hvor brugervenligt det var, men der kan man jo lige ligge
lidt mere tid til, så har man et program der kan chatte sammen igennem
en server med flere klienter.

--
Med venlig hilsen,
René Jensen

Once a upon a time a wise man said to me:
"I consider Windows like I consider bad weather ... I accept it and hope
for something better"

Harald (14-04-2002)
Kommentar
Fra : Harald


Dato : 14-04-02 18:34

"René Jensen" <rene.jensen@adslhome.dk> skrev i en meddelelse
news:3CB9AEE2.426E9724@adslhome.dk...
> Harald wrote:
> > Jeg har et "server" program kørende på en bestemt PC på et lokalt
netværk,
> > og så har jeg 1 eller flere "klient" programmer kørende på andre PC´er

> > lokal nettet.
> >
> > Server og klient programmerne har behov for at kunne sende beskeder til
> > hinanden, jeg har tænkt på at bruge TCP. Dvs. at hver gang et klient
program
> > startes opretter det en TCP firbindelse til server programmet. På denne
måde
> > ved server programmet hele tiden hvor mange klienter der er koblet på og
kan
> > uden problemer sende en besked til dem alle.
> >
> > Er det en måde at gøre det på eller findes der en smartere?
>
> Måske, jeg ved det ikke, men til ren chat, kan man benytte Delphi's egen
> komponent ClientSocket og ServerSocket, som ligger under Internet
> fanebladet, det er muligt at disse kun findes i nyere versioner af
> Delphi 4/5/6 og kun i Enterprise udgaverne.
> Det er kanont nemt at lave kommunikation imellem to PC'ere i LAN, det
> bliver en anelse mere tricky, hvis en af clienterne sidder bag firewall
> og for slet ikke at tale om at begge sidder bag firewall. -Men holder du
> dig til LAN, så burde ikke give dig nogle større problemer.
>
> Husk at læse om de forskellige events til henholdsvis ClientSocket og
> ServerSocket, lavede selv et klient program sammen med en ven (hvor han
> så lavede server programmet), og vi lavet et ganske simpelt program til
> at sende beskeder og filer til hinanden på lørdag eftermiddag, så er det
> selvf. bare hvor brugervenligt det var, men der kan man jo lige ligge
> lidt mere tid til, så har man et program der kan chatte sammen igennem
> en server med flere klienter.

Ja jeg glemte vist at skrive at jeg bruger Delphi 6, jeg har før brugt
Delphi 4 pro og deri var komponenterne også. Jeg har lavet løsningen med
Delphi's ClientSocket og ServerSocket komponenter, det virker fint med flere
klienter og som du siger så er det utrolig nemt at arbejde med.

Mvh
HK




Hans Milling (17-04-2002)
Kommentar
Fra : Hans Milling


Dato : 17-04-02 17:22

I alle delphi udgaver ligger der et TCP/IP chat eksempel som benytter
tekst. Skal du sende større mængder data er det lidt mere kompliceret,
men ikke meget, skriv til mig hvis du skal have et eksempel.
I Delphi 5 og 6 ligger chat eksemplet med client og server i samme
program, det findes her: C:\Program
Files\Borland\Delphi6\Demos\Internet\Chat
Eller hvor din Delphi installation nu er.
Du skal så bare ændre det så du har en server og klient for sig.
Du kan så bruge Socket.RemoteHost / RemoteAddress for at se hvem som
forbinder.
Jeg kan også sende dig et eksempel på alt dette.

Har du en listbox med navn lbKlienter kan du opdatere den med alle
klienter som er forbundet således:
procedure Form1.OpdaterKlienter;
begin
lbKlienter.Clear;
for i := 0 to self.ServerSocket1.Socket.ActiveConnections - 1 do
with Serversocket1.Socket.Connections[i] do
if connected then
lbKlienter.Items.add(RemoteAddress + ' (' + RemoteHost + ')');
end;

Hilsen Hans...

Harald (18-04-2002)
Kommentar
Fra : Harald


Dato : 18-04-02 06:47

"Hans Milling" <nivs1978@hotmail.com> skrev i en meddelelse
news:1f8d1318.0204170822.68f05eaf@posting.google.com...
> I alle delphi udgaver ligger der et TCP/IP chat eksempel som benytter
> tekst. Skal du sende større mængder data er det lidt mere kompliceret,
> men ikke meget, skriv til mig hvis du skal have et eksempel.
> I Delphi 5 og 6 ligger chat eksemplet med client og server i samme
> program, det findes her: C:\Program
> Files\Borland\Delphi6\Demos\Internet\Chat
> Eller hvor din Delphi installation nu er.
> Du skal så bare ændre det så du har en server og klient for sig.
> Du kan så bruge Socket.RemoteHost / RemoteAddress for at se hvem som
> forbinder.
> Jeg kan også sende dig et eksempel på alt dette.
>
> Har du en listbox med navn lbKlienter kan du opdatere den med alle
> klienter som er forbundet således:
> procedure Form1.OpdaterKlienter;
> begin
> lbKlienter.Clear;
> for i := 0 to self.ServerSocket1.Socket.ActiveConnections - 1 do
> with Serversocket1.Socket.Connections[i] do
> if connected then
> lbKlienter.Items.add(RemoteAddress + ' (' + RemoteHost + ')');
> end;

Som jeg skrev så har jeg lavet det og fået det til at virke, men ellers tak
for svaret.

Mvh
HK




Søg
Reklame
Statistik
Spørgsmål : 177559
Tips : 31968
Nyheder : 719565
Indlæg : 6408937
Brugere : 218888

Månedens bedste
Årets bedste
Sidste års bedste