2012-04-15 36 views
0

我正在和使用socket通信Android应用程序将图像发送到一个Java应用程序的计算机SocketException - “关闭套接字”即使isConnected()返回true

这里上运行就是发生的事情:在桌面正在运行一个服务器java应用程序,客户端android应用程序在设备上运行,它将图像传输到服务器,并且该部分顺利。之后,服务器应用程序从控制台接收一行并将其传回给android应用程序。直到那个消息被android应用程序接收到,它应该显示一个进度对话框,并在那里卡住。 android应用程序应该使用readLine()读取桌面应用程序传递的字符串,但是当我尝试通过android应用程序中的套接字打开输入流时,它会给我例外。

以下是代码,第一个为桌面服务器,那么对于Android客户端

进口java.net.ServerSocket的; import java.net.Socket; import java.io. *;

class ProjectServer 
{ 
    ServerSocket serSock; 
    Socket sock; 

    BufferedReader in; 
    PrintWriter out; 
    public static void main(String ar[]) 
    { 
     try 
     { 
      ProjectServer cs=new ProjectServer(); 
      cs.startServer(); 
     } 
     catch(Exception e) 
     { 

     } 
    } 

    public void startServer() 
    { 
     try 
     { 
      serSock=new ServerSocket(8070); 
      System.out.println("Waiting for client..."); 
      sock=serSock.accept(); 


      System.out.println("Connections done"); 


      //Accept File 
      System.out.println("Connected"); 
      System.out.println(sock.isConnected()+"1"); 

      //receive code 

      int filesize=450660; 
      int bytesRead; 
      int current=0; 
      // receive file 
      byte [] mybytearray = new byte [filesize]; 
      InputStream is = sock.getInputStream(); 
      FileOutputStream fos = new FileOutputStream("C:\\Project Server\\Capture.png"); 
      BufferedOutputStream bos = new BufferedOutputStream(fos); 
      bytesRead = is.read(mybytearray,0,mybytearray.length); 
      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(); 
      System.out.println("end-start"); 
      bos.close(); 
      //sock.close(); 
      //receive code ends 

      //System.out.println(br.readLine()); 


      //Matlab computation 

      //Send result 
      System.out.println(sock.isConnected()+"2"); 
      PrintWriter pr=new PrintWriter(sock.getOutputStream(),true); 

      pr.println((new BufferedReader(new InputStreamReader(System.in))).readLine()); 
      System.out.println(sock.isConnected()+"3"); 
      (new BufferedReader(new InputStreamReader(System.in))).readLine(); 
      System.out.println(sock.isConnected()+"4"); 
     } 
     catch(Exception e) 
     { 
      System.out.println(e); 
      e.printStackTrace(); 
     } 

    } 
} 

Android客户端:

package com.site.custom; 

import java.io.BufferedInputStream; 
import java.io.BufferedReader; 
import java.io.File; 
import java.io.FileInputStream; 
import java.io.InputStreamReader; 
import java.io.OutputStream; 
import java.io.PrintWriter; 
import java.net.Socket; 

import android.app.Activity; 
import android.app.ProgressDialog; 
import android.os.Bundle; 
import android.util.Log; 
import android.widget.TextView; 


public class Act2 extends Activity 
{ 
    private ProgressDialog pd; 
    private String serverIP="58.146.100.187"; 
    private BufferedReader in; 
    private PrintWriter out; 
    private String path; 
    private Socket cliSock; 

    public void onCreate(Bundle onCreateInstance) 
    { 
     super.onCreate(onCreateInstance); 
     setContentView(R.layout.act2); 
     this.setTitle("This has started"); 
     path=getIntent().getStringExtra("path"); 

     //Establish Connection 
     //pd=ProgressDialog.show(this, "Establishing connection", "Finding server",false,true); 

     try 
     { 
      cliSock=new Socket(serverIP,8070); 

      //pd.dismiss(); 
      //Log.v("MERA MSG","changing text"); 
      ((TextView)findViewById(R.id.tview)).setText(path); 
     } 
     catch(Exception e) 
     { 
      Log.v("MERA MSG",e.toString()); 
     } 

     //Send file 
     //Log.v("MERA MSG","changing text1"); 

     ProgressDialog pd=ProgressDialog.show(this, "Sending image", "Image chosen:"+path.substring(path.lastIndexOf("//")+1),false,true); 
     //Log.v("MERA MSG","changing text2"); 

     try 
     { 


      File myFile = new File (path); 
      System.out.println((int)myFile.length()); 
      byte[] mybytearray = new byte[450560]; 
      FileInputStream fis = new FileInputStream(myFile); 
      BufferedInputStream bis = new BufferedInputStream(fis); 
      bis.read(mybytearray,0,mybytearray.length); 
      OutputStream os = cliSock.getOutputStream(); 
      System.out.println("Sending..."); 
      os.write(mybytearray,0,mybytearray.length); 
      os.flush(); 
      os.close(); 
      bis.close(); 
      //sock.close(); 
      //System.out.println("Completed"); 
      System.out.println(cliSock.isConnected()+"1"); 
      pd.dismiss(); 
      //System.out.println("Done"); 
      System.out.println(cliSock.isConnected()+"2"); 
      //Show dialog box till computation results arrive 
      pd=ProgressDialog.show(this, "Recognizing...", "(waiting for server reply)",false,true); 
      System.out.println(cliSock.isConnected()+"3"); 
      in=new BufferedReader(new InputStreamReader(cliSock.getInputStream())); 
      System.out.println(in.readLine()); 
      pd.dismiss(); 

     } 
     catch(Exception e) 
     { 
      Log.v("MERA MSG",e.toString()); 
      e.printStackTrace(); 
     } 



    } 
} 

而且顺便说一句这里有原木的logcat: http://pastebin.com/atHMycTa 可以确认插座还在这里连接,因为它显示了线350和349 看真在351行处理错误。

+0

我不确定这是否可能是原因,但是您可以在从套接字读取数据后尝试将'os.close()'调用移动到。我不记得是否关闭输出流也关闭了套接字,或者如果它只是在关闭输入流时发生这种情况.. – Patrick 2012-04-15 16:25:55

+0

@patrick不,它不,请参阅我的答案。 – EJP 2012-04-15 22:45:49

+0

@EJP:哦,对不起,一定是把它和别的东西混淆了。 – Patrick 2012-04-16 08:06:28

回答

2

isConnected()只告诉你是否曾经连接过这个Socket,你有哪个,所以它返回true。这并不表示连接的状态。

+1

好的,谢谢。但你仍然不告诉我如何解决我的问题.. – GrowinMan 2012-04-16 01:43:51

+0

@GrowinMan你的问题是你关闭了你的套接字,然后继续使用它。关闭输出流会关闭套接字。只需刷新它,然后获取输入流,然后继续。你也不需要任何'ByteArrayOutputStreams'。他们只是在浪费时间和空间。从文件读取,写入套接字,或反之亦然。* – EJP 2012-04-16 03:16:56

+0

flush命令()似乎不起作用。如果我只是做flush(),那么服务器仍然在等待图像被接收。只有在我做os.close()之后,它才真正刷新流,服务器完全接收图像,然后继续执行。有没有一种方法可以在不关闭的情况下刷新输出流? – GrowinMan 2012-04-17 03:24:38