#java #tcp
#java #tcp
Вопрос:
Я пытаюсь создать небольшой TCP-сервер / клиент. У меня есть клиент и сервер, и после решения некоторых основных исключений ничего не работает. Предполагается, что клиент отправляет (пользовательские) данные на сервер (на порт 6789, localhost), который затем должен записать их в верхнем регистре и завершить их обратно. Кажется, все работает, за исключением отправки обратно заглавной буквы. Вот этот код:
TCPServer:
import java.io.BufferedReader;
import java.io.DataOutputStream;
import java.io.InputStreamReader;
import java.net.ServerSocket;
import java.net.Socket;
public class TCPServer {
public static void main(String[] args) throws Exception {
System.out.println("SERVER");
String clientSentence;
String capitalizedSentence;
ServerSocket server = new ServerSocket(6789);
TCPClient.main(null);
while (true) {
Socket connection = server.accept();
System.out.println("<S> Connection!");
BufferedReader fromClient = new BufferedReader(
new InputStreamReader(connection.getInputStream()) );
DataOutputStream toClient = new DataOutputStream(connection.getOutputStream());
clientSentence = fromClient.readLine();
System.out.println("<S> Recieved: " clientSentence);
capitalizedSentence = clientSentence.toUpperCase() 'n';
System.out.print("About to send: " capitalizedSentence);
toClient.writeBytes(capitalizedSentence);
}
}
}
TcpClient Клиент:
import java.io.BufferedReader;
import java.io.DataOutputStream;
import java.io.InputStreamReader;
import java.net.Socket;
public class TCPClient {
public static void main(String[] args) throws Exception {
System.out.println("CLIENT");
String sentence;
String modSentence;
BufferedReader inUser = new BufferedReader(new InputStreamReader(System.in));
Socket clientToServer = new Socket("localhost", 6789);
DataOutputStream outServer = new DataOutputStream(clientToServer.getOutputStream());
BufferedReader inServer = new BufferedReader(
new InputStreamReader(clientToServer.getInputStream()) );
System.out.println("<C> Type now: ");
sentence = inUser.readLine();
System.out.println("<C> Got it!");
System.out.println("<C> Sending " sentence " to server...");
outServer.writeBytes(sentence 'n');
outServer.flush();
System.out.println("<C> Server respodse:");
modSentence = inServer.readLine();
System.out.println("<C> From server: " modSentence);
clientToServer.close();
}
}
Консоль:
SERVER
CLIENT
<C> Type now:
efd
<C> Got it!
<C> Sending efd to server...
<C> Server respodse:
asd
и…
Ничего
Комментарии:
1. Вы забыли сбросить ответ сервера
2. Кажется, я понял (наконец-то)! Вероятно, это как-то связано с тем фактом, что я запускаю клиент и сервер в одном потоке, верно? Таким образом, цикл никогда не будет доступен
3. Это отдельные программы, они выполняются в отдельных процессах
4. кстати: хороший стиль кодирования. Особенно хороши имена ваших переменных. Я использую больше методов, но для новичка действительно хороший код!
Ответ №1:
Ответ: я глупый.
Я случайно позволил клиенту и серверу работать в одном потоке. Теперь я сделал TCPClient
Runnable
, и все работает, как планировалось.
ПРИМЕЧАНИЕ: TCPClient.main(null)
не запускается новая программа / поток, просто тот же поток, другая статическая функция.
Ответ №2:
Вы сбрасываете на стороне клиента, но не на стороне сервера!
Просто добавьте
toClient.flush()
вызов на стороне сервера тоже!