Java 一个简单文件传输客户端服务器的实现

Java 一个简单文件传输客户端服务器的实现,java,multithreading,client-server,Java,Multithreading,Client Server,嗨,我有以下代码通过线程发送到客户机-服务器,我有一个错误 System.out.println("Can't setup server on this port number."); 无法在此端口号上安装服务器 System.out.println("Can't setup server on this port number."); 无法在此端口号上安装服务器 System.out.println("Can't setup server on this port number.");

嗨,我有以下代码通过线程发送到客户机-服务器,我有一个错误

System.out.println("Can't setup server on this port number.");
无法在此端口号上安装服务器

System.out.println("Can't setup server on this port number.");
无法在此端口号上安装服务器

System.out.println("Can't setup server on this port number.");
但是为什么呢

System.out.println("Can't setup server on this port number.");
类客户端:

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!");

   }

   }
  }
System.out.println("Can't setup server on this port number.");
//类服务器

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


}
}
System.out.println("Can't setup server on this port number.");
错误是: 无法在此端口号上安装服务器。
无法在此端口号上安装服务器

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

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

System.out.println("Can't setup server on this port number.");
一种可能的解决方法是:

System.out.println("Can't setup server on this port number.");
使用1024以上的端口。这些港口可免费用于用户土地计划

System.out.println("Can't setup server on this port number.");
如果出现故障,请提供一个备份端口,也高于1024。您必须修改服务器和客户端代码以尝试这两个端口,当然,您的通信协议必须包括某种形式的握手,以确保它们与正确的对话者进行对话

System.out.println("Can't setup server on this port number.");
其他答案中列出的代码还有许多其他问题

System.out.println("Can't setup server on this port number.");
您不需要对每个对象制作两次。在大多数情况下,只有一个实例就足够了

System.out.println("Can't setup server on this port number.");
如果服务器持续运行并且必须接受多个连接,则不应在一个接收会话结束时关闭接受套接字

System.out.println("Can't setup server on this port number.");
此外,服务器应该在服务器套接字接受调用上运行一个循环,并为每个传入连接启动一个新线程,其任务是处理该连接

System.out.println("Can't setup server on this port number.");
虽然我理解你愿意学习和尝试,但对于你正在努力实现的目标,有一些现有的解决方案。例如,您只需使用FTP服务器即可。

netstat-ano | find 1024

System.out.println("Can't setup server on this port number.");
如果您在windows环境下运行java文件,请尝试上面的命令,该命令将帮助您查找使用与您相同端口号的任何进程,并使用 例如,printStackTrace随附

System.out.println("Can't setup server on this port number.");

我想您编写客户机-服务器程序的方式是错误的。 以下是你所犯的错误

System.out.println("Can't setup server on this port number.");
1在客户机类中,您有一个sendFile函数,在该函数中您创建了两个线程-t&t1。在run函数中,您再次调用相同的sendFile函数。 因此,它会像递归一样在线程下不断创建线程

System.out.println("Can't setup server on this port number.");
2在服务器类中,您正在侦听同一ReceiveFile函数中的两个端口。由于socket=serverSocket.accept是一个阻塞调用,因此在找到要连接的单个客户端之前,它不会执行代码的其余部分

System.out.println("Can't setup server on this port number.");
所以这里到底发生了什么。。第一个客户机连接后,紧接着它希望第二个客户机连接。 同时,客户端线程可能会尝试访问尚未建立连接的端口

System.out.println("Can't setup server on this port number.");
简而言之,您的服务器应该位于线程环境中,而不是客户端。 我建议对于不同的端口,您应该使用不同的服务器。
i、 e.为1024和1025端口创建不同的服务器类。

1代码太多-所有文件内容都与故障无关2更改错误代码以便知道哪个ServerSocket没有打开-提示,为什么要打开serverSocket1两次?我更改代码,我在上面的代码中使用了两个客户端的两个端口,我把4444端口换成1024端口,另一个444端口换成1025端口。该错误已解决,在发送文件后,以下错误不断重复:java.net.ConnectException:连接被拒绝和其他相同错误请帮助mereza,这不是该网站的工作方式:如果我的答案解决了您的问题,您应该以某种方式指出:或者通过将我的答案标记为正确,或者至少更新你的问题,说端口问题已经解决,现在你有了一个不同的问题。按照你目前的做法,每个人都认为1024是导致你出现问题的端口。我在linuxubuntu工作,在发送一个文件后,这个错误得到了解决,以下错误不断重复:java.net.ConnectException:连接被拒绝和其他相同错误请帮助我输入调试语句,如:来自此方法等。。在你的代码中,这样我们就可以知道你是从哪个代码块中得到这个错误的?
System.out.println("Can't setup server on this port number.");