-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

1

您无法在 127.0.0.2 上启动服务器 - 这就是您的问题。

于 2013-03-04T13:46:51.023 回答
0

假设您的代码在 unix 平台上运行,您的服务器代码会尝试两次打开端口 444 上的套接字,该端口是系统保留端口。为了能够成功,您的程序必须以管理权限运行,并且您必须确保该端口尚未被其他进程使用。

一种可能的解决方法是:

  • 使用 1024 以上的端口。这些端口可免费用于用户级程序

  • 如果发生故障,有一个备用端口,也高于 1024。您必须修改服务器和客户端代码以尝试这两个端口,当然您的通信协议必须包括某种形式的握手,以确保他们正在与正确的对话者交谈。

其他答案中列出的代码还有许多其他问题。

  • 您不需要将每个对象制作两次。在大多数情况下,只需一个实例就足够了,

  • 如果您的服务器连续运行并且必须接受许多连接,则不应在一个接收会话结束时关闭接受套接字。

  • 服务器还应该在服务器套接字接受调用上运行一个循环,并为每个传入连接启动一个新线程,其工作是处理该连接。

虽然我理解您愿意学习和尝试,但对于您想要实现的目标,有现有的解决方案。例如,您可以简单地使用 FTP 服务器来实现您的目的。

于 2013-03-04T14:37:32.417 回答
0

我猜你编写客户端 - 服务器程序的方式是错误的。以下是你犯的错误...

1)在 Client 类中,您具有sendFile创建两个线程的函数 - t& t1。在运行函数中,您再次调用相同的sendFile函数。所以它像递归一样不断地在线程下创建线程。

2)在 Server 类中,您正在侦听同一recieveFile函数中的两个端口。由于这socket = serverSocket.accept()是一个阻塞调用,它不会执行其余的代码,直到它找到一个要连接的客户端。

所以这里到底发生了什么......一旦第一个客户端连接,然后它立即期望第二个客户端连接。同时,您的客户端线程可能会尝试访问尚未建立连接的端口。

简而言之,您的服务器应该处于线程环境而不是客户端。而且我建议对于不同的端口,您应该使用不同的服务器。即为 1024 和 1025 端口创建不同的服务器类。

于 2013-03-05T11:22:16.430 回答
0

网络统计-ano | 找到“1024”

如果您在 Windows 环境中运行 java 文件,请尝试上述命令,这将帮助您找到使用与您相同的端口号的任何进程,并使用 ex.printStackTrace() 以及

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