如何正确接收套接字

时间:2013-08-25 11:22:21

标签: android sockets

我正在尝试在两个Android设备之间发送图片,但是有一个我无法弄清楚的传输问题。有人告诉我修改wile循环,但它仍然无法正常工作。 当我在设备上测试我的项目时,连接没有问题。但是,随着传输任务的开始,发送客户端被停止,接收器上出现“传输错误”消息。 有谁知道我能对我的节目做些什么?以下是我发送和接收的两个主要部分。

我会非常感谢任何帮助。谢谢。

发送部分:

s = new Socket("192.168.0.187", 1234); 
Log.d("Tag====================","socket ip="+s);

File file = new File("/sdcard/DCIM/Pic/img1.jpg");
FileInputStream fis = new FileInputStream(file); 
din = new DataInputStream(new BufferedInputStream(fis)); 
dout = new DataOutputStream(s.getOutputStream());
dout.writeUTF(String.valueOf(file.length()));  
byte[] buffer = new byte[1024]; 
int len = 0;  
while ((len = din.read(buffer)) != -1) {  
     dout.write(buffer, 0, len); 
     tw4.setText("8 in while dout.write(buffer, 0, len);");
     }  
dout.flush();

发送部分可以顺利工作,并且在while循环被遮挡后没有出现错误

接收部分:

 try {
File file = new File("/sdcard/DCIM/img1.jpg");
DataInputStream din = new DataInputStream(new BufferedInputStream(client.getInputStream()));
bis = new BufferedInputStream(client.getInputStream());
Log.d("Tag====================","din="+s);
    FileOutputStream fos = new FileOutputStream(file); 
    dout = new DataOutputStream(new BufferedOutputStream(fos));  
    byte[] buffer = new byte[1024];  
    int len = 0;  
    while ((len = bis.read(buffer)) != -1) {  
           dout.write(buffer, 0, len);  
           }  


    dout.flush();  
    dout.close();
    } catch (Exception e) {
    handler.post(new Runnable() {
    public void run() {
    tw1.setText("transmission error");
    }});

关于接收部分似乎甚至停留在“DataInputStream din = new DataInputStream(new BufferedInputStream(client.getInputStream()));”并抓住例外。

再次感谢。

1 个答案:

答案 0 :(得分:0)

你用writeUTF()编写文件长度,但你永远不会读它。如果您要在发送图像后关闭套接字,则不需要长度:只需发送然后关闭套接字即可。如果确实需要长度,读取,使用readUTF(),然后读取从套接字到目标的那么多字节。

如果你需要长度,使用writeInt()或writeLong()发送它比将数字转换为字符串更有意义,将其转换为writeUTF()格式,将其转换回字符串另一端用readUTF(),然后将其转换回int或long。这也意味着当然适当地使用readInt()或readLong()。

修改

大约百万分之一(希望我每次都有$),在Java中复制流的规范方法是:

while ((count = in.read(buffer)) > 0)
{
    out.write(buffer, 0, count);
}

其中'count'是int,'buffer'是长度为>的字节数组。 0,优选8192或更多。请注意,你必须循环;你必须将read()结果存储在一个变量中;你必须测试那个变量;你必须在write()调用中使用它。