2013-03-05 4 views
0

Я пишу программу-клиент с несколькими потоками для файла send-receive. Программа запускается, а клиент отправляет и получает сервер. файлы создаются, но создаются пустые новые файлы Почему? пожалуйста, помогите мнеклиентский сервер с несколькими потоками

класса клиент:

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(); 
    } 
    } 
+1

Чтобы помочь вам лучше, я бы предложил вам отформатировать код, чтобы его было немного легче читать –

+0

Во-первых, я бы предположил, что это не многопоточный сервер. У вас есть один поток, ожидающий обоих соединений, прежде чем двигаться вперед вместо двух потоков, которые могут каждый получать данные независимо. Если это HW, вы, вероятно, потеряете много очков. –

+0

точно, вы правы, я потерял – reza

ответ

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

Таким образом, сервер подключился к клиенту, после чего он сразу же проверяет, есть ли какие-либо байты для чтения, если он не перестает читать и закрывает соединение. Если это происходит быстрее, чем клиент может доставить любые байты, бум, данные не будут получены. И это произойдет быстрее, чем клиент может отправлять данные, потому что клиент подключает THEN, чтобы начать отправку данных.

Вместо этого сервер должен читать каждое соединение до тех пор, пока клиент поддерживает соединение вживую. Серверу необходимо дождаться получения данных.

Обратите внимание, что в вашем коде клиент ожидает завершения соединения с сервером. Но как сервер должен знать, когда все данные отправляются? Либо клиент должен закрыть соединение, либо клиент должен отправить маркер типа EOF на сервер, указав конец данных и безопасно закрыть соединение.

Смежные вопросы