Все технические форумы на одном сайте Удобный поиск информации с популярных форумов в одном месте
Вопрос: ServerSocket и ClientSocket как определить IP хоста?

Есть 2 программы:
Серверая, на которой используется ServerSocket, для получения строки с текстом от клиента.
И есть вторая, на которой с помощью компонента ClientSocket осуществляется отправка строки текста.

В клиентской программе я конкретно указываю IP адрес сервера (например: ClientSocket1->Host = "192.168.1.2" )

Но есть необходимость использовать программу в разных сетях, с разной адресацией сети, т.е. айпишник сервера может изменится.
Вопрос вот в чем: Как можно на клиентской стороне определить IP хоста? что бы знать куда отправлять строку?
Ответ:
Сообщение от Torassk
Как это реализовать?
Тут недавно тема всплывала как раз по этому поводу. Широковещательный адрес заканчивается на 255. Вы же можете отправить UDP-пакет на такой адрес ?

Добавлено через 13 минут
Вот, парочка тем:

Вопрос: Как остановить ServerSocket без выбрасывания исключений?

Код сервера:


package server;

import java.io.BufferedReader;
import java.io.InputStreamReader;
import java.net.ServerSocket;
import java.net.Socket;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;

public class Server {

        private BufferedReader br = new BufferedReader (new InputStreamReader (System.in));
        private static ExecutorService executeIt = Executors.newFixedThreadPool(5);
        private Socket client;


        public static void main (String [] args) {
            Server server = new Server();
            server.go();
        }

        public void go () {

            try {               
                ServerSocket server = new ServerSocket (3345);

                Thread t = new Thread (new ServerCheck(server)) ;
                t.start();

                System.out.println("connection accepted");
                System.out.println("DataInputStream and DataOutputStream created");

                while (!server.isClosed()) { 

                    System.out.println("Server reading from channel");                
                    client = server.accept();
                    executeIt.execute(new MonoThreadClientHandler(client));
                    System.out.println("Connection accepted."); 
                }                
            }
            catch (Exception e) {
                e.printStackTrace();
            } 
        }


    public class ServerCheck implements Runnable  {
        ServerSocket sc;
        public ServerCheck (ServerSocket sc) {
        this.sc=sc;
    }            
    @Override
    public void run() {
        try {
            if (br.readLine().equalsIgnoreCase("exit"))
                br.close();
                sc.close();                
        } 
        catch (Exception e) {
            e.printStackTrace();
        }
    }

}

}




При выполнении ServerSocket.close() вылетает исключение:
java.net.SocketException: socket closed

в строке:
client = server.accept();

Как я понимаю, на этой строке поток останавливается и ждет коннекта от клиента, и в этот момент я его закрываю.

Как правильно обойти это исключение и завершить работу сервера?
Ответ:
mayton
Клиент уже закрыл сокет и сервер при закрытии получает такое состояние.

У него серверный слушающий сокет. Нет клиента.
Вопрос: ServerSocket как узнать IP

Здравствуйте. Есть клиент-серверное приложение, сервер находится на удаленном пк, как можно получить в коде статический IP адрес сервера(ServerSocket) и передать его клиенту?
Ответ:
Сообщение от Disgust
и передать его клиенту
по телефону что ли ?
Вопрос: ServerSocket принудительное отключение клиентов

обрабатываю подключение, отправляю запрос на ввод аккаунта
Delphi
1
2
3
4
procedure TfrmServer.ServerSocket1Accept(Sender: TObject; Socket: TCustomWinSocket);
begin
  Socket.SendText(cmd_GetAcc);//посылаем запрос аккаунту клиенту
end;
в
Delphi
1
procedure TfrmServer.ServerSocket1ClientRead(Sender: TObject; Socket: TCustomWinSocket);
обрабатываю данные авторизации (логин:пас)

