Запустите приложение как сервер и клиент - PullRequest
3 голосов
/ 25 марта 2011

Я хочу, чтобы мой компьютер был и сервером, и клиентом. Это мой код

import java.net.*;
class tester {
static int pos=0; 
 static byte buffer[]=new byte[100];
   static void Client() throws Exception {
    InetAddress address=InetAddress.getLocalHost();
  DatagramSocket ds=new DatagramSocket(3000,address);
   while(true) {
    int c=System.in.read();
    buffer[pos++]=(byte)c;
    if((char)c=='\n')
      break;
   }
   ds.send(new DatagramPacket(buffer,pos,address,3000));
  Server();
}                   

static void Server() throws Exception {
 InetAddress address=InetAddress.getLocalHost();
 DatagramSocket ds=new DatagramSocket(3001,address);
 DatagramPacket dp=new DatagramPacket(buffer,buffer.length);
 ds.receive(dp);
 System.out.print(new String(dp.getData(),0,dp.getLength()));
}
  public static void main(String args[])throws Exception {

 if(args.length==1) {
  Client();
   } 
 }

}

В этом я попытался сделать мой компьютер и сервером, и клиентом. Я запускаю эту программу на cmd как java tester hello но программа продолжает ждать. Что я должен сделать, чтобы получить напечатанное сообщение .?

* Если в код необходимо внести какие-либо изменения, пожалуйста, предложите. Обратите внимание, что цель состоит в том, чтобы сделать мой компьютер и сервером, и клиентом.

1 Ответ

35 голосов
/ 25 марта 2011

В настоящее время ваше приложение будет либо работать в качестве сервера или клиента, в зависимости от того, указали ли вы аргумент командной строки или нет. Для запуска обоих процессов в одном и том же процессе необходимо запустить два потока (как минимум) - один для сервера и один для клиента.

На данный момент я просто запустил бы его дважды в двух разных окнах команд - один раз с аргументом командной строки (чтобы сделать его клиентом) и один раз без (чтобы сделать его сервером).

РЕДАКТИРОВАТЬ: Я только что заметил, что ваш основной метод никогда не будет запускаться Server(). Поэтому вам нужно изменить его на что-то вроде этого:

if (args.length == 1) {
  Client();
} else {
  Server();
}

(Возможно, вы захотите одновременно следовать соглашениям об именах Java, переименовывая методы в client() и server().)

Затем удалите вызов Server() в конце Client() и вызовите конструктор DatagramSocket без параметров в Client(), чтобы не пытаться быть сервером ...

Готовый код может выглядеть что-то примерно так:

import java.io.IOException;
import java.net.*;

public class ClientServer {

   private static void runClient() throws IOException {
     InetAddress address = InetAddress.getLocalHost();
     DatagramSocket ds=new DatagramSocket();
     int pos = 0;
     byte[] buffer = new byte[100];
     while (pos < buffer.length) {
       int c = System.in.read();
       buffer[pos++]=(byte)c;
       if ((char)c == '\n') {
         break;
       }
     }
     System.out.println("Sending " + pos + " bytes");
     ds.send(new DatagramPacket(buffer, pos, address, 3000));
  }                   

  private static void runServer() throws IOException {
    byte[] buffer = new byte[100];
    InetAddress address = InetAddress.getLocalHost();
    DatagramSocket ds = new DatagramSocket(3000, address);
    DatagramPacket dp = new DatagramPacket(buffer, buffer.length);
    ds.receive(dp);
    System.out.print(new String(dp.getData(), 0, dp.getLength()));
  }

  public static void main(String args[]) throws IOException {
    if (args.length == 1) {
      runClient();
    } else {
      runServer();
    }
  }
}

Обратите внимание, что это все еще не отличный код, в частности, с использованием системного кодирования строк по умолчанию ... но он работает. Запустите сервер в одном окне, запустив java ClientServer, затем в другом окне запустите java ClientServer xxx, введите сообщение и нажмите return. Вы должны увидеть это в окне сервера.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...