Java-клиент / серверные сокеты
Я начинаю с Java-сокетов и получаю странный вывод. Вот мой источник для методов сокетов:
Исходный код клиента:
public void loginToServer(String host, String usnm ) {
try {
Socket testClient = new Socket(host,1042);
System.out.println ("Connected to host at " + host);
logString = ("CONNECTED: " + host);
outGoing = new PrintWriter(testClient.getOutputStream(), true);
outGoing.print("Hello from " + testClient.getLocalSocketAddress());
InputStream inFromServer = testClient.getInputStream();
DataInputStream in = new DataInputStream(inFromServer);
System.out.println("Server says " + in.readLine());
testClient.close();
}
catch (Exception e) {
System.err.println ("Error connecting to host at " + host + ":1042.\n Reason: " + e);
logString = ("CONNECT FAILED: " + host + ":1042: " + e);
}
printLog(logString);
// send server usnm and os.name [System.getProperty(os.name)] ?
}
И код сервера:
public void runServer() {
try{
server = new ServerSocket(1042);
}
catch (IOException e) {
printLog("LISTEN FAIL on 1042: " + e);
System.err.println("Could not listen on port 1042.");
System.exit(-1);
}
try{
client = server.accept();
}
catch (IOException e) {
printLog("ACCEPT FAIL on 1042: " + e);
System.err.println("Accept failed: 1042");
System.exit(-1);
}
try{
inComing = new BufferedReader(new InputStreamReader(client.getInputStream()));
outGoing = new PrintWriter(client.getOutputStream(), true);
}
catch (IOException e) {
printLog("READ FAIL on 1042: " + e);
System.err.println("Read failed");
System.exit(-1);
}
while(true){
try{
clientData = inComing.readLine();
//processingUnit(clientData, client);
outGoing.print("Thank you for connecting to " + server.getLocalSocketAddress() + "\nGoodbye!");
}
catch (IOException e) {
printLog("READ FAIL on 1042: " + e);
System.out.println("Read failed");
System.exit(-1);
}
}
}
И результат, который дал клиент, был просто Connected to host at localhost
,
В чем дело?
2 ответа
Вы читаете строки, но не отправляете строки. + Изменить print()
в println()
, readLine()
навсегда заблокирует ожидание новой строки. Он вернет ноль в конце потока, то есть, когда одноранговый узел закрывает соединение, но вы также не проверяете это, поэтому вы зацикливаетесь на неопределенное время.
Вы пишете текст и читаете двоичный файл. Поскольку ваш вывод и ввод не совпадают, в этом случае весьма вероятно зависание.
Я предлагаю вам использовать двоичный файл с writeUTF/readUTF или текст с println/readLine.
Кстати: readUTF считывает два байта, чтобы определить длину данных для чтения. Поскольку первые два байта являются текстом ASCII, вы, вероятно, подождите около 16 000 символов, прежде чем вернуться.