Есть самый простой клиент-сервер, можно подключиться к серверу и из клиента посылать сообщения, сервер возвращает посланное сообщение назад.
Загвоздка в том, что он является последовательным, иными словами сокет занят одним клиентом и остальные должны дождаться окончания. На форумах нет примеров с обработкой нескольких клиентов одновременно, использующих библиотеку concurrent.
Привожу код клиента и сервера:
Server:
public class Server {
/**
* @param args the command line arguments
*/
public static void main(String[] args) {
int port = 6666; //мой некий порт
try {
ServerSocket ss = new ServerSocket(port); // создаем сокет сервера и привязываем его к вышеуказанному порту
System.out.println("Ожидание клиента");
Socket socket = ss.accept(); // заставляем сервер ждать подключений и выводим сообщение когда кто-то связался с сервером
System.out.println("Клиент подключился");
System.out.println();
// Берем входной и выходной потоки сокета, теперь можем получать и отсылать данные клиенту.
InputStream sin = socket.getInputStream();
OutputStream sout = socket.getOutputStream();
// Конвертируем потоки в другой тип, чтоб легче обрабатывать текстовые сообщения.
DataInputStream in = new DataInputStream(sin);
DataOutputStream out = new DataOutputStream(sout) {
};
String line = null;
while (true) {
line = in.readUTF(); // ожидаем пока клиент пришлет строку текста.
System.out.println("От клиента я получил следующую строку : " + line);
System.out.println("Отправляю обратно...");
out.writeUTF(line); // отсылаем клиенту обратно ту самую строку текста.
out.flush(); // заставляем поток закончить передачу данных.
System.out.println("Жду следующую строку...");
System.out.println();
}
} catch (Exception x) {
x.printStackTrace();
}
}
}
Client:
public class Client {
public static void main(String[] args) {
int serverPort = 6666; // порт к серверу, которому хотим присоединиться
String address = "127.0.0.1"; // это IP-адрес компьютера, где исполняется наша серверная программа.
// Здесь указан адрес того самого компьютера где будет исполняться и клиент.
try {
InetAddress ipAddress = InetAddress.getByName(address); // создаем объект который отображает вышеописанный IP-адрес.
System.out.println("Если ли кто-то, подключенный по этому адресу " + address + " и порту " + serverPort + "?");
Socket socket = new Socket(ipAddress, serverPort); // создаем сокет используя IP-адрес и порт сервера.
System.out.println("Соединение установлено.");
// Берем входной и выходной потоки сокета, теперь можем получать и отсылать данные клиентом.
InputStream sin = socket.getInputStream();
OutputStream sout = socket.getOutputStream();
// Конвертируем потоки в другой тип, чтоб легче обрабатывать текстовые сообщения.
DataInputStream in = new DataInputStream(sin);
DataOutputStream out = new DataOutputStream(sout);
// Создаем поток для чтения с клавиатуры.
BufferedReader keyboard = new BufferedReader(new InputStreamReader(System.in));
String line = null;
System.out.println("Введите что-нибудь, это будет отправлено на сервер и возвращено им.");
System.out.println();
while (true) {
line = keyboard.readLine(); // ждем пока пользователь введет что-то и нажмет кнопку Enter.
System.out.println("Отправляем строку на сервер...");
out.writeUTF(line); // отсылаем введенную строку текста серверу.
out.flush(); // заставляем поток закончить передачу данных.
line = in.readUTF(); // ждем пока сервер отошлет строку текста.
System.out.println("Сервер прислал ответ : " + line);
System.out.println("Введите следующую строку...");
System.out.println();
}
} catch (Exception x) {
x.printStackTrace();
} }
}
Каким образом сделать асинхронную обработку каждого клиента?И как вообще запустить несколько клиентов, по сути это просто 2 разных проекта в нетбинсе, и запуская сначала сервер, затем клиент - я запускаю два проекта, еще раз запустить клиент не получается. Кнопка серая.