NTP для TCP/IP (сервер-клиент)

у меня простой сервер...

public static void main(String[] args) throws Exception{
    ServerSocket server = new ServerSocket(2000);
    Socket sock = server.accept();
    InputStream  in = sock.getInputStream();
    OutputStream out = sock.getOutputStream();
    PrintWriter w = new PrintWriter(out);
    Scanner s = new Scanner(in);
    ...

а простой клиент...

public static void main(String[] args) throws Exception{
    Socket sock = new Socket("localhost",2000);;
    InputStream in= sock.getInputStream();
    OutputStream out = sock.getOutputStream();
    PrintWriter w  = new PrintWriter(out);
    Scanner s = new Scanner(in);
    ....

-как я могу подключить больше клиентов к этому серверу? (мне нужно еще 2) - также я хочу отправить системное время с сервера клиентам, а затем клиенты будут отправлять обратно свое время по 10 раз каждый плюс некоторая фиксированная задержка (0,5-1 сек), тогда сервер должен найти среднее значение из всех задержек и отправьте его обратно клиентам как новое время...

Спасибо за уделенное время...


person Anastasios Christodoulakios    schedule 10.05.2013    source источник
comment
server.accept в цикле и возвращаемые сокеты обрабатываются в отдельном потоке. Вы можете рассмотреть возможность использования ExecutorService.   -  person Fildor    schedule 10.05.2013


Ответы (1)


System.currentTimeMillis() предоставляет системное время

Каждый сокет, возвращаемый server.accept(), является отдельным объектом, и ваш сервер может независимо взаимодействовать с каждым клиентом через каждый объект сокета. Однако, поскольку ваше приложение чувствительно ко времени, я бы рекомендовал использовать отдельный поток для каждого клиента.

Простой сервер будет:

ServerSocket serverSock = new ServerSocket(2000);

while (true)
{
    Socket fpSock = serverSock.accept();
    MyThread t = new MyThread(fpSock, this);
    t.start();
}

Необходимая обработка будет выполняться в методе MyThread run(). «this» передается потоку, чтобы предоставить ссылку, по которой каждый поток может выполнять обратный вызов методов в основном классе. Убедитесь, что такие методы synchronized.

Вам также не обязательно отправлять время сервера клиенту, просто отправьте общий пакет, который клиент, как ожидается, ответит эхом. Используйте отметку времени сервера для всех транзакций, чтобы избежать отклонений в системном времени клиента.

person nitegazer2003    schedule 10.05.2013
comment
Большое спасибо... m8... Мне все еще трудно это сделать, потому что я не очень привык к потокам и сокетам... Сейчас я их изучаю... но я попробую.. :) - person Anastasios Christodoulakios; 10.05.2013
comment
Еще один вопрос.... Гм.... Если у меня есть 2 или более бесконечных цикла, как я могу связать их, чтобы они могли работать вместе? - person Anastasios Christodoulakios; 10.05.2013
comment
Вы можете иметь 2 бесконечных цикла без проблем. Однако вам может понадобиться запустить только один экземпляр некоторых методов, и вы должны пометить их как синхронизированные. Прочтите о многопоточности и параллелизме Java для получения дополнительной информации. - person nitegazer2003; 22.05.2013