2016-10-06 25 views
0

このプログラムを実行すると、Clientクラスはユーザーにコマンドを入力するように要求し、そのコマンドはServerクラスに移動してファイルを開き、そのファイルの各行を読み取り、バイト長表示されるClientクラスに戻ります。JAVA TCPクライアント - サーバー接続

残念ながら、コマンドを入力すると、何も起こりません。&理由がわかりません。

TCPクライアントクラス

package TcpClient; 

import java.io.BufferedReader; 
import java.io.InputStreamReader; 
import java.net.Socket; 
import java.io.*; 

public class TcpClient { 
    public static void main(String[] args) { 
    String temp; 
    String displayBytes; 
    try { 
     //create input stream 
     BufferedReader inFromUser = new BufferedReader(new InputStreamReader(System.in)); 
     //create client socket, connect to server 
     Socket clientSocket = new Socket("localhost",5555); 
     //create output stream attached to socket 
     DataOutputStream outToServer = 
     new DataOutputStream(clientSocket.getOutputStream()); 

     System.out.print("Command : "); 

     //create input stream attached to socket 
     BufferedReader inFromServer = 
     new BufferedReader(new InputStreamReader(clientSocket.getInputStream())); 

     temp = inFromUser.readLine(); 

     //send line to server 
     outToServer.writeBytes(temp); 

     //read line from server 
     //displayBytes = inFromServer.readLine(); 

     while((displayBytes = inFromServer.readLine()) != null) { 
     System.out.print(displayBytes); 
     } 
     //clientSocket.close(); 
    } 
    catch(Exception ex) { 
    } 
    } 
} 

TCPサーバ・クラス

package TcpServer; 

import java.io.BufferedReader; 
import java.io.*; 
import java.io.InputStreamReader; 
import java.net.ServerSocket; 
import java.net.Socket; 

public class TcpServer { 
    public static void main(String[] args) { 
    // The name of the file to open. 
    String fileName = "input.txt"; 
    // This will reference one line at a time 
    String line = null; 
    String holder=null; 
    String clientWord; 
    int bytNumber; 

    try { 
     //create welcoming socket at port 5555 
     ServerSocket welcomeSocket = new ServerSocket(5555); 
     //wait, on welcoming socket for contact by client 
     Socket connectionSocket = welcomeSocket.accept(); 
     //create input stream, attached to socket 
     BufferedReader inFromClient = 
     new BufferedReader(new InputStreamReader(connectionSocket.getInputStream())); 
     //create output stream, attached to socket 
     DataOutputStream outToClient = 
     new DataOutputStream(connectionSocket.getOutputStream()); 
     //read in line from socket 
     clientWord = inFromClient.readLine(); 

     if(clientWord.equals("query")) { 
     try { 
      // FileReader reads text files in the default encoding. 
      FileReader fileReader = new FileReader(fileName); 

      // Always wrap FileReader in BufferedReader. 
      BufferedReader buffer = new BufferedReader(fileReader); 

      while((line = buffer.readLine()) != null) { 
      System.out.println(line); 
      bytNumber = line.getBytes().length; 
      holder=Integer.toString(bytNumber); 
      //pr.println(bytNumber);//only printing first line not going until eof 
      outToClient.writeBytes(holder); 
      // line = buffer.readLine(); 
      // pr.flush(); 
      } 

      // Always close files. 
      buffer.close();   
     } 
     catch(FileNotFoundException ex) { 
      System.out.println("Unable to open file '" + fileName + "'"); 
     } 
     catch(IOException ex) { 
      System.out.println ("Error reading file '" + fileName + "'"); 
      // Or we could just do this: 
      // ex.printStackTrace(); 
     } 
     }// end if statement 
    } 
    catch(Exception ex) { 
    } 
    } 
} 
+1

あなたのクライアントクラスで** **無視しない例外をすることによって開始します。あなたはエラーメッセージを無視して、デバッグの正確な方法を無視しています... – GhostCat

+0

私が得る唯一のメッセージは、clientSocketを閉じるための警告ですが、私はそれを行ったときにも同じ出力を得ます。 – n00bie1221

+0