Delphi
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
  Msg := Socket.ReceiveText;
  Cmd := Copy(Msg, 1, CmdLen);
  MsgData := Copy(Msg, Length(cmd_Nick) + 1, Length(Msg) - Length(cmd_Nick));
 
  if (Cmd = cmd_Authorization) then   {Если это команда авторизации, то}
  begin
    acc := Copy(MsgData, 1, Pos(':', MsgData) - 1);
    pass := Copy(MsgData, Pos(':', MsgData) + 1, Length(MsgData));
    {Выделяем память под нового клиента}
    New(NewClient);
    {Записываем его акк\пасс}
    NewClient^.acc := acc;
    NewClient^.pass := pass;
    {указатель на данные (Data) сокета текущего клиента будет являться адресом выделенной области памяти}
    Socket.Data := NewClient;
    PPacket(Socket.Data)^.TransFile := nil;
    if CheckAcc(acc) then
    begin
      Socket.SendText(cmd_NicknameBusy);
    end
    else
    begin
      if Authorization(acc, Sha1Base64(pass)) then
        Socket.SendText(cmd_AuthorizationTrue + '<nick>' + NewClient^.Nick + '</nick>' + '<msg>' + ' Авторизация успешна.'#13#10 + '</msg>')
      else
        Socket.SendText(cmd_AuthorizationFalse);
    end;
  end
собственно вопрос как принудительно разорвать соединение в случае не верного логина\пароля
пробовал отправлять команду на отключение клиенту
Delphi
1
Socket.SendText(cmd_AuthorizationFalse);
не всегда клиент обрабатывает данною команду, при "спаме" кнопкой логин на стороне сервера создается много "новых клиентов"

может кто подкинет правильною реализацию авторизации на сокетах или исходник стабильного чата с авторизацией
Ответ: ну там же есть список подключений, циклом обходи и опрашивай
Вопрос: ClientSocket ServerSocket Delphi 7 Как отправить команду?

Хеллоу народ! скажите пожалуйста можно отправить команду к серверсокет например запустить проводник или открыть дисковод! Если можно скиньте код а в IdTcpserver можно отправить команду например пишем для сервера: if athread.connection.readln=('cmd'); winexec('explorer.exe', SW_normal); этот код токо для idtcpserver а мне нужно для serversocket скажите пожалуйста как отправить команду?????????????????????????
Ответ: файл удалён...
Вопрос: Передача файла ServerSocket на ClientSocket

Пытаюсь отослать файл клиенту через ServerSocket. Логически все сделал но передавать не хочет. Подскажите в чем может быть проблема.
Код Delphi
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
клиент:
 
...
var
FStream: TFileStream;
...
procedure CLIENTRead(Sender: TObject; Socket: TCustomWinSocket);
var
  iLen: Integer;
  Bfr: Pointer;
begin
ANSWER:= Socket.ReceiveText;
if Pos('FILE', ANSWER) <> 0 then begin
    FStream := TFileStream.Create('c:\stream.txt', fmCreate or fmShareDenyWrite);
    iLen := Socket.ReceiveLength;
    GetMem(Bfr, iLen);
    try
      Socket.ReceiveBuf(Bfr^, iLen);
      FStream.Write(Bfr^, iLen);
    finally
      FreeMem(Bfr);
    end;
  end;
end;
 
procedure TForm1.sButton2Click(Sender: TObject);
begin
  CLIENT.Socket.SendText('IFILE');
end;
Код Delphi
1
2
3
4
5
6
7
8
9
10
сервер
 
procedure SERVERClientRead(Sender: TObject; Socket: TCustomWinSocket);
begin
ANSWER:= Socket.ReceiveText;
  if Pos('IFILE', ANSWER) <> 0 then begin
    Socket.SendText('FILE');
    Socket.SendStream(TFileStream.Create('c:\1.txt', fmOpenRead or fmShareDenyWrite));
  end;
end;
Ответ:

Не по теме:

Ты-то чего напугался ?)
У тебя с логикой все вроде в порядке - "все сделал .. но не хочет.. разбираться не хочу .. подскажите")

Вопрос: Отправить папку с файлами на ServerSocket

Есть FileChooser нужно оправить выбранную в нем папку(с подпапками и файлами) через Сокет на сервер ServerSocket.
Думаю получать при нажати open из Файлового менеджера место файла ну или же папки и с этого места уже отпралсять(но не знаю как)
Ответ: Velesthau, я об архивации думал. Что-то вроде обычного зипа из винрара только без сжатия, как такое можно сделать? И еще, мне нужно проверку файлов делать на сервере потом на изменение, это ведь связано с хеш суммами верно?
Вопрос: Аналоги ClientSocket, ServerSocket в версии 2010

