0

送信用のマルチスレッドを備えたプログラムクライアントサーバーを作成します-ファイルを受信します。プログラムが実行され、クライアントが送信し、サーバーが受信します。ファイルは作成されますが、空の新しいファイルが作成されます なぜですか? 私を助けてください

クラス クライアント :

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


 public class Client extends Thread {

Socket socket = null;
Socket socket1 = null;
  public  void sendFile() throws IOException {

String host = "127.0.0.1";
String host1 = "127.0.0.2";

socket = new Socket(host, 1024);
socket1 = new Socket(host1, 1025);

File file = new File("/home/reza/Desktop/link help");
File file1 = new File("/home/reza/Desktop/hi");
long length = file.length();
long length1 = file1.length();
final byte[] bytes = new byte[(int) length];
final byte[] bytes1 = new byte[(int) length1];

FileInputStream fis = new FileInputStream(file);
FileInputStream fis1 = new FileInputStream(file1);

@SuppressWarnings("resource")
final BufferedInputStream bis = new BufferedInputStream(fis);
final BufferedOutputStream out = new BufferedOutputStream(socket.getOutputStream());
@SuppressWarnings("resource")
final BufferedInputStream bis1 = new BufferedInputStream(fis1);
final BufferedOutputStream out1 = new BufferedOutputStream(socket1.getOutputStream());


 Thread t = new Thread(new Runnable() {



  public void run()
{


 while(socket.isConnected())
  {

 Wait2();


   try {
    System.out.println("ok");
    int count;

    while ((count = bis.read(bytes)) > 0) {
        out.write(bytes, 0, count);

   }
 } catch (IOException e) {

e.printStackTrace();
 }

  }
  }
  });

  Thread t1 = new Thread(new  Runnable() {
   public void run() {
 while(socket1.isConnected())
    {

     Wait2();

       try {
            System.out.println("ok1");
            int count1;
            while ((count1 = bis1.read(bytes1)) > 0) {
                out1.write(bytes1, 0, count1);

           }


    } catch (IOException e) {

    e.printStackTrace();
    }

    }

 }
 });
 t1.start();
 t.start();




socket.close();
socket1.close();
 }

 public void Wait2()

{


 try {

 Thread.sleep(3000);

 } catch (InterruptedException x) {

 System.out.println("Interrupted!");

 }

 }
 }

クラスサーバー:

  import java.io.*;
  import java.net.*;
public class Server  {

public Server()
{
 Thread t = new Thread(new Client());
 t.start();
 Thread t1 = new Thread(new Client());
 t1.start();    
 }



  //@SuppressWarnings("null")
  public  void recivefile() throws IOException {
   ServerSocket serverSocket = null;
 ServerSocket serverSocket1 = null;


try {

   serverSocket = new ServerSocket(1024);


 } catch (IOException ex) {
    System.out.println("Can't setup server on this port number. ");
 }
 try {
     serverSocket1 = new ServerSocket(1025);

    } catch (IOException ex) {
        System.out.println("Can't setup server on this port number1. ");
    }


Socket socket = null;
Socket socket1 = null;

InputStream is = null;
InputStream is1 = null;

FileOutputStream fos = null;
FileOutputStream fos1 = null;

BufferedOutputStream bos = null;
BufferedOutputStream bos1 = null;

int bufferSize = 0;
int bufferSize1 = 0;


try {
    socket = serverSocket.accept();
   socket1 = serverSocket1.accept();




} catch (IOException ex) {
    System.out.println("Can't accept client connection. ");
}

try {
    is = socket.getInputStream();
    is1 = socket1.getInputStream();


    bufferSize = socket.getReceiveBufferSize();
    bufferSize1 = socket1.getReceiveBufferSize();
    //bufferSize2 = socket2.getReceiveBufferSize();
    System.out.println("Buffer size: " + bufferSize);
    System.out.println("file recieved");
    System.out.println("Buffer size1: " + bufferSize1);
    System.out.println("file recieved");

    System.out.println("file recieved");
 } catch (IOException ex) {
    System.out.println("Can't get socket input stream. ");
 }


try {
    fos = new FileOutputStream("/home/reza/Desktop/reza");
    bos = new BufferedOutputStream(fos);
    fos1 = new FileOutputStream("/home/reza/Desktop/ali");
    bos1 = new BufferedOutputStream(fos1);




} catch (FileNotFoundException ex) {
    System.out.println("File not found. ");
}

byte[] bytes = new byte[bufferSize];

int count;

while ((count = is.read(bytes)) > 0) {
   bos.write(bytes, 0, count);

}
byte[] bytes1 = new byte[bufferSize1];

int count1;
while ((count1 = is1.read(bytes1)) > 0) {
       bos1.write(bytes1, 0, count1);
    }


bos.flush();
bos.close();
bos1.flush();
bos1.close();
is.close();
is1.close();
socket.close();
serverSocket.close();
socket1.close();
serverSocket1.close();


 }

 public static void main(String[] args)  throws IOException 
{
  System.out.println("server is run, please send file");



  Server s = new Server();
  s.recivefile();


}
}

クライアント テスト クラス:

  import java.io.IOException;


 public class clientTest extends Thread {

public static void main(String[] args) throws IOException, InterruptedException 
{
   Client client = new Client();
   client.sendFile();
  }
  }
4

1 に答える 1

0

サーバー内のこのコードがあなたの問題だと思います:

while ((count = is.read(bytes)) > 0) {
   bos.write(bytes, 0, count);
}
byte[] bytes1 = new byte[bufferSize1];

int count1;
while ((count1 = is1.read(bytes1)) > 0) {
   bos1.write(bytes1, 0, count1);
}
bos.flush();
bos.close();
bos1.flush();
bos1.close();
is.close();
is1.close();
socket.close();
serverSocket.close();
socket1.close();
serverSocket1.close();

したがって、サーバーはクライアントに接続すると、すぐに読み取るバイトがあるかどうかを確認し、そうでない場合は読み取りを停止して接続を閉じます。これが、クライアントがバイトを配信できるよりも速く発生した場合、ブーム、データは受信されません。そして、クライアントがデータを送信するためにスレッドを開始して接続しているため、クライアントがデータを送信できるよりも速く発生します。

代わりに、クライアントが接続を維持している限り、サーバーは各接続を読み取る必要があります。サーバーは、データが受信されるまで待機する必要があります。

コードで、クライアントはサーバーが接続を閉じるのを待っていることに注意してください。しかし、サーバーは、すべてのデータがいつ送信されたかをどのように認識するのでしょうか? クライアントが接続を閉じる必要があるか、クライアントが EOF タイプのマーカーをサーバーに送信して、データの終わりと接続を安全に閉じられることを示す必要があります。

于 2013-03-05T12:29:04.663 に答える