-3

こんにちは、クライアントに次のコードがあります-スレッドを介したサーバー、エラーがあります、

このポート番号ではサーバーをセットアップできません。

このポート番号ではサーバーをセットアップできません。

しかし、なぜ?

クラス クライアント:

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

// create class client
public class Client extends Thread {

Socket socket = null;
Socket socket1 = null;
 // create send method 
public  void sendFile() throws IOException {

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

socket = new Socket(host, 4444);
socket1 = new Socket(host1, 444);

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();
byte[] bytes = new byte[(int) length];
byte[] bytes1 = new byte[(int) length1];

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

BufferedInputStream bis = new BufferedInputStream(fis);
BufferedOutputStream out = new BufferedOutputStream(socket.getOutputStream());
BufferedInputStream bis1 = new BufferedInputStream(fis1);
BufferedOutputStream out1 = new BufferedOutputStream(socket1.getOutputStream());

int count;
int count1;


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

}
 while ((count1 = bis1.read(bytes1)) > 0) {
    out1.write(bytes1, 0, count1);

}


 Thread t = new Thread(new Runnable() {



 public void run()
 {
  while(socket.isConnected())
  {

 Wait2();


   try {
 sendFile();
 } catch (IOException e) {

e.printStackTrace();
 }
 }
 }
 });

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

     Wait2();


       try {
    sendFile();
    } catch (IOException e) {

    e.printStackTrace();
    }
    }

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

 fis.close();
 fis1.close();

 out.close();
 bis.close();
 out1.close();
 bis1.close();
 socket.close();
 socket1.close();
 }

  public void Wait2()

 {


  try {

  Thread.currentThread().sleep(3000);

   } catch (InterruptedException x) {

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

   }

   }
  }

// クラスサーバー

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




public  void recivefile() throws IOException {
ServerSocket serverSocket = null;
ServerSocket serverSocket1 = null;


try {

   serverSocket = new ServerSocket(4444);
   //serverSocket1 = new ServerSocket(444);

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

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


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();

    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();


}
}

エラー: このポート番号でサーバーをセットアップできません。このポート番号ではサーバーをセットアップできません。

4

4 に答える 4

0

クライアントとサーバーのプログラムを書いた方法は間違っていると思います。以下はあなたが犯した過ちです...

1) Client クラスには、sendFile2 つのスレッドを作成した関数があります - t& t1。run 関数では、同じ関数を再度呼び出していsendFileます。そのため、再帰と同じように、スレッドの下にスレッドを作成し続けます。

recieveFile2) サーバー クラスでは、同じ関数内で 2 つのポートをリッスンしています。これsocket = serverSocket.accept()はブロッキング コールであるため、接続する単一のクライアントが見つかるまで残りのコードを実行しません。

ここで正確に何が起こるか..最初のクライアントが接続すると、すぐに2番目のクライアントが接続することを期待します. その間、クライアント スレッドは、接続が確立されていないポートにアクセスしようとする場合があります。

つまり、サーバーはクライアントではなくスレッド環境にある必要があります。また、ポートが異なる場合は、別のサーバーを使用することをお勧めします。つまり、1024 ポートと 1025 ポートの両方に異なるサーバー クラスを作成します。

于 2013-03-05T11:22:16.430 に答える
0

コードが UNIX プラットフォームで実行されると仮定すると、サーバー コードはポート 444 (システムで予約されているポート) でソケットを開こうと 2 回試みています。成功するためには、プログラムを管理者権限で実行する必要があり、ポートが別のプロセスによって使用されていないことを確認する必要があります。

考えられる回避策は次のとおりです。

  • 1024 以上のポートを使用します。これらのポートは、ユーザーランド プログラムに自由に使用できます。

  • 障害が発生した場合は、やはり 1024 以上のバックアップ ポートを用意してください。サーバー コードとクライアント コードの両方を修正して、両方のポートを試す必要があります。もちろん、通信プロトコルには、正しい対話者と通信していることを確認するための何らかの形式のハンドシェイクを含める必要があります。

他の回答に記載されているコードには、他にも多くの問題があります。

  • すべてのオブジェクトを 2 回作成する必要はありません。ほとんどの場合、インスタンスは 1 つだけで十分です。

  • サーバーが継続的に実行されており、多くの接続を受け入れる必要がある場合は、1 つの受信セッションの終了時に受け入れソケットを閉じないでください。

  • また、サーバーはサーバーソケットの受け入れ呼び出しでループを実行し、着信接続ごとに新しいスレッドを開始することになっています。その仕事はその接続を処理することです。

学習と実験に対するあなたの意欲は理解していますが、あなたが達成しようとしていることに対する既存の解​​決策があります。たとえば、目的に応じて単純に FTP サーバーを使用できます。

于 2013-03-04T14:37:32.417 に答える
0

netstat -ano | 「1024」を見つける

Windows環境でJavaファイルを実行している場合は、上記のコマンドを試してください。これにより、同じポート番号を使用しているプロセスを見つけることができ、ex.printStackTrace()を使用することもできます

System.out.println("Can't setup server on this port number.");
于 2013-03-05T06:54:03.503 に答える