2013-09-26 4 views
1

всем! Я пытаюсь сделать свою первую Java-аппликацию с помощью Sockets. И у меня проблемы с чтением из Socket. Вот исходный код для ServerThread:Не удается прочитать с Socket

public class ServerThread extends Thread{ 
private final int SERVER_PORT = 444; 
private ServerSocket serv; 
public ServerThread(){ 

    try { 
     serv = new ServerSocket(SERVER_PORT); 
    } catch (IOException ex) { 
     Logger.getLogger(ServerThread.class.getName()).log(Level.SEVERE, null, ex); 
    } 
} 

@Override 
public void run(){ 
    while(true){ 
     try { 
      Socket client = serv.accept(); 
      client.setSoTimeout(0); 
      client.setTcpNoDelay(true); 
      client.setSendBufferSize(65536); 
      if(client.isConnected()){ 
       new Thread(new MsgSrv(client)).start(); 
       System.out.println("Client connected"); 
      } 
     } catch (IOException ex) { 
      Logger.getLogger(ServerThread.class.getName()).log(Level.SEVERE, null, ex); 
     } 

    } 
} } 

А вот для класса, который обрабатывает клиентские соединения:

public class MsgSrv extends Thread{ 
private BufferedWriter out; 
private BufferedReader in; 
private boolean isFinished = false; 
private String buff; 
private Socket sock; 
public MsgSrv(Socket sc){ 
    try { 
     sock = sc; 
     in = new BufferedReader(new InputStreamReader(sc.getInputStream())); 
     out = new BufferedWriter(new OutputStreamWriter(sc.getOutputStream())); 
    } catch (IOException ex) { 
     Logger.getLogger(MsgSrv.class.getName()).log(Level.SEVERE, null, ex); 
    } 

} 
public void run(){ 
    while(!isFinished){ 
     try { 
      buff=in.readLine(); 
      System.out.println(buff); 
      out.write("Hello"); 
     } catch (IOException ex) { 
      Logger.getLogger(MsgSrv.class.getName()).log(Level.SEVERE, null, ex); 
      isFinished=true; 
     } 
    } 
}} 

клиентское приложение отправляет строку на сервер, и пытается прочитать ответ , Но ничего не происходит. in.readLine ничего не возвращает и ждет ответа с сервера навсегда. Можете ли вы помочь мне решить проблему? Для чтения данных я уже использовал классы DataInputStream, BufferedReader. Источник для клиентского приложения:

public class JavaApplication4 { 

/** 
* @param args the command line arguments 
*/ 
public static Socket connectSock; 
public static PrintWriter out; 
public static DataInputStream in; 
public static void main(String[] args) { 
    try { 

     connectSock = new Socket("127.0.0.1", 444); 
     if(connectSock.isConnected()){ 
      in = new DataInputStream(connectSock.getInputStream()); 
      out = new PrintWriter(connectSock.getOutputStream(), true); 
      out.println("!hello!"); 
      out.flush(); 
      String s; 
      while(true){ 
       s = in.readUTF(); 
       System.out.println(s); 
      } 

       }else 
     { 
      System.out.println("bad socket"); 
      System.exit(0); 
     } 
    } catch (UnknownHostException ex) { 
     Logger.getLogger(JavaApplication4.class.getName()).log(Level.SEVERE, null, ex); 
    } catch (IOException ex) { 
     Logger.getLogger(JavaApplication4.class.getName()).log(Level.SEVERE, null, ex); 
    } 

}} 
+0

Тестирование 'isConnected()' также бессмысленно. Сокет не может быть подключен в этих точках. – EJP

+0

Нет проблем с методом isConnected. Сервер получает строку от клиента и печатает ее на консоли. Но клиент не может получить строку с сервера. – balamutik

+0

Мое замечание было комментарием, а не ответом. Вызов этого метода в этих местах остается бессмысленным. Не пишите бессмысленный код. Это просто путает проблему. – EJP

ответ

0

Как вам использовать PrintWriter объект послал струнный использовать Scanner объект для чтения строки. Как это.

input = server.getInputStream(); 
Scanner scanner = new Scanner(input); 

while (scanner.hasNextLine()) { 
    s = (String) scanner.nextLine(); 
} 

редактировать:

Если изменить вам клиента, как это и убедитесь, что у вас есть линия разрыва в конце вас String («\ п») при использовании scanner.nextLine();

if(connectSock.isConnected()){   
     Scanner scanner = new Scanner(connectSock.getInputStream()); 
     out = new PrintWriter(connectSock.getOutputStream(), true); 
     out.println("!hello!"); 
     out.flush(); 
     String s; 
     while (scanner.hasNextLine()) { 
      s = (String) scanner.nextLine(); 

     } 

      }else 
    { 
+0

И все равно ничего не происходит ... – balamutik

+0

Вы уверены, что есть соединение? – JWqvist

+0

Да, я уверен. Потому что сервер получает строку от клиента. – balamutik

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