Я отчаянно пытался заставить этот сервер принимать несколько клиентов.
В настоящее время сервер представляет собой GUI, который может одновременно обмениваться файлами и обмениваться файлами с клиентом (который также может делать то же самое с помощью аналогичной установки GUI). На данный момент я создал отдельный класс ClientHandler, который создает новый сервер с помощью многопоточности для каждого запроса подключения клиента. Кроме того, на данный момент первый подключенный клиент успешно считывает потоки и подключается, а дополнительные клиенты подключаются к хосту, но никогда не получают потоки (или, по-видимому, таким образом, по крайней мере, при печати во вновь созданном клиенте). windows).
Не публикуя все 500 строк кода, я опубликую методы конструктора run () и processConnection () из серверного приложения (то есть созданного потока)
public TextingServerJF(Socket socket, ObjectInputStream input, ObjectOutputStream output) {
this.connection = socket;
this.input = input;
this.output = output;
setupGUI();
} // end TextingServerJF constructor
@Override
public void run() {
//try {
//server = new ServerSocket(10007, 100);
while (true) {
try {
//waitForConnection();
//getStreams();
processConnection();
} catch (EOFException eofException) {
displayMessage("\nServer terminated connection");
} catch (IOException e) {
e.printStackTrace();
} finally {
closeConnection();
++counter;
} // end inner try block
} // end while
/*
} catch (IOException ioException) {
ioException.printStackTrace();
} // end outer try block
*/
} // end runServer()
private void processConnection() throws IOException {
String message = "Connection successful";
sendData(message);
setTextFieldEditable(true);
do {
try
{
/*
* Code to enter the "receive file mode" if the client sends a file
*/
if (message.equals("CLIENT>>> data sent")) {
receiveFile();
} // end if
message = (String) input.readObject();
displayMessage("\n" + message);
/*
* Code for step 1 of the lab -- Code looks for a
* "Message received successfully" from the client and if it gets one, it does
* nothing. Otherwise the message is sent from the server that IT received the
* message successfully. Essentially the server is echoing that it received the
* message if the client sends one.
*/
if (message.equals("CLIENT>>> Message received successfully")) {
// Do nothing to avoid an infinite loop for step 1
// Below is for step 2
displayTime(getTime(System.nanoTime()));
setTimeAverage(rtt);
timeCount++;
time = 0;
if (timeCount > 10) {
displayAverage(getTimeAverage(timeAverage, timeCount), timeCount);
// end step 2
} // end inner if
} else {
sendData("Message received successfully");
} // end if/else
} // end try block
catch (ClassNotFoundException classNotFoundException) {
displayMessage("\nUnknown object type received");
}
} while (!message.equals("CLIENT>>> TERMINATE")); // end do-while
} // end method processConnection
Обратите внимание, что сервер реализует работоспособный. Клиентский обработчик имеет свой собственный gui, который просто говорит, что ждет клиента, а затем исчезает при подключении, как вы увидите ниже. Любая помощь с благодарностью! Теперь ниже я опубликую свой код обработчика клиента:
public void run() {
try {
server = new ServerSocket(1007, 100);
} catch (IOException e1) {
e1.printStackTrace();
}
while (true) {
socket = null;
try {
socket = server.accept();
getStreams();
frame.setVisible(false);
frame.dispose();
TextingServerJF serverApp = new TextingServerJF(socket, input, output);
clientThread = new Thread(serverApp);
array.add(serverApp);
counter++;
clientThread.start();
} catch (IOException e) {
e.printStackTrace();
} finally {
closeConnection();
}// end try block
} // end while
} // end method run
private void getStreams() throws IOException {
output = new ObjectOutputStream(socket.getOutputStream());
output.flush();
input = new ObjectInputStream(socket.getInputStream());
} // end method getStreams
private void closeConnection() {
try {
output.close();
input.close();
socket.close();
} catch (IOException ioException) {
ioException.printStackTrace();
} // end try block
} // end method closeConnection