2015-09-19 3 views
-1

Я пробовал все, но ничего не работает. Я теряю рассудок, и если кто-то может помочь, это будет здорово. Я пишу простой код клиент/сервер, где у меня есть echoclient.class, который был указан, и я полагаю, что он запускает его на сервере, я пишу все на localhost. Класс echoClient отправляет сообщение, и я полагаю, что он должен отменить строку и отправить ее обратно. я продолжаю получать соединение, отказавшееся с классом echo client, но когда я запускаю сервер эхо, он работает нормально. любая помощь???Java-сокет Соединение с клиентом и сервером отказалось от выпуска

это мой код:

import java.io.BufferedReader; 
    import java.io.IOException; 
    import java.io.InputStreamReader; 
    import java.io.PrintWriter; 
    import java.net.Socket; 
    import java.net.ServerSocket; 

    public class EchoServer { 

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

     int port = Integer.parseInt(args[1]); 
     String hostid = args[0]; 

      ServerSocket echoServer = new ServerSocket(port); 
      System.out.println("Success"); 

     try{ 
      Socket echoClient = new Socket(hostid, port); 
      echoClient = echoServer.accept(); 
      System.out.println("Connection made"); 

     // while(true){ 
      while ((echoServer.isClosed() != true) ||  
        (echoClient.isClosed() != true)) { 

      BufferedReader reader = new BufferedReader(new 
          InputStreamReader(echoClient.getInputStream())); 

      String message = reader.readLine(); 
      PrintWriter writer = new 
          PrintWriter(echoClient.getOutputStream(), true); 

      while(message.contains("#") != true || message.contains("$") 
                   != true){ 
      String builder = new 
           StringBuilder(message).reverse().toString(); 

     writer.println(builder + "\n"); 
      }//writer.close(); 

      System.out.println(message + "\n"); 

      writer.close(); 
       echoServer.close(); 
      echoClient.close(); 
      } 

     }catch(IOException ex){ 
      ex.printStackTrace(); 
     } 
    } 
} 

и это результаты:

java -cp . EchoClient 127.0.0.1 1234 
Exception in thread "main" java.net.ConnectException: Connection refused 
    at java.net.PlainSocketImpl.socketConnect(Native Method) 
    at java.net.AbstractPlainSocketImpl.doConnect(AbstractPlainSocketImpl.java:345) 
    at java.net.AbstractPlainSocketImpl.connectToAddress(AbstractPlainSocketImpl.java:206) 
    at java.net.AbstractPlainSocketImpl.connect(AbstractPlainSocketImpl.java:188) 
    at java.net.SocksSocketImpl.connect(SocksSocketImpl.java:392) 
    at java.net.Socket.connect(Socket.java:589) 
    at java.net.Socket.connect(Socket.java:538) 
    at java.net.Socket.<init>(Socket.java:434) 
    at java.net.Socket.<init>(Socket.java:211) 
    at EchoClient.main(EchoClient.java:22) 

and when i run this: 
java -cp . EchoServer 127.0.0.1 1234 
Success 
Connection made 
+0

спасибо, ребята, за выдающиеся ответы, вы, ребята, потрясающие, я просто схожу с ума здесь – Ubiq

ответ

0

Я думаю, что есть несколько проблем с вашим кодом. Во-первых, похоже, что ваш сервер и клиент находятся в одном классе. Я думаю, что они должны быть отдельными; вы должны иметь echoServer.java и echoClient.java. Затем, предположив, что вы это сделали и только показываете echoServer, в строке после «try» вы создаете новый echoClient с хостом и портом. Вам не нужно это делать, следующая строка позаботится об этом, она должна прочитать Socket echoClient = echoServer.accept(); Далее, я думаю, что ваше заявление не так.

Вы должны смотреть на http://introcs.cs.princeton.edu/java/84network/EchoServer.java.html и http://introcs.cs.princeton.edu/java/84network/EchoClient.java.html

RON Шенка

2
  • «Connection отказался» просто означает, что ничего не слушает на IP: порт, который вы пытались подключиться. Возможно, вы запустили клиент перед сервером.

  • Тесты isClosed() бессмысленны. Они возвращают true только тогда, когда вы закрыли соответствующий сокет. Они ничего не говорят о состоянии связи.

  • Socket echoClient = new Socket(hostid, port); 
    echoClient = echoServer.accept(); 
    

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

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