Связь сервер / клиент - PullRequest
       29

Связь сервер / клиент

1 голос
/ 08 февраля 2012

У меня есть программа, которая прослушивает соединения от клиента.

import java.io.*;
import java.net.*;

class SocketExampleServer {

    public static void main(String [] args) throws Exception {

    int port = 5665;
    ServerSocket ss = new ServerSocket(port);
    System.out.println("Waiting incoming connection...");

    Socket s = ss.accept();
    DataInputStream dis = new DataInputStream(s.getInputStream());

    DataOutputStream out = new DataOutputStream(s.getOutputStream());

    String x = null;

    try {
        while ((x = dis.readUTF()) != null) 
        {
        System.out.println(x);
        out.writeUTF(x.toUpperCase());

        }      

    }
    catch(IOException e) 
    {
        System.err.println("Client closed its connection.");
    }
    catch(Exception e)
    {
        System.err.println("Unknown exception");
    }

    s.close();
    ss.close();
    dis.close();
    out.close();
    System.exit(0);
    }


}

Дело в том, что в этот момент

 System.out.println(x);
            out.writeUTF(x.toUpperCase());

выполняется только вторая строка.Если вы поменяете местами линию один раз, будет выполнена только вторая линия.В чем причина этого?И еще одна вещь, когда я запускаю программу во второй раз, она выдает эту ошибку:

Exception in thread "main" java.net.SocketException: Unrecognized Windows Sockets error: 0: JVM_Bind
    at java.net.PlainSocketImpl.socketBind(Native Method)
    at java.net.PlainSocketImpl.bind(Unknown Source)
    at java.net.ServerSocket.bind(Unknown Source)
    at java.net.ServerSocket.<init>(Unknown Source)
    at java.net.ServerSocket.<init>(Unknown Source)
    at SocketExampleServer.main(SocketExampleServer.java:9)

Как только я меняю номер порта на новый, он запускается один раз, а в следующий раз вам нужно обновитьномер порта, если вы хотите запустить его снова.Я не получил причину для этого, потому что я закрываю сокет, и, по моему мнению, порт останется свободным для следующего запуска.

1 Ответ

2 голосов
/ 08 февраля 2012

По 2-му вопросу:

Не уверен, что является причиной этого, но чтобы избежать возможности неконтролируемого исключения, генерируемого вашим кодом, вы должны закрыть свои ресурсы в предложении finally:

ServerSocket ss;
try {
...
} 
finally {
    if (ss.close() != null) {
                ss.close();
    }    
}
...