2010-08-01 3 views
3

Вот код.Помощь с первой сетевой программой

public class testClient { 
public static void main(String[] args) { 
    testClient abc = new testClient(); 
    abc.go(); 
} 
public void go() { 
    try { 
     Socket s = new Socket("127.0.0.1", 5000); 
     InputStreamReader sr = new InputStreamReader(s.getInputStream()); 
     BufferedReader reader = new BufferedReader(sr); 
     String x = reader.readLine(); 
     System.out.println(x); 
     reader.close(); 
    } catch(IOException ex) { 
     ex.printStackTrace(); 
    } 
    } 
} 

public class testServer { 
public static void main(String[] args) { 
    testServer server = new testServer(); 
    server.go(); 
} 
public void go() { 
    try { 
     ServerSocket s = new ServerSocket(5000); 
     while(true) { 
      Socket sock = s.accept(); 

      PrintWriter writer = new PrintWriter(sock.getOutputStream()); 
      String toReturn = "No cake for you."; 
      writer.println(toReturn); 
     } 
    } catch(IOException ex) { 
     ex.printStackTrace(); 
    } 
    } 
} 

java.io.* и java.net.* импортируются в обоих классах.

Теперь, когда я пытаюсь запустить их (используя разные терминалы), ничего не происходит. Что я делаю не так?

экрана: http://i29.tinypic.com/250qlmt.jpg

+2

Работает ли ваш сервер, если вы используете telnet? 'telnet localhost 5000' должен сказать вам. Тогда вам нужно только отлаживать одну половину за раз. –

+0

(Обратите внимание, что вы выбираете, какая кодировка символов используется по умолчанию с обеих сторон. Гораздо лучше явно указать кодировку, возможно, UTF-8. Кроме того, 'PrintWriter' обрабатывает исключения, поэтому вы можете рассмотреть другое 'Writer'.) –

ответ

5

При использовании PrintWriter вам необходимо вызвать метод flush. Изменил ваш код следующим и работает :).

public class testServer { 
public static void main(String[] args) { 
    testServer server = new testServer(); 
    server.go(); 
} 
public void go() { 
    try { 
     ServerSocket s = new ServerSocket(5000); 
     while(true) { 
      Socket sock = s.accept(); 

      PrintWriter writer = new PrintWriter(sock.getOutputStream()); 
      String toReturn = "No cake for you."; 
      writer.println(toReturn); 
      writer.flush(); 
     } 
    } catch(IOException ex) { 
     ex.printStackTrace(); 
    } 
    } 
} 
5

Ваш выход, по-видимому буферизацией. После написания вывода, попробуйте смыва:

 writer.println(toReturn); 
     writer.flush(); 

Кроме того, вы можете рассмотреть вопрос вызова sock.close() на сервере, если вы сделали с гнездом, в противном случае клиент будет остается только гадать, что делать дальше.

+0

Writer.close() был бы более точным, так как он также выполнил бы flush(). – EJP

+0

Я никогда не помню, вызывал ли что-то вроде PrintWriter.close() закрытие базового OutputStream или нет. –

+0

Это так, но вы должны успешно создать «PrintWriter», чтобы вы могли просто закрыть базовый поток, который должен был иметься в любом случае (после того, как декоратор украсил флеш в счастливом случае). Для сокетов закрытие одного из потоков фактически закрывает сокет по умолчанию. –

1

Ознакомьтесь с этим простым рабочим примером.

import java.net.*; 
    import java.io.*; 
    public class Server { 
     Server() throws IOException { 
      ServerSocket server = new ServerSocket(4711); 
      while (true) { 
       Socket client = server.accept(); 
       InputStream in = client.getInputStream(); 
       OutputStream out = client.getOutputStream(); 
       int multiplikator1 = in.read(); 
       int multiplikator2 = in.read(); 
       int resultat = multiplikator1 * multiplikator2; 
       out.write(resultat); 
     } 
     public static void main (String[] args) { 
     try { 
     Server server = new Server(); 
     } catch (IOException e) { 
      e.printStackTrace(); 
     } 
    } 
} 

    import java.net.*; 
    import java.io.*; 
    public class Client { 
     Client() throws IOException { 
      Socket server = new Socket ("localhost", 4711); 
      InputStream in = server.getInputStream(); 
      OutputStream out = server.getOutputStream(); 
      out.write(4); 
      out.write(9); 
      int result = in.read(); 
      System.out.println(result); 
      server.close(); 
     } 
     public static void main (String[] args) { 
      try { 
      Client client = new Client(); 
     } catch (IOException e) { 
      e.printStackTrace(); 
     } 
     } 
    }