В 6 версии билдера были такие замечательные компоненты для написания клиент-серверных приложений: ClientSocket, ServerSocket. А вот в 2010 их уже не нашел. Есть ли аналогии?

Добавлено через 27 минут
Вот тут нашел ответ на вопрос:
Ответ: Alex_From_777, да, есть) TIdTCPClient и TIdTCPSever - компоненты из библиотеки Indy (интегрирована в IDE), а также TTcpClient и TTcpServer - "родные" компоненты.
Вопрос: Как лучше передать файл через ServerSocket?

ServerSocket. Как лучше передать файл?
Delphi
1
Socket.SendStream();
или
Delphi
1
Socket.SendBuf();
Ответ: Загрузить файл в стрим и
Delphi
1
Socket.SendStream();
Все остальное, имхо, от лукавого.
Вопрос: Как из строки извлечь ip адрес

такая проблема, как из строки, например :
Delphi
1
s := 'fff fff 127.0.0.1 vv ';
извлечь ip адрес?
Ответ: Привет. Есть такая процедура, я тут набросал по-быстрому!

Delphi - поиск IP-адресов в строке и вывод их в список, не используя регулярные выражения.

Моя процедура после нажатия кнопки Button1 возьмет текст в Edit1, найдет в нем все IP-адреса и запишет их в поле Memo1. :-)

Delphi
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
procedure TForm1.Button1Click(Sender: TObject);
 
var
 q,s:string; // наша строка в двух переменных
 Massiv1:array of Integer; // временный массив №1
 i:integer; // универсальный счетчик
 nach,konec:integer; // позиции начала и конца IP-адреса
 blok1,blok2,blok3,blok4:string; // блоки IP-адреса представленные строкой
 blok1i,blok2i,blok3i,blok4i:integer; // блоки IP-адреса представленные числом
 a:integer; b:string; // проверочные переменные
 
