Всем привет, решил возобновить данный тред!) Собственно высказываем мнения, толкаем предложения=)
Вот сделал пример, простенький сервер для ТДС. У меня достаточно много бед с самим делфи, укажите пжст на неточности и недороботки=) Скачать ps отсылка логинов пока не сделана.
MyACT, это делал Я! Для начала, Луминес, делал пример РПГ. А тут ТДС. Похожий пример действительно делал Фил, но они просто ПОХОЖИ! Возьми открой и посмотри, там много отличий. ps MyACT, неужели я действительно похож на человека, который будет заниматся палигатом? pss ссорь за дабл темы, случайность
неужели я действительно похож на человека, который будет заниматся палигатом?
Возможно. Предоставть скрин. кода - посмотрим. Возможно ты прав, но нужны весомые оргументы. ***** Просмотрел, чесно - отличий нет от всех остальных (база таже). Нечем удивить. Онлайн? Сеть? Возможно, но в инт. много подобных проектов и они много лудше (чесно). Работай, посмотрим и оценим.
Предоставть скрин. кода - посмотрим. Возможно ты прав, но нужны весомые оргументы.
Не имею возможности, нет не позволяет...
Вот коды сервера
Мой:
Code
program server;
{$APPTYPE CONSOLE}
uses SysUtils, dll39;
var port : Word = 12345; {порт сервера} sock, newusersock, newmes, xx, yy, shoot_x, shoot_y : Double; {Сокет сервера, сокет нового игрока, идентификатор нового сообщения, координаты} users : Byte = 0; {кол-во игроков на серве} users_list, x_list, y_list : array[0..16] of Double; {массив сокетов}{массивы координат} logins_list : array[0..16] of ShortString; {массив логинов} newuserid, mestype, mesuserid: Byte; {ИД нового игрока, первый (кейсовый) байт сообщения, ИД игрока отославшего сообщение} i : Integer; {переменная для циклов for и прочей билеберды} angle, hp : Byte; {угол поворота, ХП}
function NewId(): Byte; {геним ИД} var i : Byte; begin for i := 0 to 16 do begin if users_list[i] = 0 then Result := i; end; end;
procedure SendToAll (m : Byte); {процедура отсылки ВСЕМ игрокам, кроме m} var i : Byte; begin for i := 0 to 16 do begin if not(users_list[i] = 0) and not(m=i) then begin MessageSend(users_list[i], 0, 0, 0); end; end; end;
begin
Writeln('Test Delphi Server v 0.1'); Writeln('Created by AgentX001'); sock := TcpListen(port, 16, 1); {открываем сокет}
if sock < 1 then begin Writeln('Error to listen port ',port); Exit; end;
Writeln('Port ', port, ' listening!');
while (true) do begin newusersock := TcpAccept(sock, 1); {новенький...} if newusersock > 0 then begin if users < 16 then begin users := users + 1; newuserid := NewId(); users_list[newuserid] := newusersock; Writeln('New user, ID=',newuserid); ClearBuffer(0); WriteByte(newuserid, 0); WriteByte(users-1,0); for i:=0 to 16 do if not(users_list[i] = 0) and not(i=newuserid) then begin WriteByte(i,0); Writebyte(x_list[i], 0); Writebyte(y_list[i], 0); end; MessageSend(newusersock,0,0,0); ClearBuffer(0); {шлём всем ИД новенького} WriteByte(0,0); WriteByte(newuserid,0); SendToAll(newuserid); end else Writeln('Users is max!'); end;
for mesuserid := 0 to 16 do if not(users_list[mesuserid] = 0) then begin newmes := MessageRecieve(users_list[mesuserid],0,0); if newmes > 0 then begin mestype := Round(ReadByte(0)); case mestype of 0 : {кто-то отрубился... Вот козёл:)} begin users_list[mesuserid] := 0; Writeln('User ',mesuserid,' disconnected!'); ClearBuffer(0); WriteByte(1,0); WriteByte(mesuserid,0); SendToAll(17); users_list[mesuserid]:=0; users := users - 1; end;
2: {чейто угол и ХП} begin angle := Round(ReadByte(0)); hp := Round(ReadByte(0)); ClearBuffer(0); WriteByte(3, 0); WriteByte(mesuserid,0); WriteByte(angle, 0); WriteByte(hp,0); SendToAll(mesuserid);; end;
3: {кто-то шмальнул} begin xx := ReaduShort(0); yy := ReaduShort(0); shoot_x := ReaduShort(0); shoot_y := ReaduShort(0); ClearBuffer(0); WriteByte(4,0); WriteByte(mesuserid,0); WriteuShort(xx,0); WriteuShort(yy,0); WriteuShort(shoot_x,0); WriteuShort(shoot_y,0); SendToAll(mesuserid); end; end; end; end; end end.
Фила:
Code
program server;
{$APPTYPE CONSOLE}
uses SysUtils, dll39;
type ar = array [0..256] of double;
var dist, dir, x, y, angle, tmpid, socket, messag, listen, bytes, bytes2 : double; port, id : word; len : byte; str : ansistring; i, k : integer; userlist, idlist : ar;
function listfind(a: ar; b: double) : smallint; var k, i: smallint; begin i := 0; for k := 0 to 258 do begin if not(a[i] = b) then i := i + 1 else result := i; end; end;
function listdel(a: ar; b: byte) : ar; var i, size: word; begin size := listfind(a, 0); for i := b to size do a[i] := a[i + 1]; size := size - 1; result := a; end;
function listadd(a: ar; b: integer) : ar; var i, size: word; begin size := listfind(a, 0); for i := 0 to size do begin if (a[i] = 0) then begin a[i] := b; size := size + 1; result := a; end; if (a[i] = b) then break; end; end;
procedure sendstring(a: ansistring; b : double); // Процедура отправки строки (sendstring('Ваш текст', socket)) var i: byte; begin clearbuffer(0); str := a; len := length(str); writebyte(len, 0); for i := 1 to len do writebyte(ord(str[i]), 0); messagesend(b, '', 0, 0); end;
begin id := 1; write('by Fil. 39dll.ru'#10#13'Welcome to the server (v002a)! xD'#10#13#10#13'enter the port... '); read(port); listen := tcplisten(port, 256, 1); if (listen = 0) then writeln('listen port... fail!') else writeln('listen port... success!'#10#13); while(true) do begin socket := tcpaccept(listen, 1); if not(socket < 0) then begin messag := messagerecieve(socket, 0, 0); if (messag > 0) then begin bytes := readbyte(0); if (bytes = 0) then writeln('admin connected! ', round(socket)); {Тут потом будет поддрежка админ-функций} if (bytes = 1) then begin writeln('client connected! ', round(socket)); clearbuffer(0); writebyte(1, 0); writebyte(id, 0); messagesend(socket, '', 0, 0); idlist := listadd(idlist, id); {Отправка id всех остальных игроков новому игроку} if not(userlist[0] = 0) then begin {Отправка новому игроку id всех игроков} clearbuffer(0); writebyte(2, 0); writebyte(listfind(userlist, 0), 0); for i := 0 to listfind(userlist, 0) - 1 do writebyte(round(idlist[i]), 0); messagesend(socket, '', 0, 0); {Отправка всем id нового игрока} clearbuffer(0) ; writebyte(3, 0); writebyte(id, 0); for i := 0 to listfind(userlist, 0) - 1 do messagesend(userlist[i], '', 0, 0); end; userlist := listadd(userlist, round(socket)); // Добавляем socket игрока в массив id := id + 1; end; end; end; for i := 0 to listfind(userlist, 0) do begin messag := messagerecieve(userlist[i], 0, 0); if (messag > 0) then begin writeln('received ', round(messag), ' bytes'); bytes := round(readbyte(0)); if (bytes = 0) then // Пришло сообщение от контролера begin bytes2 := round(readbyte(0)); if (bytes2 = 0) then // Выключить сервер exit; if (bytes2 = 1) then // Запрос количества игроков begin clearbuffer(0); writebyte(0, 0); writebyte(listfind(userlist, 0), 0); messagesend(userlist[i], '', 0, 0); end; end; if (bytes = 1) then // Игрок ушел с сервера begin writeln('client left the server! ', round(userlist[i])); userlist := listdel(userlist, i); // Удаляем id игрока из массива clearbuffer(0); writebyte(5, 0); writebyte(idlist[i], 0); for k := 0 to listfind(userlist, 0) - 1 do messagesend(userlist[k], '', 0, 0); idlist := listdel(idlist, i); end; if (bytes = 2) then // Отправка данных о игроке (id, x, y) всем остальным игрокам begin tmpid := round(readbyte(0)); x := round(readshort(0)); y := round(readshort(0)); clearbuffer(0); writebyte(4, 0); writebyte(tmpid, 0); writeshort(x, 0); writeshort(y, 0); for k := 0 to listfind(userlist, 0) - 1 do begin if not(userlist[i] = userlist[k]) then messagesend(userlist[k], '', 0, 0); end; end; if (bytes = 3) then // Отправка всем игрокам image_angle игрока begin tmpid := round(readbyte(0)); angle := round(readbyte(0)); clearbuffer(0); writebyte(6, 0); writebyte(tmpid, 0); writebyte(angle, 0); for k := 0 to listfind(userlist, 0) - 1 do if not(userlist[i] = userlist[k]) then messagesend(userlist[k], '', 0, 0); end; if (bytes = 4) then // Пуля задела игрока begin tmpid := round(readbyte(0)); clearbuffer(0); writebyte(7, 0); messagesend(userlist[listfind(idlist, tmpid)], '', 0, 0); end; if (bytes = 5) then // Какой-то игрок стреляет (нужно просто для отображения эффекта) begin tmpid := round(readbyte(0)); dir := round(readbyte(0)); dist := round(readbyte(0)); clearbuffer(0); writebyte(8, 0); writebyte(tmpid, 0); writebyte(dir, 0); writebyte(dist, 0); for k := 0 to listfind(userlist, 0) - 1 do if not(userlist[i] = userlist[k]) then messagesend(userlist[k], '', 0, 0); end; end; end; end; end.
Quote (Iboon)
Просмотрел, чесно - отличий нет от всех остальных (база таже). Нечем удивить. Онлайн? Сеть? Возможно, но в инт. много подобных проектов и они много лудше (чесно).
Дружище, это не проект, а мааааленький примерчик, его уникальность (прости за яркое слово) в том, что сервер делфиёный, а клиент на гамаке. В рунете очень мало инфы о подобном симбиозе, всего несколько человек нормально умеют работать с этим: Винч (собственно "затейник", биг респект), Зик74, Фил. ps очень хочу услышать критику людей работающих с делфи!
Дружище, это не проект, а мааааленький примерчик, его уникальность (прости за яркое слово) в том, что сервер делфиёный, а клиент на гамаке. В рунете очень мало инфы о подобном симбиозе, всего несколько человек нормально умеют работать с этим: Винч (собственно "затейник", биг респект), Зик74, Фил. ps очень хочу услышать критику людей работающих с делфи!
Я уже 1,5 года не открывал гм. Просто использовал 39dll в другом месте, какая разница-то, где ее юзать?
AGENTX001, обойдетесь без пруфа. Я из своего проекта выпиливаю 39dll, ибо не кроссплатформена, а ставить сервер на серверной винде- я не миллионер. Нужна сеть, работающая под UNIX.
Пиши на Java с установкой на серв под юниксом кода написанного под виндой не составило труда. Проблем было больше с настройкой локалей линукса на который ставил, но это были проблемы для работы с русским языком в принципе.
Java кроссплатформена по определению, тк пишется код для виртуальной машины-интерпритатора ява. А разработкой самой машины занимались в sun и сейчас в oracle
Vinchensoo, не, ну что за проект!?) ps если юникс, то соответственно нужно и ЯП менять... Может я что-то туплю, но Делфи вроде не поддерживает *nix системы... Во всяком случае delphi 7 - точно!
Пиши на Java с установкой на серв под юниксом кода написанного под виндой не составило труда. Проблем было больше с настройкой локалей линукса на который ставил, но это были проблемы для работы с русским языком в принципе.
Я знаю, что такое ява, но я не знаю яву. Как бы суть в том, что 39dll использует библиотеку winsock, нужно просто юзать либы, которые не привязаны к ОС, либо написать 2 версии, чем я вероятнее всего и займусь.
На яве я не буду писать, ибо не идиот писать на ЯП, которого не знаю. Мне вполне хватит С++ или объектного паскаля(Лазарусом компилить под линь), еще не решил на чем, скорее всего на паскале, ибо быстрее в 100 раз.
Кстати, ява далеко не для всех задач подходит, был один сервер, он какал кирпичами после 400 человек онлайн, писал норм прогер, так что дело, скорее всего, в яве. Но не будем оффтопить.
Quote (AGENTX001)
ps если юникс, то соответственно нужно и ЯП менять... Может я что-то туплю, но Делфи вроде не поддерживает *nix системы... Во всяком случае delphi 7 - точно
На яве я не буду писать, ибо не идиот писать на ЯП, которого не знаю. Мне вполне хватит С++ или объектного паскаля(Лазарусом компилить под линь), еще не решил на чем, скорее всего на паскале, ибо быстрее в 100 раз.
Ну я идиот и не знал яву, когда на ней решил кодить и когда понял что кроссплатформенное на С++ не потяну, ни под QT ни под тем более чистым С++ с отдельными либами. Ну ничего я не знал Java полгода назад, а сейчас имеется готовый отлаженный стержень который обрастает функционалом на java), правда её я пока нормально всё равно не знаю, но мне хватает. Ну и про норм прогера, если чё 99% фришардов различных игр написанно на эмуляторах на java как раз, при чём некоторые написанные вменяемо держат по солидному числу народа.