Пытаюсь сделать консольный чат на сокетах. В методе run()
в классе MessageHandler
(внутренний класс класса Client
) поток блокируется при попытке чтения из входного потока сокета: message = reader.readLine();
. Но ведь данные я туда записываю: writer.println(message);
, writer.flush();
Main.java
package main;
import classes.client.Client;
import classes.server.Server;
public class Main {
public static void main(String[] args) {
Thread acceptingConnection = new Thread(new Server().new AcceptingConnection());
acceptingConnection.setName("AcceptingConnectionThread");
acceptingConnection.start();
Client.connect();
}
}
Client.java
package classes.client;
import classes.server.Server;
import java.io.*;
import java.net.*;
import java.util.*;
public class Client {
private final Socket clientSocket;
private final String clientName;
private InputStream clientInput;
private OutputStream clientOutput;
public Client(Socket clientSocket, String clientName) {
this.clientSocket = clientSocket;
this.clientName = clientName;
try {
clientInput = this.clientSocket.getInputStream();
clientOutput = this.clientSocket.getOutputStream();
} catch (IOException ex) {
clientInput = null;
clientOutput = null;
ex.printStackTrace();
}
}
public Socket getClientSocket() {
return this.clientSocket;
}
public String getClientName() {
return this.clientName;
}
public static void connect() {
try {
Socket socket = new Socket(InetAddress.getLocalHost(), Server.port);
} catch (UnknownHostException ex) {
ex.printStackTrace();
} catch(IOException ex) {
ex.printStackTrace();
}
}
public class MessageHandler implements Runnable {
@Override
public void run() {
String message;
try(Scanner scanner = new Scanner(System.in);
BufferedReader reader = new BufferedReader(new InputStreamReader(clientInput));
PrintWriter writer = new PrintWriter(clientOutput)) {
while(true) {
System.out.print("Введите сообщение: ");
message = scanner.nextLine();
if(!message.isEmpty()) {
writer.println(message);
writer.flush();
}
message = reader.readLine(); // Вот тут где-то подвисает!!!
if(message != null && !message.isEmpty())
System.out.println("Получено сообщение: " + message);
}
} catch(IOException ex) {
ex.printStackTrace();
}
}
}
}
Server.java
package classes.server;
import java.util.*;
import java.io.*;
import java.net.*;
import classes.client.Client;
import java.util.logging.Level;
import java.util.logging.Logger;
public class Server {
public final static int port = 5555;
private List<Client> clientList;
private ServerSocket serverSocket;
public Server() {
clientList = new ArrayList<>();
try {
serverSocket = new ServerSocket(port);
} catch (IOException ex) {
ex.printStackTrace();
}
}
public class AcceptingConnection implements Runnable {
@Override
public void run() {
try {
while(true) {
Socket clientSocket = serverSocket.accept();
System.out.print("Введните свой ник: ");
Scanner scanner = new Scanner(System.in);
String clientName = scanner.nextLine();
Client client = new Client(clientSocket, clientName);
clientList.add(client);
System.out.println("Вход выполнен! Client: ");
System.out.println("\tName: " + clientName);
System.out.println("\tInetAdress: " + clientSocket.getInetAddress());
System.out.println("Количество подключенных клиентов: " + clientList.size());
Thread messageHandle = new Thread(client.new MessageHandler());
messageHandle.start();
// Thread senderThread = new Thread(client.new Sender());
// senderThread.setName("SenderThread");
// senderThread.start();
//
// Thread receiverThread = new Thread(client.new Receiver());
// receiverThread.setName("ReceiverThread");
// receiverThread.start();
}
} catch (IOException ex) {
ex.printStackTrace();
}
}
}
}
Айфон мало держит заряд, разбираемся с проблемой вместе с AppLab
Перевод документов на английский язык: Важность и ключевые аспекты
Знакомлюсь с графическим интерфейсом Java SwingПоявилась такая проблема: при нажатии на кнопку должен создаваться файл на диске, а он создается...
Здравствуйте! Есть такой вот вопрос - нужно ли всегда поверять аргументы на null? наподобие: