|
#1
|
|||
|
|||
Чат на сокетах
Здрасьте
Знаю, что тема до невозможности бородатая, но возникла необходимость создания программы для чата, и при ее создании возникли некоторые сложности. А именно - не приходят сообщения от клиента к серверу. От сервера идут, а обратно не хотят. Клиент и сервер реализованы в одной программе. Вот код: Код:
unit Unit1; interface uses Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms, Dialogs, StdCtrls, ScktComp; type TForm1 = class(TForm) ClientSocket: TClientSocket; ServerSocket: TServerSocket; portedit: TEdit; lblport: TLabel; IP: TLabel; Hostedit: TEdit; Nik: TLabel; NikEdit: TEdit; txtlbl: TLabel; TextEdit: TEdit; ChatMemo: TMemo; SendBtn: TButton; ServerBtn: TButton; ClientBtn: TButton; procedure FormCreate(Sender: TObject); procedure ServerBtnClick(Sender: TObject); procedure ServerSocketClientConnect(Sender: TObject; Socket: TCustomWinSocket); procedure ServerSocketClientDisconnect(Sender: TObject; Socket: TCustomWinSocket); procedure ServerSocketClientRead(Sender: TObject; Socket: TCustomWinSocket); procedure SendBtnClick(Sender: TObject); procedure ClientBtnClick(Sender: TObject); procedure ClientSocketRead(Sender: TObject; Socket: TCustomWinSocket); procedure ClientSocketConnect(Sender: TObject; Socket: TCustomWinSocket); procedure ClientSocketDisconnect(Sender: TObject; Socket: TCustomWinSocket); procedure ServerSocketAccept(Sender: TObject; Socket: TCustomWinSocket); procedure ClientSocketConnecting(Sender: TObject; Socket: TCustomWinSocket); procedure ServerSocketClientError(Sender: TObject; Socket: TCustomWinSocket; ErrorEvent: TErrorEvent; var ErrorCode: Integer); private { Private declarations } public { Public declarations } end; var Form1: TForm1; implementation {$R *.dfm} //ЗАПОЛНЕНИЕ ПОЛЕЙ procedure TForm1.FormCreate(Sender: TObject); begin PortEdit.Text:='50000'; HostEdit.Text:='192.168.0.100'; NikEdit.Clear; TextEdit.Clear; ChatMemo.Lines.Clear; end; //СЕРВЕР procedure TForm1.ServerBtnClick(Sender: TObject); begin If ServerBtn.Tag=0 then Begin ClientBtn.Enabled:=False; HostEdit.Enabled:=False; PortEdit.Enabled:=False; ServerSocket.Port:=StrToInt(PortEdit.Text); ServerSocket.Active:=True; ChatMemo.Lines.Add('['+TimeToStr(Time)+'] Сервер создан'); ServerBtn.Tag:=1; ServerBtn.Caption:='Закрыть сервер'; end else Begin ClientBtn.Enabled:=True; HostEdit.Enabled:=True; PortEdit.Enabled:=True; ServerSocket.Active:=False; ChatMemo.Lines.Add('['+TimeToStr(Time)+'] Сервер закрыт.'); ServerBtn.Tag:=0; ServerBtn.Caption:='Создать сервер'; end; end; procedure TForm1.ServerSocketClientRead(Sender: TObject; Socket: TCustomWinSocket); begin ChatMemo.Lines.Add(Socket.ReceiveText); end; procedure TForm1.ServerSocketClientConnect(Sender: TObject; Socket: TCustomWinSocket); begin ChatMemo.Lines.Add('['+TimeToStr(Time)+'] Подключился клиент.'); end; procedure TForm1.ServerSocketClientDisconnect(Sender: TObject; Socket: TCustomWinSocket); begin ChatMemo.Lines.Add('['+TimeToStr(Time)+'] Клиент отключился.'); end; procedure TForm1.ServerSocketAccept(Sender: TObject; Socket: TCustomWinSocket); begin ChatMemo.Lines.Add('['+TimeToStr(Time)+'] Подключился клиент.'); end; procedure TForm1.ServerSocketClientError(Sender: TObject; Socket: TCustomWinSocket; ErrorEvent: TErrorEvent; var ErrorCode: Integer); begin ChatMemo.Lines.Add('['+TimeToStr(Time)+'] Ошибка.'); end; //КЛИЕНТ procedure TForm1.ClientBtnClick(Sender: TObject); begin If ClientBtn.Tag=0 then Begin ServerBtn.Enabled:=False; HostEdit.Enabled:=False; PortEdit.Enabled:=False; ClientSocket.Port:=StrToInt(PortEdit.Text); ClientSocket.Host:=HostEdit.Text; ClientSocket.Address:=HostEdit.Text; ClientSocket.Active:=True; ClientBtn.Tag:=1; ClientBtn.Caption:='Отключиться'; end else Begin ServerBtn.Enabled:=True; HostEdit.Enabled:=True; PortEdit.Enabled:=True; ClientSocket.Active:=False; ClientBtn.Tag:=0; ClientBtn.Caption:='Подключиться'; end; end; procedure TForm1.ClientSocketRead(Sender: TObject; Socket: TCustomWinSocket); begin ChatMemo.Lines.Add(Socket.ReceiveText); end; procedure TForm1.ClientSocketConnecting(Sender: TObject; Socket: TCustomWinSocket); begin ChatMemo.Lines.Add('['+TimeToStr(Time)+'] Подключение к серверу.'); end; procedure TForm1.ClientSocketConnect(Sender: TObject; Socket: TCustomWinSocket); begin ChatMemo.Lines.Add('['+TimeToStr(Time)+'] Успешно.'); end; procedure TForm1.ClientSocketDisconnect(Sender: TObject; Socket: TCustomWinSocket); begin ChatMemo.Lines.Add('['+TimeToStr(Time)+'] Сеанс завершен.'); end; //ОТПРАВКА СООБЩЕНИЯ procedure TForm1.SendBtnClick(Sender: TObject); begin If ServerSocket.Active=True then begin ServerSocket.Socket.Connections[0].SendText('['+TimeToStr(Time)+'] '+NikEdit.Text+': '+TextEdit.Text+''); end else begin ClientSocket.Socket.SendText('['+TimeToStr(Time)+'] '+NikEdit.Text+': '+TextEdit.Text+''); end; ChatMemo.Lines.Add('['+TimeToStr(Time)+'] '+NikEdit.Text+': '+TextEdit.Text+''); TextEdit.Text:=''; end; end. Предполагаю, что проблема кроется либо здесь: Код:
procedure TForm1.ServerSocketClientRead(Sender: TObject; Socket: TCustomWinSocket); begin ChatMemo.Lines.Add(Socket.ReceiveText); end; либо тут: Код:
//ОТПРАВКА СООБЩЕНИЯ procedure TForm1.SendBtnClick(Sender: TObject); begin If ServerSocket.Active=True then begin ServerSocket.Socket.Connections[0].SendText('['+TimeToStr(Time)+'] '+NikEdit.Text+': '+TextEdit.Text+''); end else begin ClientSocket.Socket.SendText('['+TimeToStr(Time)+'] '+NikEdit.Text+': '+TextEdit.Text+''); end; ChatMemo.Lines.Add('['+TimeToStr(Time)+'] '+NikEdit.Text+': '+TextEdit.Text+''); TextEdit.Text:=''; end; Ах да.. я тут новичок. Да и в программировании тоже тот еще ламер. Так что прошу сильно не ругать |