Имеется сервер который слушает команды от подключившихся клиентов. При обработке команды(запросов) клиенту отправляется массив данных. Проблема с приемам массива данных, после вывода данных сервера в цикле клиент зависает и дальше не идет по коду. Использовал для приема и передачи пакетов сокета: BufferedReader(new InputStreamReader(socket.getInputStream()));
и PrintStream(socket.getOutputStream());
Есть похожие вопросы: тут и тут
Ну а по-существу - это вопрос, как вы читаете данные от сервера на клиенте и делает ли сервер flush для PrintStream'a.
Так работает:
Сервер
public class ServerExample implements Runnable {
Socket clientSocket;
public ServerExample(Socket clientSocket) {
this.clientSocket = clientSocket;
}
public void run() {
try {
PrintWriter writer = new PrintWriter(clientSocket.getOutputStream(),true);
BufferedReader reader = new BufferedReader(new InputStreamReader(clientSocket.getInputStream()));
System.out.println("Accepted connection from " + clientSocket.getInetAddress() + ":" + clientSocket.getPort());
writer.println("Waiting for commands from client");
writer.println("Supported commands:");
writer.println(" GET");
writer.println(" CLOSE");
writer.println();
while (clientSocket.isConnected()) {
System.out.println("waiting for command...");
String line = reader.readLine();
System.out.println("command: " + line);
if ("close".equalsIgnoreCase(line) || (null == line)) {
System.out.println("Closing connection with " + clientSocket.getInetAddress() + ":" + clientSocket.getPort());
writer.println("server is closing connection");
break;
} else if ("get".equalsIgnoreCase(line)) {
System.out.println("sending data to client...");
// отправляем "массив" чисел клиенту
IntStream.range(1, 5).forEach(writer::println);
}
}
reader.close();
writer.close();
clientSocket.close();
} catch (IOException e) {
e.printStackTrace();
}
}
private final static int SERVER_PORT = 9876;
public static void main(String [] args) throws IOException {
try (ServerSocket serverSocket = new ServerSocket(SERVER_PORT)) {
System.out.println("Server is listening on 127.0.0.1:" + SERVER_PORT);
while (true) {
Socket socket = serverSocket.accept();
new Thread(new ServerExample(socket)).start();
}
}
}
}
Клиент
public class ClientExample {
private final static int SERVER_PORT = 9876;
public static void readSocket(BufferedReader reader) throws IOException, InterruptedException {
Thread.sleep(10); // Чтобы сервер успел прислать данные и reader.ready() вернул true
while(reader.ready())
System.out.println(reader.readLine());
}
public static void main(String [] args) throws IOException, ClassNotFoundException, InterruptedException {
InetAddress host = InetAddress.getLocalHost();
Socket socket = new Socket(host.getHostName(), SERVER_PORT);
PrintWriter writer = new PrintWriter(socket.getOutputStream(),true);
BufferedReader reader = new BufferedReader(new InputStreamReader(socket.getInputStream()));
readSocket(reader);
System.out.println("\n1st call to GET command");
writer.println("GET");
readSocket(reader);
System.out.println("\n2nd call to GET command");
writer.println("GET");
readSocket(reader);
System.out.println("\ncall to CLOSE command");
writer.println("CLOSE");
readSocket(reader);
}
}
Виртуальный выделенный сервер (VDS) становится отличным выбором
Возможно этот вопрос уже задавался, но я его так и не нашелКак добавить пункт в "глобальное" контекстное меню
Пишу прогу на java и графический интерфейс для нее на javafx все было хорошоНо в один момент начала выскакивать ошибка java tm platform se binary не отвечает
Создал заготовку под разработку Enterprise приложенияВ качестве сборщика приложения использую Maven
Доброе время суток всемВопрос такой - как сделать тень поверх фонового изображения другого элемента? Есть элемент, у которого есть тень box-shadow,...