2

クライアントとサーバーがあり、クライアントでファイル名を入力すると、そのファイル名はサーバー側で事前定義されたパスの下でチェックされ、ファイルが存在する場合は、同様の事前定義されたパスの下でクライアント側に転送されます。私には2つの問題があります:

1)サーバーでは、FileNotFoundException(そのようなファイル/ディレクトリはありません)が表示されているため、特定の事前定義されたパスの下にあるファイルを比較できません。

2) 上記の例外に続いても、ファイルは転送され、空になります。

ここに私のクライアントとサーバーがあります:

クライアント:

import java.io.*;
import java.net.*;
import java.util.*;
public class ft2client
{ 
public static void main(String srgs[])throws IOException
{
Socket s=null;
BufferedReader get=null;
PrintWriter put=null;
try
{ 
s=new Socket("127.0.0.1",8085);
get=new BufferedReader(new InputStreamReader(s.getInputStream()));
put=new PrintWriter(s.getOutputStream(),true);
}  
catch(Exception e)
{
System.exit(0);
}
                    String u,f;
                    System.out.println("Enter the file name to transfer from server:");
                    DataInputStream dis=new DataInputStream(System.in);
                    f=dis.readLine();
                    put.println(f);
                    File f1=new File(f);
                    String str = "/home/user/";
                    FileOutputStream  fs=new FileOutputStream(new File(str,f1.toString()));
                    while((u=get.readLine())!=null)
                    { 
                        byte jj[]=u.getBytes();
                        fs.write(jj);
                    } 
                    fs.close();
                    System.out.println("File received");
                    s.close();
                }      
            }

サーバ:

import java.io.*;
import java.net.*;
import java.util.*;
     public class ft2server
             { 
                 public static void main(String args[])throws IOException
                 { 
                     ServerSocket ss=null;
                     try
                     {  
                         ss=new ServerSocket(8085);
                     }
                     catch(IOException e)
                     { 
                         System.out.println("couldn't listen");
                         System.exit(0);
                     }
                     Socket cs=null;
                     try
                     { 
                         cs=ss.accept();
                         System.out.println("Connection established"+cs);
                     }
                     catch(Exception e)
                     { 
                         System.out.println("Accept failed");
                         System.exit(1);
                     } 
                     PrintWriter put=new PrintWriter(cs.getOutputStream(),true);
                     BufferedReader st=new BufferedReader(new InputStreamReader(cs.getInputStream()));
                     String s=st.readLine();
                     String str = "/home/user/Desktop/";
                     String path = str + s; 
                     System.out.println("The requested file is path: "+path);
                     System.out.println("The requested file is : "+s);
                     File f=new File(path);
                     if(f.exists())
                     { 
                         BufferedReader d=new BufferedReader(new FileReader(s));
                         String line;
                         while((line=d.readLine())!=null)
                         {
                             put.write(line);
                             put.flush();
                         }
                         d.close();
                         System.out.println("File transfered");
                         cs.close();
                         ss.close();
                     }  
                 }  
             }
4

4 に答える 4

4

バイナリデータでは、文字のみが可能でバイトストリームでは機能しないため、リーダーを変更していることを確認してください。さらに、readlineは、行末まで読み取ることを意味し、バイナリファイル('\ n')ではあまり意味がありません。
これはprintWriterのドキュメントからです

It does not contain methods for writing raw bytes, for which a program should use unencoded byte streams.

ここで必要なのは、バイト配列を使用して、次のようなチャンクとして書き込むことです。

import java.io.*;
import java.net.*;
import java.util.*;
     public class ft2server
         { 

             public static void main(String args[])throws IOException
             { 
                 ServerSocket ss=null;
                 try
                 {  
                     ss=new ServerSocket(8085);
                 }
                 catch(IOException e)
                 { 
                     System.out.println("couldn't listen");
                     System.exit(0);
                 }
                 Socket cs=null;
                 try
                 { 
                     cs=ss.accept();
                     System.out.println("Connection established"+cs);
                 }
                 catch(Exception e)
                 { 
                     System.out.println("Accept failed");
                     System.exit(1);
                 } 
                 BufferedOutputStream put=new BufferedOutputStream(cs.getOutputStream());
                 BufferedReader st=new BufferedReader(new InputStreamReader(cs.getInputStream()));
                 String s=st.readLine();
                 String str = "/home/milind/Desktop/";
                 String path = str + s; 
                 System.out.println("The requested file is path: "+path);
                 System.out.println("The requested file is : "+s);
                 File f=new File(path);
                 if(f.isFile())
                 { 
                     FileInputStream fis=new FileInputStream(f);


                     byte []buf=new byte[1024];
                     int read;
                     while((read=fis.read(buf,0,1024))!=-1)
                     {
                         put.write(buf,0,read);
                         put.flush();
                     }
                     //d.close();
                     System.out.println("File transfered");
                     cs.close();
                     ss.close();
                 }  
             }  
         }

クライアント

