2012-05-26 2 views
1

Я делаю чат с помощью простых сокетов. У меня есть серверная и клиентская программа. Сервер работает на порту 225, а затем, когда я запускаю клиента на порт 225, так что они могут читать/писать в сокеты, клиент мгновенно останавливается с сообщением об ошибкеJava Chat Room - Почему я получаю исключение SocketException?

java.net.SocketException: Connection resetJava Result: 1 

Почему это бросает это исключение? Он подключается, линия выводится на консоль, как показано на рисунке:

try { 
    client = new Socket(serverAdress, portNumber); 
    System.out.println("Successful connection to server on port " + portNumber + "."); 

Так почему может не быть в состоянии подключиться?

Это след исключение ...

java.net.SocketException: Connection reset 
at java.net.SocketInputStream.read(SocketInputStream.java:168) 
at sun.nio.cs.StreamDecoder.readBytes(StreamDecoder.java:264) 
at sun.nio.cs.StreamDecoder.implRead(StreamDecoder.java:306) 
at sun.nio.cs.StreamDecoder.read(StreamDecoder.java:158) 
at java.io.InputStreamReader.read(InputStreamReader.java:167) 
at java.io.BufferedReader.fill(BufferedReader.java:136) 
at java.io.BufferedReader.readLine(BufferedReader.java:299) 
at java.io.BufferedReader.readLine(BufferedReader.java:362) 
at schoolroom10.SchoolRoomClient.SchoolRoomClientWindow.main(SchoolRoomClientWindow.java:85) 

Это мой код сервера ...

public class SchoolRoomServer { 

    // 'server' will create the server over the local port: 
    static ServerSocket serverSocket = null; 

    //Socket for listening: 
    static Socket clientcommunicate = null; 

    //portnum is the number of the local port. Change to required port before running. 
    static int portnum = 225; 

    public static void main(String[] args) throws IOException{ 
     try { 
      serverSocket = new ServerSocket(portnum); 
     clientcommunicate = serverSocket.accept(); 
      Communicate c = new Communicate(Communicate.server); 
      Thread t = new Thread(c); 
      t.start(); 
     } catch (UnknownHostException uhe) { 
      System.err.println(uhe); 
      System.exit(1); 
     } catch (IOException ioe) { 
      System.err.println(ioe); 
      System.exit(1); 
     } 


    } 
} 

class Communicate implements Runnable { 
    public static Socket server; 
    Communicate(Socket server) { 
     Communicate.server = server; 
    } 
    public void run() { 
     String in = ""; 
     try { 
      //i/o for clients: 
      PrintStream output = new PrintStream(server.getOutputStream()); 
      BufferedReader input = new BufferedReader(new InputStreamReader(server.getInputStream())); 
      String message; 

      //Message handling: 
      while(((message = input.readLine()) != null) && (!in.equals("."))) { 
       output.println(message); 
      } 
     } catch (IOException ioe) { 
      System.err.println(ioe); 
     } 
    } 
} 
+1

Пожалуйста, напишите полный стек. –

+0

«сервер» не должен быть статичным в классе Communicate. – EJP

ответ

0

«Сброс соединения», как правило, означает, что вы написали в связи, которая уже закрыты другим концом. Вообще говоря, это ошибка протокола приложения. Однако в некоторых случаях, например, где сверстник является браузером или, возможно, в вашем случае тоже, это просто неизбежное следствие того факта, что сверстник может выбрать уйти в любое время. В этих случаях все, что вы можете сделать, - это закрыть сокет и забыть о соединении.

2

Как указывали предыдущие плакаты, следует избегать использования портов ниже 1024, поскольку они зарезервированы.

Не видя всего своего кода, остальное просто догадки, однако на стороне клиента вы должны вводить цикл, чтобы постоянно готовиться к входному потоку и обрабатывать входящие сообщения, а затем кратковременную паузу перед повторением, например. сна (100). Тот же конец сервера для мониторинга запросов на соединение и входящих сообщений.

Если вы не читаете входной поток, он заполнит буфер и исключит соединение.

Смежные вопросы