2014-09-10 43 views
1

我想用两个机器之间使用socket编程进行通信。java socket编程在两台机器之间发送和接收文件

我基本需要的是两台机器都应该能够发送和接收文件。我在下面粘贴的代码没有显示任何错误,但服务器端程序似乎无限期地运行,即它没有终止。它卡在标有评论的线上。

在此代码中,服务器最初发送名为“file.txt”的文件,并且客户端正在接收它并使用名称“copy.txt”保存该文件。后来客户端发送一个名为“file2.txt”的文件,并且服务器正在接收并使用名称“copy2.txt”进行保存。

有人可以告诉我的错误,并提出一些改进?

//server side code 

import java.net.*; 
import java.io.*; 
public class server 
{ 
public static void main (String [] args) throws IOException 
{ 

    //sending file started 
    ServerSocket serverSocket = new ServerSocket(16167); 
    Socket socket = serverSocket.accept(); 
    System.out.println("Accepted connection : " + socket); 
    File transferFile = new File ("/Users/abhishek/desktop/file.txt"); 
    byte [] bytearray = new byte [(int)transferFile.length()]; 
    FileInputStream fin = new FileInputStream(transferFile); 
    BufferedInputStream bin = new BufferedInputStream(fin); 
    bin.read(bytearray,0,bytearray.length); 
    OutputStream os = socket.getOutputStream(); 
    System.out.println("Sending Files..."); 
    os.write(bytearray,0,bytearray.length); 
    os.flush(); 
    System.out.println("File transfer complete"); 
    //socket.close(); 
    //sending comleted 

    //receiving file started 
    int filesize=1022386; 
    int bytesRead=0; 
    int currentTot = 0; 
    byte [] bytearray1 = new byte [filesize]; 

    InputStream is = socket.getInputStream(); 

    FileOutputStream fos = new FileOutputStream("/Users/abhishek/desktop/copy2.txt"); 
    //fos.flush(); 
    BufferedOutputStream bos = new BufferedOutputStream(fos); 
    //bos.flush(); 
    System.out.println("not moving ahead!!!");//program stucked here 
    bytesRead = is.read(bytearray1,0,bytearray1.length); 
    currentTot = bytesRead; 
    System.out.println("current"+currentTot); 
    do 
    { 
     bytesRead = is.read(bytearray1, currentTot, (bytearray1.length-currentTot)); 
     if(bytesRead >= 0) 
      currentTot += bytesRead; 
     System.out.println("current"+currentTot); 
    } while(bytesRead > -1); 
    System.out.println("outside current"+currentTot); 
    bos.write(bytearray1, 0 , currentTot); 
    bos.flush(); 
    //receiving complete 
    System.out.println("Receving file completed"); 
    socket.close(); 

} 
} 



//client side code 
import java.net.*; 
import java.io.*; 


public class client 
{ 
    public static void main (String [] args) throws IOException 
    { 
     int filesize=1022386; 
     int bytesRead=0; 
     int currentTot = 0; 
     Socket socket = new Socket("localhost",16167); 
     byte [] bytearray = new byte [filesize]; 
     InputStream is = socket.getInputStream(); 
     FileOutputStream fos = new FileOutputStream("/Users/abhishek/desktop/copy.txt"); 
     BufferedOutputStream bos = new BufferedOutputStream(fos); 
     bytesRead = is.read(bytearray,0,bytearray.length); 
     currentTot = bytesRead; 
     do 
     { 
      bytesRead = is.read(bytearray, currentTot, (bytearray.length-currentTot)); 
      if(bytesRead >= 0) 
       currentTot += bytesRead; 
     } while(bytesRead > -1); 
     System.out.println("current"+currentTot); 
     bos.write(bytearray, 0 , currentTot); 
     bos.flush(); 
     bos.close(); 
     System.out.println("receiving first file completed!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!"); 

     //sending file 
     System.out.println("sending second file started!"); 
     File transferFile = new File ("/Users/abhishek/desktop/file2.txt"); 
     byte [] bytearray2 = new byte [(int)transferFile.length()]; 
     FileInputStream fin = new FileInputStream(transferFile); 
     BufferedInputStream bin = new BufferedInputStream(fin); 
     bin.read(bytearray2,0,bytearray2.length); 
     OutputStream os = socket.getOutputStream(); 
     os.flush(); 
     os.write(bytearray2,0,bytearray2.length); 
     os.flush(); 
     System.out.println("sending second file completed!"); 
     //sending complete 


     socket.close(); 
    } 
} 

回答

-1

我敢打赌

bytesRead = is.read(bytearray1,0,bytearray1.length);

就是你真的卡住。如果你被困在这里,问题通常是通信的另一端没有发送任何数据,没有什么可读的,并且你的线程被卡住等待它发送。

客户方的

,你叫

bos.close();

发送的第一条消息之后。这也会导致套接字关闭,这会在服务器端抛出一个IOException,并且因为你没有捕获到IOException,你的服务器程序就会退出。

你有多少套接字体验?如果您刚开始使用套接字,则可能需要查看我为此编写的扩展,从ServerSocketExDataFetcher开始。

+0

这感觉就像它应该进入评论。 – tilpner 2014-09-10 14:54:08

+0

@StackOverflowException我已经更新了这个回答问题,并包括这个建议的意见。 – ControlAltDel 2014-09-10 15:00:34

+0

是的,那是我卡住的地方。我是第一次进行套接字编程,所以请你以任何方式告诉我可以避免这种情况。此外,请阅读我对@Nekojimi回复下面的评论,以更好地理解我的问题。 – user3245573 2014-09-10 15:53:55

0

System.out.println("not moving ahead!!!");//program stucked here行是否实际执行?如果是这样,那么问题是InputStream.read()函数是blobking函数;他们将停止执行程序(“块”),直到他们能够完成。

JavaDoc for InputStream

读取最多len从输入流数据的字节到字节数组。尝试读取多达len字节,但可以读取较小的数字。实际读取的字节数作为整数返回。 该方法会阻塞,直到输入数据可用,检测到文件结尾或引发异常。

由于你没有得到一个例外,这意味着,当你调用.read(),有要读取没有可用的数据,并且程序坐在那里等待数据读取(永远不会到来)。您应该首先检查您的客户端程序是否实际发送数据。

+0

是的,该行正在执行,并且我确定它在read()处卡住,因为没有可用的数据。但是,我从客户端发送数据(您可以检查客户端程序)。但是,我认为客户端没有完成读取第一个文件的数据(一个名为“copy.txt”的文件确实被创建,但其中没有数据)。因此,当客户端没有完成其第一个文件的读取部分时,它无法发送第二个文件的数据。那么,我该如何回避这种情况呢? – user3245573 2014-09-10 15:46:37

相关问题