import java.io.*;
import java.net.*;
import java.util.*;
public class ft2client
{ 
    public static void main(String srgs[])throws IOException
    {
        Socket s=null;
        BufferedInputStream get=null;
        PrintWriter put=null;
        try
        { 
            s=new Socket("127.0.0.1",8085);
            get=new BufferedInputStream(s.getInputStream());
            put=new PrintWriter(s.getOutputStream(),true);

            String f;
            int u;
            System.out.println("Enter the file name to transfer from server:");
            DataInputStream dis=new DataInputStream(System.in);
            f=dis.readLine();
            put.println(f);
            File f1=new File(f);
            String str = "/home/milind/";
            FileOutputStream  fs=new FileOutputStream(new File(str,f1.toString()));
            byte jj[]=new byte[1024];
            while((u=get.read(jj,0,1024))!=-1)
            { 
                fs.write(jj,0,u);
            } 
            fs.close();
            System.out.println("File received");
            s.close();
        }catch(Exception e)
        {
            e.printStackTrace();
            System.exit(0);
        }
    }      
}
于 2012-09-28T11:53:34.767 に答える
1

内容が文字であることがわかっている場合を除き、使用Readersしないでください。Writersそうでない場合は、とを使用InputStreamsしてOutputStreamsください。この場合、ZIPファイルは確かに文字データではなくバイナリであるためReadersWriters.

于 2012-09-28T11:21:01.127 に答える
1

ソケットを扱っているとき、確かなことはほとんどありません。

相手側で次のような行を読んでいる場合get.readLine();、送信者プログラムから次のようにソケットに書き込む必要があります put.writeBytes("any string variable"+"\n")put.println("some string variable or literal.")

あなたは好きなようget.readLine() に読んでいて、直接ファイルから読んでいるものは何でもバイトを書いています。

これは、純粋なテキストをバイト単位で転送する必要がある場合に、ソケットで読み取り、書き込みを行う方法の例です。

Server {
...
soc = echoServer.accept();
out = new DataOutputStream(soc.getOutputStream());
out.flush();
in = new DataInputStream(soc.getInputStream());
out.writeBytes("some text in here \n");
out.flush();

...
}


Client{

...

soc = new Socket("10.210.13.121", 62436);
out = new DataOutputStream(soc.getOutputStream());
out.flush();
in = new DataInputStream(soc.getInputStream());
...  
while(true)
    if(in.available() > 0)
       String str = in.readLine();
... 
}
于 2012-09-28T10:36:43.597 に答える
1

f.exisits の代わりに f.isFile() を使用してください。これは既知の問題です。 サーバーで固定コード
BufferedReader d=new BufferedReader(new FileReader(s));
の代わりに誤って書いた
BufferedReader d=new BufferedReader(new FileReader(f));

import java.io.*;
import java.net.*;
import java.util.*;
     public class ft2server
         { 
             public static void main(String args[])throws IOException
             { 
                 ServerSocket ss=null;
                 try
                 {  
                     ss=new ServerSocket(8085);
                 }
                 catch(IOException e)
                 { 
                     System.out.println("couldn't listen");
                     System.exit(0);
                 }
                 Socket cs=null;
                 try
                 { 
                     cs=ss.accept();
                     System.out.println("Connection established"+cs);
                 }
                 catch(Exception e)
                 { 
                     System.out.println("Accept failed");
                     System.exit(1);
                 } 
                 PrintWriter put=new PrintWriter(cs.getOutputStream(),true);
                 BufferedReader st=new BufferedReader(new InputStreamReader(cs.getInputStream()));
                 String s=st.readLine();
                 String str = "/home/milind/Desktop/";
                 String path = str + s; 
                 System.out.println("The requested file is path: "+path);
                 System.out.println("The requested file is : "+s);
                 File f=new File(path);
                 if(f.isFile())
                 { 
                     BufferedReader d=new BufferedReader(new FileReader(f));
                     String line;
                     while((line=d.readLine())!=null)
                     {
                         put.write(line);
                         put.flush();
                     }
                     d.close();
                     System.out.println("File transfered");
                     cs.close();
                     ss.close();
                 }  
             }  
         }

もう一つの方

import java.io.*;
import java.net.*;
import java.util.*;
public class ft2client
{ 
    public static void main(String srgs[])throws IOException
    {
        Socket s=null;
        BufferedReader get=null;
        PrintWriter put=null;
        try
        { 
            s=new Socket("127.0.0.1",8085);
            get=new BufferedReader(new InputStreamReader(s.getInputStream()));
            put=new PrintWriter(s.getOutputStream(),true);

            String u,f;
            System.out.println("Enter the file name to transfer from server:");
            DataInputStream dis=new DataInputStream(System.in);
            f=dis.readLine();
            put.println(f);
            File f1=new File(f);
            String str = "/home/milind/";
            FileOutputStream  fs=new FileOutputStream(new File(str,f1.toString()));
            while((u=get.readLine())!=null)
            { 
                System.out.println(u);
                byte jj[]=u.getBytes();
                fs.write(jj);
            } 
            fs.close();
            System.out.println("File received");
            s.close();
        }catch(Exception e)
        {
            e.printStackTrace();
            System.exit(0);
        }
    }      
}
于 2012-09-28T10:37:59.087 に答える