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

时间:2013-03-04 13:29:18

标签: java multithreading client-server

您好我有以下代码到客户端 - 服务器通过线程,我有错误,

无法在此端口号上设置服务器。

无法在此端口号上设置服务器。

但为什么?

班级客户:

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 个答案:

答案 0 :(得分:1)

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

答案 1 :(得分:0)

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

可能的解决方法是:

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

  • 如果发生故障,还有备用端口,也是1024以上。您必须修改服务器和客户端代码才能尝试这两个端口,当然您的通信协议必须包含某种形式的握手以确保它们正在通话正确的对话者。

您的代码在其他答案中列出了许多其他问题。

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

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

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

虽然我理解您愿意学习和实验,但现有的解决方案可以帮助您实现目标。例如,您可以简单地使用FTP服务器。

答案 2 :(得分:0)

netstat -ano |找到“1024”

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

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

答案 3 :(得分:0)

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

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

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

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

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