В настоящее время ваше приложение будет либо работать в качестве сервера или клиента, в зависимости от того, указали ли вы аргумент командной строки или нет. Для запуска обоих процессов в одном и том же процессе необходимо запустить два потока (как минимум) - один для сервера и один для клиента.
На данный момент я просто запустил бы его дважды в двух разных окнах команд - один раз с аргументом командной строки (чтобы сделать его клиентом) и один раз без (чтобы сделать его сервером).
РЕДАКТИРОВАТЬ: Я только что заметил, что ваш основной метод никогда не будет запускаться 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. Вы должны увидеть это в окне сервера.