ここではソケットを正しく閉じない、接続上の問題など、さまざまな問題があります。ヒント:デバッガで動作させてみてください。何が起きているかを確認するためにprintステートメントを追加します。まず最初に、クライアント/サーバー通信の全プロセスをガイドするステップバイステップのチュートリアル(http://docs.oracle.com/javase/tutorial/networking/sockets/clientServer.htmlなど)を読んでください。 – GhostCat

答えて

1

私は両側で唯一DataOutputStreamDataInputStreamにあなたを示唆してBufferedInputStreamを使用しないように。 以下のわずかに変更されたコードは、クライアントからサーバーにメッセージを正しく送信できます。これで、達成したいことを容易に実現できます。

サーバー

import java.io.BufferedReader; 
import java.io.*; 
import java.io.InputStreamReader; 
import java.net.ServerSocket; 
import java.net.Socket; 



public class TcpServer { 


public static void main(String[] args) { 
    // The name of the file to open. 
    String fileName = "input.txt"; 
    // This will reference one line at a time 
    String line = null; 
    String holder=null; 
    String clientWord; 
    int bytNumber; 

    try 
    { 
     //create welcoming socket at port 5555 
     ServerSocket welcomeSocket = new ServerSocket(5555); 
     //wait, on welcoming socket for contact by client 
     Socket connectionSocket = welcomeSocket.accept(); 
     //create input stream, attached to socket 
     DataInputStream inFromClient = 
       new DataInputStream(connectionSocket.getInputStream()); 
     //create output stream, attached to socket 
     DataOutputStream outToClient = 
       new DataOutputStream(connectionSocket.getOutputStream()); 
     //read in line from socket 
     clientWord = inFromClient.readUTF(); 
    System.out.println(clientWord); 

     if(clientWord.equals("query")) 
     { 


      try 
      { 
     // FileReader reads text files in the default encoding. 
     FileReader fileReader = new FileReader(fileName); 


     // Always wrap FileReader in BufferedReader. 
     BufferedReader buffer = new BufferedReader(fileReader); 


       while((line = buffer.readLine()) != null) 
       { 
      System.out.println(line); 
      bytNumber = line.getBytes().length; 
      holder=Integer.toString(bytNumber); 
      //pr.println(bytNumber);//only printing first line not going until eof 
      outToClient.writeBytes(holder); 
      // line = buffer.readLine(); 
      // pr.flush(); 
       } 

     // Always close files. 
     buffer.close();   
      } 
      catch(FileNotFoundException ex) 
      { 
     System.out.println(
      "Unable to open file '" + 
      fileName + "'");     
      } 
      catch(IOException ex) 
      { 
     System.out.println(
      "Error reading file '" 
      + fileName + "'");     
     // Or we could just do this: 
     // ex.printStackTrace(); 
      } 

     }// end if statement 
    } 

    catch(Exception ex) 
    { 

    } 
} 

} 

クライアント

import java.io.BufferedReader; 
    import java.io.InputStreamReader; 
    import java.net.Socket; 
    import java.io.*; 


    public class TcpClient { 


     public static void main(String[] args) { 
     String temp; 
     String displayBytes; 
     try 
     { 
     //create input stream 
     BufferedReader inFromUser = new BufferedReader(new InputStreamReader(System.in)); 
     //create client socket, connect to server 
     Socket clientSocket = new Socket("localhost",5555); 
     //create output stream attached to socket 
     DataOutputStream outToServer = 
       new DataOutputStream(clientSocket.getOutputStream()); 



     System.out.print("Command : "); 

     //create input stream attached to socket 
     DataInputStream inFromServer = new DataInputStream(clientSocket.getInputStream()); 

     temp = inFromUser.readLine(); 

     //send line to server 
     //outToServer.writeBytes(temp); 
     outToServer.writeUTF(temp); 
     outToServer.flush(); 


     //read line from server 
     //displayBytes = inFromServer.readLine(); 

     while((displayBytes = inFromServer.readUTF()) != null) 
     { 
     System.out.print(displayBytes); 
     } 
     //clientSocket.close(); 
    } 
    catch(Exception ex) 
    { 

    } 
} 
} 
関連する問題