Я думаю, что ваша проблема (или хотя бы одна проблема) связана с сервером.Когда клиент подключается, вы устанавливаете:
os = new PrintStream(clientSocket.getOutputStream());
os
- статическая переменная внутри сервера.Это неправильно.
static PrintStream os
Каждый клиентский поток должен иметь свой отдельный PrintStream
.Вам нужно будет получить потоки ввода / вывода и передать их в ваш обработчик.
clientSocket = serverSocket.accept();
DataInputStream is = new DataInputStream(clientSocket.getInputStream());
PrintStream os = new PrintStream(clientSocket.getOutputStream());
... new ServerThread(is, os, clientSocket, t)).start();
Кроме того, я не понимаю, почему вы разветвляете 10 потоков для каждого клиентского соединения.Это кажется неправильным.Обычно вы можете принять клиентское соединение, а затем создать поток 1 для обработки этого конкретного соединения с этими входными и выходными потоками.