0

我正在将图像从我的 android 发送到 pc,它是我的应用程序的一部分,我为此使用套接字发送部分代码包括

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

问题是文件不会出现在我的电脑上除非我关闭我的输出流或套接字如果我关闭输出流套接字正在关闭为什么会这样?

4

2 回答 2

1

发送文件时保持 Socket 活动

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

问题是文件不会出现在我的电脑上,除非我关闭我的输出流或套接字

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

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

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

于 2013-04-10T10:40:47.600 回答
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
于 2013-04-10T10:26:50.987 回答