begin
 q:=Form1.Edit1.Text; // забираем строку
 s:=q; // дублируем
 Massiv1:=nil; // чистим массив
 
 i:=length(s); // делаем переменную неравную нулю
 while i>0 do // ищем все позиции точек и записываем позиции в массив
 begin
  i:=pos('.',s); // ищем точку в строке
  if i>0 then
   begin
    SetLength(Massiv1, Length(Massiv1)+1); // увеличить размер массива на 1
    Massiv1[Length(Massiv1)-1]:=i; // присваиваем  последнему элементу массива номер позиции точки в строке
    Delete(s,i,1); // удаляем эту точку из строки
    Insert(',',s,i); // вставляем запятую вместо точки
   end;
 end;
 
 for i:=0 to Length(Massiv1)-1 do // перебор по одному элементов массива
 begin //-----------------------------------------------------------цикл--------------------------------------------------------------
 //=============================//
 // Massiv1[ i ] - первая точка //
 // Massiv1[i+1] - вторая точка //
 // Massiv1[i+2] - третья точка //
 //=============================//
 if (Massiv1[ i ]<>null) and (Massiv1[i+1]<>null) and (Massiv1[i+2]<>null) then // три позиции подряд не должны быть пустые
  if ((Massiv1[i+1]-Massiv1[ i ])>1) and ((Massiv1[i+1]-Massiv1[ i ])<5) and ((Massiv1[i+2]-Massiv1[i+1])>1) and ((Massiv1[i+2]-Massiv1[i+1])<5) then // расстояние между ними 2-4
   begin //-----------------------------------------------------------условие---------------------------------------------------------
    nach:=0;
    konec:=0;
 
    //-------------ищем начало IP-------------
    if q[Massiv1[i]-1] in ['0'..'9'] then // первый символ перед первой точкой от 0 до 9
    begin
     nach:=Massiv1[i]-1;
     if q[Massiv1[i]-2] in ['0'..'9'] then // второй символ перед первой точкой от 0 до 9
     begin
      nach:=Massiv1[i]-2;
      if q[Massiv1[i]-3] in ['1'..'2'] then  // третий символ перед первой точкой от 1 до 2
      begin
       nach:=Massiv1[i]-3;
      end;
     end;
    end;
 
    //-------------ищем конец IP-------------
    if q[Massiv1[i+2]+1] in ['1'..'9'] then  // первый символ  после последней точки от 1 до 9
    begin
     konec:=Massiv1[i+2]+1;
     if q[Massiv1[i+2]+2] in ['0'..'9'] then // второй символ  после последней точки от 0 до 9
     begin
      konec:=Massiv1[i+2]+2;
      if q[Massiv1[i+2]+3] in ['0'..'9'] then // тертий символ  после последней точки от 0 до 9
      begin
       konec:=Massiv1[i+2]+3;
      end;
     end;
    end;
 
    //-------------1-й блок IP адреса-------------
    blok1:=''; // обнуляем
    blok1i:=256; // присваеиваем переменной значение вне диапазона 0-255
    blok1:=copy(q,nach,Massiv1[i]-nach); // копируем 1-й блок IP-адреса из строки q
    b:=blok1; for a:=1 to length(b) do if b[a] in ['0'..'9'] then else blok1:=''; // каждый символ блока должен быть цифрой
    if blok1<>'' then blok1i:=StrToInt(blok1); // переводим строку в число
 
    //-------------2-й блок IP адреса-------------
    blok2:=''; // обнуляем
    blok2i:=256; // присваеиваем переменной значение вне диапазона 0-255
    blok2:=copy(q,Massiv1[i]+1,Massiv1[i+1]-Massiv1[i]-1); // копируем 2-й блок IP-адреса из строки q
    b:=blok2; for a:=1 to length(b) do if b[a] in ['0'..'9'] then else blok2:=''; // каждый символ блока должен быть цифрой
    if blok2<>'' then blok2i:=StrToInt(blok2); // переводим строку в число
 
    //-------------3-й блок IP адреса-------------
    blok3:=''; // обнуляем
    blok3i:=256; // присваеиваем переменной значение вне диапазона 0-255
    blok3:=copy(q,Massiv1[i+1]+1,Massiv1[i+2]-Massiv1[i+1]-1); // копируем 3-й блок IP-адреса из строки q
    b:=blok3; for a:=1 to length(b) do if b[a] in ['0'..'9'] then else blok3:=''; // каждый символ блока должен быть цифрой
    if blok3<>'' then blok3i:=StrToInt(blok3); // переводим строку в число
 
    //-------------4-й блок IP адреса-------------
    blok4:=''; // обнуляем
    blok4i:=256; // присваеиваем переменной значение вне диапазона 0-255
    blok4:=copy(q,Massiv1[i+2]+1,konec-Massiv1[i+2]); // копируем 4-й блок IP-адреса из строки q
    b:=blok4; for a:=1 to length(b) do if b[a] in ['0'..'9'] then else blok4:=''; // каждый символ блока должен быть цифрой
    if blok4<>'' then blok4i:=StrToInt(blok4); // переводим строку в число
 
    //-------------условие для вставки IP-адреса-------------    
    if (q[nach]<>'') and (nach<>0) // начало IP-адреса не должно быть пустым
    and (q[konec]<>'') and (konec<>0) // конец IP-адреса не должен быть пустым
    and (blok1i>0) and (blok1i<256) // 1й блок должен быть от 1 до 255, так как IP-адрес не может начинаться с нуля
    and (blok2i>=0) and (blok2i<256) // 2й блок должен быть от 0 до 255
    and (blok3i>=0) and (blok3i<256) // 3й блок должен быть от 0 до 255
    and (blok4i>0) and (blok4i<256) // 4й блок должен быть от 1 до 255, так как IP-адрес не может заканчиваться на ноль
    then Form1.Memo1.Lines.Add(IntToStr(blok1i)+'.'+IntToStr(blok2i)+'.'+IntToStr(blok3i)+'.'+IntToStr(blok4i)); // выводим IP-адрес в список
 
   end; //-----------------------------------------------------------условие----------------------------------------------------------
 end; //-----------------------------------------------------------цикл---------------------------------------------------------------
end;