![]() |
problem mit tserversocket - sendtext client-id
servuß
ich bin dabei einen kleinen chat zu schreiben, wie wahrscheinlich jeder am anfang ^^ funktioniert auch schon soweit alles, verbindung steht, text kann gesendet werden usw. ABER: ich kann nur vom clienten zum server eine nachricht schicken, aber nicht vom server zum clienten. ich such das problem jetzt schon die ganze zeit, kanns aber nicht finden. Wenn ich vom server aus eine nachricht(bzw nen text) zum clienten schicken will, kommt:
Delphi-Quellcode:
wtf? die verbindung steht aber.
Windows-Socket-Fehler: Eine anforderung zum senden oder empfangen von daten wurde verhindert, da der socket nicht verbunden ist und (beim senden über einen datagrammsocket mit sento-aufruf) keine adresse angegeben wurde (10057), auf API 'send'
hier mal der source vom server:
Delphi-Quellcode:
ich bedanke mich jetzt schon für die hilfe :)
procedure TForm1.Button1Click(Sender: TObject);
begin serversocket1.Active := true; serversocket1.Port := strtoint(edit1.text); end; procedure TForm1.FormCreate(Sender: TObject); begin memo1.clear; edit1.text := '6900'; memo1.lines.add('----Welcome----'); end; procedure TForm1.Button2Click(Sender: TObject); begin serversocket1.Active := false; Application.Terminate; end; procedure TForm1.ServerSocket1ClientError(Sender: TObject; Socket: TCustomWinSocket; ErrorEvent: TErrorEvent; var ErrorCode: Integer); begin showmessage('An Error occurred while connecting, try again'); errorcode := 0; end; procedure TForm1.Edit1KeyPress(Sender: TObject; var Key: Char); begin // nur zahlen erlauben if not (key in ['0'..'9', char(vk_back)]) then key := #1; end; procedure TForm1.ServerSocket1ClientConnect(Sender: TObject; Socket: TCustomWinSocket); begin Memo1.Lines.add('Connected: welcome :) '); Memo1.lines.add('-------------------'); end; procedure TForm1.ServerSocket1ClientRead(Sender: TObject; Socket: TCustomWinSocket); begin memo1.lines.Add(socket.ReceiveText); end; procedure TForm1.Button3Click(Sender: TObject); begin serversocket1.Socket.SendText(edit2.text); end; procedure TForm1.Button4Click(Sender: TObject); begin serversocket1.Close; end; procedure TForm1.ServerSocket1ClientDisconnect(Sender: TObject; Socket: TCustomWinSocket); begin memo1.lines.add('status: Disconnected'); end; procedure TForm1.Button5Click(Sender: TObject); begin MessageDlg('blabla', mtInformation , [mbOK] ,0); end; end. gruß |
Re: problem mit tserversocket
Hallo,
Ich glaube ich habe dein Problem gefunden Um Daten vom Server zum Client zu schicken, muss man angeben an welchen Client die Daten sollen. Ein Server kann ja mehrere Clients haben. Das funktioniert dann so:
Delphi-Quellcode:
In die eckigen Klammern kommt die Nummer des Clients rein, die Zählung fängt bei 0 an
ServerSocket1.Socket.Connections[0].SendText('Hallo Welt');
|
Re: problem mit tserversocket
fuitak, ich liebe dich :mrgreen: :mrgreen:
danke, jetzt gehts :) wie kann ich dem clienten eine spezielle id zuweisen? spontan fällt mir da vielleicht das ein var id: array [0..10] of integer; |
Re: problem mit tserversocket
Hi, außerdem ist die Übermittlung des Textes nur solange sicher, solange der gesamte Text auf einmal in den Empfangsbuffer
des Empfänger Sockets paßt, also nicht in mehreren Stücken übermittelt werden muß. Deshalb brauchst Du auch noch einen Daten-Header, der die Längeninfos des übermittelten Textes enthält. Als Beispiel: {GENERIC HEADER} //-- Headeraufbau MsgID = Byte = 0..255; Msg-Length = DWORD //-- +--------------------|--------------------------|----------------+ //-- | Byte-MsgID | 4Byte-DWORD Msg-Length | Daten | //-- +--------------------|--------------------------|----------------+ Der Empfänger Socket, extrahiert beim Empfangen die ersten 5 Bytes aus der Message, und liest Solange aus dem Socket bis alle Daten übertragen wurde. |
Re: problem mit tserversocket
Zitat:
Der erste angemeldete Client bekommt Nummer 0, der zweite bekommt die 1 usw. Wenn sich dann z.B. der erste Client abmeldet, dann bekommt der ursprünglich zweite die Nummer 0, es wird also nachgerückt So jetzt muss ich aber los, also erstmal viel Spaß hiermit :bounce1: |
Re: problem mit tserversocket
Im Read der Komponente kriegst alles mit wast brauchst!
Delphi-Quellcode:
procedure TServerObj.ServerSocketClientRead(const Sender: TObject;
const Socket: TCustomWinSocket); var cbRcv: integer; RcvBuf: array [0..WSOCK_READ_BUFFER_SIZE * 8] of Byte; RcvBufItem: TRcvBufItem; hMemData: hGlobal; hMemStruct: hGlobal; begin cbRcv := Socket.ReceiveBuf(RcvBuf[0], WSOCK_READ_BUFFER_SIZE * 8); if cbRcv <= 0 then EXIT; if Socket.SocketHandle <= 0 then EXIT; hMemData := GlobalAlloc(GMEM_FIXED, cbRcv); move(RcvBuf[0], Pointer(hMemData)^, cbRcv); hMemStruct := GlobalAlloc(GMEM_FIXED, SizeOf(TRcvBufItem)); RcvBufItem.ptrData := Pointer(hMemData); RcvBufItem.cbData := cbRcv; RcvBufItem.Socket := Socket.SocketHandle; RcvBufItem.hMemStruct := hMemStruct; RcvBufItem.hMemData := hMemData; move(RcvBufItem, Pointer(hMemStruct)^, SizeOf(TRcvBufItem)); if FRecvBuffer.Write(Pointer(hMemStruct), SizeOf(TRcvBufItem)) <> SizeOf(TRcvBufItem) then begin FRecvBuffer.SetBufSize((FRecvBuffer.BufSize + cbRcv) * 2); FRecvBuffer.Remove(SizeOf(TRcvBufItem)); if FRecvBuffer.Write(Pointer(hMemStruct), SizeOf(TRcvBufItem)) <> SizeOf(TRcvBufItem) then raise exception.Create('you should never see this'); end; SetEvent(FMsgDispatchEvent); end; |
Re: problem mit tserversocket
Hui der Code sieht aber sehr kompliziert aus... und da unser guter painrestricter, zumindest in Sachen Socket-Programmierung, noch Neuling ist, wäre es doch eigentlich schön mal zu sagen, was diese Methode eigentlich genau macht
|
Re: problem mit tserversocket
@painrestricter: Könntest du deinem Beitrag bitte einen aussagekräftigeren Titel geben? Das es sich um ein Problem handelt sagt bereits das gewählte Forum aus und "TServersocket" sagt nicht aus was für ein Problem du damit hast.
Ein aussagekräftiger Titel hat den Vorteil das andere mit dem gleichen Problem dieses Thema später über die Suche besser finden und somit hoffentlich auch die Lösung. Zudem hat es für dich den Vorteil das Leute anhand des Titels sofort wissen ob sie helfen können oder nicht. Nicht jeder hat Zeit alle Themen durchzulesen und wenn der Titel aussagekräftig ist und somit jemand sofort weiß das er helfen kann profitierst du vor allem davon. :) |
Re: problem mit tserversocket - sendtext client-id
erledigt, SirThornberry
uoeb7gp, danke für den code, aber wie fui-tak schon sagt, ich kann mit den code weder umgehen noch was damit anfangen. ABER es interessiert mich, also werd ich den mal genauer anschauen. Könnte ich theoretisch auch das customwinsocket modifizieren? |
Re: problem mit tserversocket - sendtext client-id
Liste der Anhänge anzeigen (Anzahl: 1)
Also anbei der src.
Es handelt sich dabei um eine Implementierung eines Hocklast-Async Socket Servers. Features: send und recv buffered and threaded. Server und Client DLL wurden auf höchsten Durchsatz und Performance hin ausgelegt. Gegenüber der damaligen JAVA Implementierung stieg die Performance um nahezu 600% !!!!! Have a lot of Fun. |
Alle Zeitangaben in WEZ +1. Es ist jetzt 02:00 Uhr. |
Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz