2009-11-30 2 views
2

Я пытаюсь написать клиент и сервер времени для назначения, и у меня возникли проблемы с получением сервером второго запроса от клиента. Первый запрос проходит через штраф без заминки. то он просто кивает. Я на самом деле довольно потерян во всем этом и довольно неудобен с java, поэтому я понятия не имею, что мне не хватает. Любые указатели приветствуются. Благодаря!Java-сервер-клиент | сервер не получит второй запрос

Вот код Sever:

import java.io.*; 
import java.util.*; 
import java.net.*; 
import java.text.*; 

public class myServer { 

     protected static final int PORT_NUMBER = 55555; 

     public static void main(String args[]) { 

     try { 

      ServerSocket servsock = new ServerSocket(PORT_NUMBER); 

      System.out.println("Server running..."); 

      while(true) { 

       Socket sock = servsock.accept(); 

       System.out.println("Connection from: " + sock.getInetAddress()); 

       Scanner in = new Scanner(sock.getInputStream()); 
       PrintWriter out = new PrintWriter(sock.getOutputStream()); 
       String request = ""; 

       request = in.next(); 

       System.out.println("Request: " + request); 

       if(request.toUpperCase().equals("TIME")) { 
        out.println(getTime()); 
        out.flush(); 
       } else { 
        out.println("Invalid Request..."); 
        out.flush(); 
       } 

      } 

     } catch(Exception e) { 
      System.out.println(e.toString()); 
     } 

    } 

     protected static String getTime() { 
      DateFormat dateFormat = new SimpleDateFormat("HH:mm:ss"); 
      Date date = new Date(); 
      return (dateFormat.format(date)); 
     } 

} 

Вот Клиент:

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

public class myClient { 

     protected static final String HOST = "127.0.0.1"; 
     protected static final int PORT = 55555; 

     protected static Socket sock; 

     public static void main(String args[]) { 

     try { 

       sock = new Socket(HOST,PORT); 

       System.out.println("Connected to " + HOST + " on port " + PORT); 

       Scanner response = new Scanner(sock.getInputStream()); 
       PrintWriter request = new PrintWriter(sock.getOutputStream()); 
       BufferedReader in = new BufferedReader(new InputStreamReader(System.in)); 
       String txt = ""; 

       while(!txt.toUpperCase().equals("EXIT")) { 

        System.out.print("prompt:"); 
        txt = in.readLine(); 

        request.println(txt); 
        request.flush(); 

        System.out.println(response.next()); 

       } 

       request.close(); 
       response.close(); 
       in.close(); 
       sock.close(); 

      } catch(IOException e) { 
       System.out.println(e.toString()); 
      } 
     } 

} 

ответ

4

Вы должны иметь еще один цикл WHILE, что-то вроде этого,

while(true) {     
     Socket sock = servsock.accept();     
     System.out.println("Connection from: " + sock.getInetAddress());     
     Scanner in = new Scanner(sock.getInputStream());     
     PrintWriter out = new PrintWriter(sock.getOutputStream());     
     String request = "";     
     while (in.hasNext()) { 
      request = in.next();     
      System.out.println("Request: " + request);     
      if(request.toUpperCase().equals("TIME")) {      
       out.println(getTime()); 
       out.flush();     
      } else { 
       out.println("Invalid Request...");      
       out.flush(); 
      } 
     } 
} 
+1

Большое вам спасибо! Я так долго перебирал это. Я не знаю, почему я этого не видел, но СПАСИБО! – seventeen

+0

Спасибо, что спасли мой день :) – koutuk

2

От PrintWriterdocs:

... если автоматическая промывка включена, это будет сделано только если один из println, printf, илиПрименяется 10 методов ...

Ваш сервер вызывает print() и никогда не очищает поток, поэтому время никогда не отправляется. Либо вызовите println(), либо явно промойте поток.

Кроме того, сервер закрывает соединение сразу после отправки времени, поэтому второй запрос клиента всегда терпит неудачу ...

Edit: есть интересная особенность здесь - закрытие PrintWriterOUGHT промывать его (см спецификацию Writer), но из-за того, что операций кажется, чтобы вместо этого произойдет:

  1. in.close() закрывает лежащий в основе Socket
  2. out.close()бы смывать данные, записанные, но не может (как сокет уже закрыт)

Не уверен, что это именно то, что происходит, но поменяв порядок этих двух утверждений изменяет поведение , предположительно, давая out.close() шанс потопить ...

+0

спасибо, Я тя и я, наконец, получил эти два сообщения. Тем не менее, он все еще не принимает второй запрос. Я обновляю код в вопросе до текущей версии. Есть идеи? – seventeen

+0

После прочтения первого запроса сервер просто выбрасывает соединение и снова вызывает 'servsock.accept()', заставляя его ждать подключения * нового клиента. – SimonJ