发送文件时保持Socket存活

时间:2013-04-10 10:05:23

标签: java android sockets

我从我的android发送图像到我的应用程序的一部分,Iam使用套接字为此发送部分代码包括

public void sendfile()
{
    try {           
    System.out.println("looppppppp");
    File file = new File(Environment.getExternalStorageDirectory()+ File.separator + "test.jpg");
    byte [] mybytearray  = new byte [(int)file.length()];  
    FileInputStream fis = new FileInputStream(file);
    BufferedInputStream bis = new BufferedInputStream(fis);
    bis.read(mybytearray,0,mybytearray.length);         
    System.out.println("Send:"+mybytearray.length);
    bis.close();
    OutputStream ous = socket.getOutputStream();
    System.out.println("Sending...");
    ous.write(mybytearray,0,mybytearray.length);
    ous.flush();
    //ous.close();  
       // socket.close();
    System.out.println("send overrrrrrrrrrr");
    }catch (UnknownHostException e) {
        // TODO Auto-generated catch block
        e.printStackTrace();
    } catch (IOException e) {
        // TODO Auto-generated catch block
        e.printStackTrace();
    }   
}

程序启动时,Socket连接在一个线程中。 接收器是pc中的java代码,如下所示

@Override
public void run() 
{
try
{
ServerSocket servsocket = new ServerSocket(13267);
System.out.println("Thread Waiting...");
Socket socket = servsocket.accept();
System.out.println("Accepted connection : " + socket);
System.out.println("Connected..");
while(true)
{
// filesize temporary hardcoded
long start = System.currentTimeMillis();
int bytesRead;
int current = 0;
mybytearray  = new byte [filesize];
File f=new File("d:\\ab.jpg");
f.createNewFile();
InputStream is = socket.getInputStream();
FileOutputStream fos = new FileOutputStream(f);
BufferedOutputStream bos = new BufferedOutputStream(fos);
System.out.println("b4");
bytesRead = is.read(mybytearray,0,mybytearray.length);
System.out.println("after");
current = bytesRead;
do {
   bytesRead =
   is.read(mybytearray, current, (mybytearray.length-current));
   if(bytesRead >= 0) current += bytesRead;
} while(bytesRead > -1);

bos.write(mybytearray, 0 , current);
bos.flush();
long end = System.currentTimeMillis();
System.out.println(end-start);
bos.close();
fos.close();
}
}catch(IOException e)
{
System.out.println("errorr");
}
}
}

问题是文件不会出现在我的电脑上除非我关闭输出流或插座如果我关闭输出流,套接字将关闭为什么会这样? < / p>

2 个答案:

答案 0 :(得分:1)

  

发送文件时保持套接字

发送文件可使套接字保持活动状态。我没有看到你的标题与你的问题的相关性。

  

问题是文件不会出现在我的电脑上除非我关闭输出流或插座

如此接近它。关闭发送方的套接字会导致接收方退出接收循环,而接收循环没有其他退出方式。您的流复制循环比必要的复杂得多。在发送之前或之后缓冲内存中的整个文件既不必要也不可取。

  

如果我关闭输出流,套接字将关闭为什么会这样?

因为这是指定要做的事情。关闭套接字的输入或输出流将关闭另一个流和套接字。

答案 1 :(得分:0)

如果我理解正确,您希望使用客户端保持套接字打开,并发送文件......

我的建议是: - 保持一个主线程打开,以通知服务器有关新文件的信息 - 打开新线程以发送每个新文件 - 添加代码以控制您可以同时发送的最大文件数(可选)

所以流程将是:

1. client open main socket
2. server open the main socket and assign a client id 
3. client request the send of a new file
4. server keep in memory the file name and client id
5. server send response authorizing the client to send the file
6. client open a new thread to send the file