0

ファイル転送を含むプログラムを作成しようとしています。もちろん、文字ストリームを使用してクライアントサーバー通信を行う必要があり、ファイルを転送するためにバイトストリームも使用する必要があります。この問題は、println メソッド フォーム PrintWriter と BufferedReader の readLine を使用しているときに発生します。これは、readLine が行を読み取りますが、ストリームに '\n' を残し、それが問題を引き起こすためです (それが問題であると 100% 確信しているとは限りません)。バイトストリームを使用してファイルを転送します。そのため、その文字を取り除く必要があり、Reader クラスの read メソッドを使用してそれを試みましたが、うまくいきませんでした。このコードは、文字ストリーマーを使用しなくても完全に機能します。readLine の呼び出しによって sizeOfFile がどのように影響を受けるかに注意してください。

サーバ

import java.net.ServerSocket;
import java.net.Socket;

public class Server {
    private static int SERVER_PORT = 9999;
    public static void main(String[] args) {
        try {
            ServerSocket ss = new ServerSocket(SERVER_PORT);
            System.out.println("Server je pokrenut");
            while (true) {
                Socket sock = ss.accept();
                new MultithreadServer(sock);
            }
        } 
        catch (Exception e) {
            e.printStackTrace();
        }
    }
}

サーバースレッド

import java.io.*;
import java.net.Socket;
import java.util.*;

public class MultithreadServer extends Thread {
    private Socket sock;
    BufferedReader inChar;
    PrintWriter outChar;
    BufferedInputStream in;
    BufferedOutputStream out;
    DataOutputStream outByte;
    public MultithreadServer(Socket sock) throws Exception {
        this.sock = sock;
        inChar = new BufferedReader(
            new InputStreamReader(sock.getInputStream()));
        outChar = new PrintWriter(new BufferedWriter(new OutputStreamWriter(
            sock.getOutputStream())), true);
        in = new BufferedInputStream(sock.getInputStream());
        out = new BufferedOutputStream(sock.getOutputStream());
        outByte = new DataOutputStream(sock.getOutputStream());
        start();
    }
    public void run() {
        try {
            String request = inChar.readLine();
            System.out.println("Fajl: " + request);
            File file = new File(request);
            BufferedInputStream in = new BufferedInputStream(
                new FileInputStream(file));
            long sizeOfFile = (long) file.length();

            outChar.println("SOME_MESSAGE"); //PROBLEM

            byte[] buffer = new byte[4096];
            int len = 0;
            outByte.writeLong(sizeOfFile);
            long totalyTransfered = 0;
            while ((len = in.read(buffer, 0, buffer.length)) !=-1) {
                out.write(buffer, 0, len);
                totalyTransfered += len;
            }
            System.out.println("Total:" + totalyTransfered);
            out.flush();
        } 
        catch (Exception e) {
            e.printStackTrace();
        }
    }
}

クライアント

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

public class ClientServer {
 static int SERVER_PORT = 9999;
 public static void main(String[] args) throws Exception {
 InetAddress address = InetAddress.getByName("127.0.0.1");
 Socket sock = new Socket(address, SERVER_PORT);
  PrintWriter out = new PrintWriter(new BufferedWriter(
   new OutputStreamWriter(sock.getOutputStream())), true);
  BufferedReader inChar = new BufferedReader(new InputStreamReader(sock.getInputStream()));
  Reader readChar = new InputStreamReader(sock.getInputStream());

 System.out.println("File:");   // choosing file from server
 Scanner consoleInput = new Scanner(System.in);
 String file = consoleInput.next();
 out.println(file);

 DataInputStream in = new DataInputStream(sock.getInputStream());

 System.out.println("Type name of file:");  //choosing name for file on client
 String newFile = consoleInput.next();

 OutputStream outByte = new FileOutputStream(newFile);
 byte[] buffer = new byte[4096];


 System.out.println("aa"+inChar.readLine()+"aa");   //PROBLEM
 System.out.println("SOME_TEXT"+readChar.read()+"SOME_TEXT");  //TRYING TO FIX THE  PROBLEM
   //       in.read(); in.read();                      // DIFFERENT TRY
   long sizeOfFile= in.readLong();                    // BUT IT STILL HAS INFLUENCE OF       sizeOfFile
 System.out.println("Size of file:" + sizeOfFile);

 long totalyTransfered= 0;
 int len = 0;
 while ((len = in.read(buffer,0,buffer.length)) != -1) {
  outByte.write(buffer, 0, len);
  System.out.println("In one pass:" + len);
  sizeOfFile-=len;
  totalyTransfered+=len;
 System.out.println("Total:" + totalyTransfered);
 if (sizeOfFile<=0)break; 
  }
   System.out.println("Available: "+in.available());
  outByte.flush();
  outByte.close();

}
}
4

1 に答える 1