2014-02-06 4 views
0

Я создаю программу, в которой сервер отправляет список файлов клиенту, который клиент может запросить для проверки содержимого. Он правильно отправляет список файлов, но клиент не принимает никаких данных с консоли. Это программа сервераКлиентский сокет не принимает никакого ввода от cmd

import java.util.*; 
import java.io.*; 
import java.net.*; 
class TCPServer{ 
    public static void main(String args[]) throws Exception{ 
    ServerSocket server = new ServerSocket(4888); 
    while(true){ 
    Socket client = server.accept(); 
    System.out.println(client); 
    DataOutputStream out = new DataOutputStream(client.getOutputStream()); 
    File path = new File("C://testjava"); 
    String[] files = path.list(); 
    String send = ""; 
    for(String file:files){ 
     send = send + file + "\n"; 
    } 
    out.writeBytes(send); 
    BufferedReader in = new BufferedReader(new InputStreamReader(client.getInputStream ())); 
    String search_file = in.readLine(); 
    String searching = ""; 
    for(String file:files){ 
     if (file.equals(search_file)){ 
     searching = search_file; 
     } 
    } 
if(searching.equals("")){ 
     out.writeBytes("Requested file does not exist"); 
     client.close(); 
    } 
    Scanner file = new Scanner(new FileReader(searching)); 
    while(file.hasNextLine()){ 
     out.writeBytes(file.nextLine()); 
    } 
    client.close(); 
    } 
    } 
} 

Это клиентская программа

import java.util.*; 
import java.io.*; 
import java.net.*; 
class TCPClient{ 
    public static void main(String args[]) throws Exception{ 
     Socket client = new Socket("localhost",4888); 
     BufferedReader in = new BufferedReader(new InputStreamReader(client.getInputStream())); 
     String display = ""; 
     while ((display = in.readLine()) != null) { 
      System.out.println(display); 
     } 
     System.out.println("\nChoose a file"); 
     Scanner src = new Scanner(System.in); 
     String ask_file = src.nextLine(); 
     DataOutputStream out = new DataOutputStream(client.getOutputStream()); 
     out.writeBytes(ask_file); 
     display = ""; 
     while ((display = in.readLine()) != null) { 
      System.out.println(display); 
     } 
    } 
} 

Может кто-нибудь объяснить, почему клиент не принимает какой-либо вход? Thanx

ответ

1

В клиенте in.readLine() блокируется до тех пор, пока гнездо не будет закрыто.

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

Кроме того, readLine/nextLine, как методы, сожрают новые строки, поэтому вам нужно добавить некоторые, например, @EJP. Я отредактировал ваш код ниже. Я тестировал его, и теперь он работает.

TCPServer

import java.util.*; 
import java.io.*; 
import java.net.*; 
class TCPServer{ 
    public static void main(String args[]) throws Exception{ 
    ServerSocket server = new ServerSocket(4888); 
    while(true){ 
    Socket client = server.accept(); 
    System.out.println(client); 
    DataOutputStream out = new DataOutputStream(client.getOutputStream()); 
    File path = new File("C://Users/Brian/Desktop"); 
    String[] files = path.list(); 
    String send = ""; 
    for(String file:files){ 
     send = send + file + "\n"; 
    } 
    send = send + "END\n"; // ADD SOMETHING LIKE THIS ------------------------------> 
    out.writeBytes(send); 
    BufferedReader in = new BufferedReader(new InputStreamReader(client.getInputStream ())); 
    String search_file = in.readLine(); 
    String searching = ""; 
    for(String file:files){ 
     if (file.equals(search_file)){ 
     searching = search_file; 
     } 
    } 
if(searching.equals("")){ 
     out.writeBytes("Requested file does not exist"); 
     client.close(); 
    } 
    Scanner file = new Scanner(new FileReader(searching)); 
    while(file.hasNextLine()){ 
     out.writeBytes(file.nextLine() + "\n"); // ADD A NEWLINE HERE ------------------> 
    } 
    client.close(); 
    } 
    } 
} 

TCPClient

import java.util.*; 
import java.io.*; 
import java.net.*; 
class TCPClient{ 
    public static void main(String args[]) throws Exception{ 
     Socket client = new Socket("localhost",4888); 
     BufferedReader in = new BufferedReader(new InputStreamReader(client.getInputStream())); 
     String display = ""; 
     // ADD A TEST FOR "END" HERE ---------------------------------------------> 
     while ((display = in.readLine()) != null && !display.equals("END")) { 
      System.out.println(display); 
     } 
     System.out.println("\nChoose a file"); 
     Scanner src = new Scanner(System.in); 
     String ask_file = src.nextLine() + "\n"; // ADD A NEWLINE HERE -----------> 
     DataOutputStream out = new DataOutputStream(client.getOutputStream()); 
     out.writeBytes(ask_file); 
     display = ""; 
     while ((display = in.readLine()) != null) { 
      System.out.println(display); 
     } 
    } 
} 
0

Вы читаете строки, но вы не писать строки. Вам нужно добавить \n к строкам, которые вы пишете, с writeBytes(). В противном случае readLine() блокирует постоянный ожидающий терминатор линии, который никогда не прибывает.

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