2016-04-08 13 views
0

私もチャットプログラムを作りましたが、そのチャットプログラムも不完全です。すべてが正常に実行されますが、ファイルを送信するときを除いてプログラムは問題なく受け取りますが、ソケットクローズエラーが発生します。ファイルをも送信するJavaチャットプログラム

CLIENT

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

public class chatClnt { 

    public static int PORT = 6666; 
    public static String IP_ADDR = "192.168.15.1"; 
    public static String F = "FILE MODE"; 

    public static void main(String[] ar) { 

     try { 
      InetAddress ipAddress = InetAddress.getByName(IP_ADDR); 

      System.out.println("\nconnecting......"); 
      Socket socket = new Socket(ipAddress, PORT); 
      System.out.println("\nconnected"); 

      InputStream sin = socket.getInputStream(); 
      OutputStream sout = socket.getOutputStream(); 

      DataInputStream in = new DataInputStream(sin); 
      DataOutputStream out = new DataOutputStream(sout); 

      BufferedReader keyboard = new BufferedReader(new   InputStreamReader(System.in)); 

      String line = null; 
      String fname = null; 

      while (true) { 
       System.out.println("\nYou(Plain Text):>"); 
       line = keyboard.readLine(); 
       out.writeUTF(line); 
       out.flush(); 
       if (line.equals(F)) { 
        //Sending File 
        OutputStream fout = socket.getOutputStream(); 
        FileInputStream fis = null; 
        BufferedInputStream bis = null; 
        try { 
         System.out.println("Enter the path: "); 
         fname = keyboard.readLine(); 
         File myFile = new File(fname); 
         byte[] mybytearray = new byte[(int)myFile.length()]; 
         fis = new FileInputStream(myFile); 
         bis = new BufferedInputStream(fis); 
         bis.read(mybytearray,0,mybytearray.length); 

         fout = socket.getOutputStream(); 
         System.out.println("Sending " + fname + "(" + mybytearray.length + " bytes)"); 
         fout.write(mybytearray,0,mybytearray.length); 
         fout.flush(); 
         System.out.println("Done."); 
        } finally { 
         if (bis != null) bis.close(); 
         if (fout != null) fout.close(); 
        } 


        line = in.readUTF(); // wait for the server to send a line of text. 
        System.out.println("\nSender(Plain Text):> " + line); 
        System.out.println(); 
       } 
      } 
     } catch(Exception x) { 
      x.printStackTrace(); 
     } 
    } 
} 

サーバあなたがソケットの出力ストリームを閉じ

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


public class chatSrv { 

    public static int PORT = 6666; 
    public static String F = "FILE MODE"; 
    public final static String FILE_TO_RECEIVE = "received.txt"; 
    public final static int FILE_SIZE = 999999999; 

    public static void main(String[] ar) { 

     try { 
      ServerSocket ss = new ServerSocket(PORT); 
      System.out.println("\nconnecting..."); 
      Socket socket = ss.accept(); 

      System.out.println("\nconnected"); 
      System.out.println(); 

      InputStream sin = socket.getInputStream(); 
      OutputStream sout = socket.getOutputStream(); 

      DataInputStream in = new DataInputStream(sin); 
      DataOutputStream out = new DataOutputStream(sout); 

      String line = null; 
      int bytesRead; 
      int current = 0; 

      while (true) { 
       line = in.readUTF(); 

       //Receiving File 
       if (line.equals(F)) { 
        FileOutputStream fos = null; 
        BufferedOutputStream bos = null; 
        try { 
         byte [] mybytearray = new byte [FILE_SIZE]; 
         fos = new FileOutputStream(FILE_TO_RECEIVE); 
         bos = new BufferedOutputStream(fos); 
         bytesRead = sin.read(mybytearray,0,mybytearray.length); 
         current = bytesRead; 

         do { 
          bytesRead = sin.read(mybytearray, current, (mybytearray.length-current)); 
          if (bytesRead >= 0) current += bytesRead; 
         } while (bytesRead > -1); 

         bos.write(mybytearray, 0 , current); 
         bos.flush(); 
         System.out.println("File " + FILE_TO_RECEIVE+ " downloaded (" + current + " bytes read)"); 
        } finally { 
         if (fos != null) fos.close(); 
         if (bos != null) bos.close(); 
        } 

        System.out.println("\nSender(Plain Text):> " + line); 
        BufferedReader keyboard = new BufferedReader(new InputStreamReader(System.in)); 

        System.out.println("\nYou(Plain Text):>"); 
        line = keyboard.readLine(); 
        out.writeUTF(line); 
        out.flush(); 
        System.out.println(); 
       } 
      } 
     } catch(Exception x) { 
      x.printStackTrace(); 
     } 
    } 
} 
+0

実際のエラーを投稿できますか?また、インポート時にマイナーなコーディングスタイルの注意が 'import java.net。*'の代わりに特定のパッケージをインポートしようとします。持っているのは良い習慣です。 – wiredniko

+0

fout.close();を削除すると、hteファイルを一度受信した後、whileループを永久に実行して終了します。これは、1つのファイルの後にストリームが閉じられて、ストリームからもうデータを読み込めなくなることを意味します。 –

+0

' f.out.close() 'はファイルが閉じられないのでプログラムをハングします –

答えて

1

が、これは同様にソケットを閉じます。 documentationさんのコメント:

返されたOutputStreamを閉じると、関連するソケットが閉じられます。

ストリームを閉じることができません。しかし、あなたがそれを閉じなければ、受信側に決して-1を得ることはありません。

基本的に、ディスクからファイルを読み取るときに使用するのと同じ読み取り手順を使用することはできません。ストリームを開いたままでファイルを読み取るためのプロトコルを考案する必要があります。考えられる戦略:

  • このために2番目のソケットを開きます。たとえば、使用可能なポートでソケットを開き、このポート番号を持つ他のソケットに接続する必要があるというメッセージをサーバーに送信します。その後、ファイル全体をその別のソケットを通して送信して閉じることができます。または、サーバに2番目のソケットを開き、どのポート番号に接続するかを教えてください。これは、ftpプロトコルで使用される戦略です。
  • ファイルの長さをバイト単位で先に送信し、受信側でその数バイトを読み取ります。これは、たとえば、Content-length:ヘッダーを送信するときに、HTTPによって使用される戦略です。

ファイルが非常に長くなる可能性があるので、長さを送信する場合は、intではなくlongを使用してください。

+0

もっと正確に助けてください –

+0

' OutputStream'を閉じなければ、プログラムは進まず、どうすればいいですか –

+0

@SiddharthMazumdar私が言ったように、あなたはそれを閉じることを決断することはできません - あなたはもう一方の側で決して-1を得ることはないので、それは単により多くの入力を待つでしょう。代わりに、戦略の1つに基づいてプロトコルを再検討する必要があります。 – RealSkeptic

関連する問題