2012-02-08 5 views
1

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

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) 

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

+0

[Посмотрите на фактические порты] (http://www.petri.co.il/quickly_find_local_open_ports.htm), возможно, вы увидите, какой процесс поддерживает привязку сокетов. –

ответ

2

На 2-й вопрос:

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

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

Нет, оператор, наконец, ничего не меняет. – uml

+0

Как именно вы запускаете свою программу и как ее прервать? –

+0

Сначала я запускаю сервер (см. Выше), затем запускаю клиент (не представлен здесь). В конце каждого файла у меня есть System.exit (0); – uml