2012-04-24 18 views
0

私はこのエラーを数日間修正しようとしています。本当に。私はそれを得ていない。コードは十分単純です。なぜ機能していませんか?Javaでの接続リセット

public class server 
    { 
public static void main(String[] args) 
{ 
    String fileName = null; 

    try 
    { 
     ServerSocket ss = new ServerSocket(9999, 3); 

     Socket dataSocket = ss.accept(); 
     System.out.println("Server: Connection Established"); 

     InputStream is = dataSocket.getInputStream(); 
     //BufferedReader br = new BufferedReader(new InputStreamReader(is)); 
     Scanner sc = new Scanner(dataSocket.getInputStream()); 

     while(sc.hasNextByte()) 
     { 
      System.out.println("True"); 
      fileName = fileName+sc.next(); 
     } 

     FileWriter fw = new FileWriter("server"+fileName); 
     while(dataSocket != null) 
     { 
      fw.write(is.read()); 
     } 

     fw.flush(); 
     dataSocket.close(); 
     ss.close(); 
      /*String[] nameParts; 
      nameParts = fileName.split("."); 
      File f = new File(nameParts[0]+"."+nameParts[1]); 
      FileOutputStream fos = new FileOutputStream(f); 
      System.out.println(nameParts[0]);*/ 
    } 

    catch(Exception e) 
    { 
     e.printStackTrace(); 
    } 
} 

    } 

上記はサーバーコードです。

public class client 
    { 
public static void main(String[] args) 
{ 
    // Read a file 
    try 
    { 
     Socket dataSocket = new Socket(); 

     dataSocket.connect(new InetSocketAddress(InetAddress.getLocalHost(), 9999)); 
     System.out.println("Client: Connection Established"); 

     OutputStream os = dataSocket.getOutputStream(); 
     PrintWriter pw = new PrintWriter(os); 

     String fileName = "text.txt"; 

     pw.write(fileName); 


     File f = new File(fileName); 
     Scanner sc = new Scanner(f); 

     /*while(sc.hasNextInt()) 
     { 
      pw.write(sc.nextInt()); 
     }*/ 

     //pw.flush(); 
     //pw.close(); 

     //dataSocket.close(); 

     /*String[] nameParts = new String[2]; 
     nameParts = args[0].split("."); 

     while(sc.hasNextByte()) 
     { 
      os.write(sc.nextByte());5 
     }*/ 
    } 

    catch (Exception e) 
    { 
     e.printStackTrace(); 
    } 
} 

    } 

最初は、クライアントとサーバーの両方が、2人の恥ずかしがり屋のティーンエイジャーのように、お互いに話すのを待っていました。いくつかの変更の後で、これは起こり始めました。 接続リセットエラーが発生します。助けてください。締め切り!

答えて

2

sc.hasNextByte()は、ピアが接続を閉じるまで真のままです。だから、このループから抜け出すことはありません。ファイル名の前にファイル名の長さを送信する必要があります。その結果、受信するデータの量がファイル名であることがわかります。その後、ファイル名を読み込み、ファイルを開き、残りのストリームをEOSまで読み込んでコピーします。

+0

最初に名前のサイズを送信せずにこれを行う方法はありませんか?私はいくつかの方法があると確信しています:これはJAVAではありませんC:D – Asim

+0

@Asimもちろん他の方法があります。たとえば、ファイル名に 'DataOutputStream.writeUTF()'と 'DataInputStream.readUTF()'を使うことができます。 – EJP

0

オプションで、以下のように先取特権を使用してファイル名を書き込むことができます。

pw.write(fileNameに+ "\ n" は);

またはwriteLine(fileName)にいくつかのライターがあります。

とサーバ側で、ライン毎に読み取るためにBufferedReaderのを使用:次に

しながら((ライン= br.readLine())!= NULL){

.... 

}

クライアントが閉じている場合、ループを終了することができます。

+0

それは私の問題を解決しません: 私はfileNameを送信した後にファイルの内容を送信できるように接続を開いたままにします。 – Asim

関連する問題