2012-12-28 44 views
0

我创建了一个应用程序连接到一个java实现的服务器,连接到一个mysql数据库,从服务器端一切正常,在android每次我连接到服务器我可以发送消息,但当阅读响应套接字被关闭时,我认为问题来自虚拟机,杀死线程,我google'it并尝试运行套接字类作为一个活动后,作为一个线程,我甚至尝试给线程优先,但我总是得到同样的错误:由VM杀死Android客户端套接字

12-28 18:28:24.769: W/System.err(1342): java.net.SocketException: Socket closed 
12-28 18:28:24.769: W/System.err(1342):  at org.apache.harmony.luni.platform.OSNetworkSystem.read(Native Method) 
12-28 18:28:24.769: W/System.err(1342):  at dalvik.system.BlockGuard$WrappedNetworkSystem.read(BlockGuard.java:273) 
12-28 18:28:24.769: W/System.err(1342):  at org.apache.harmony.luni.net.PlainSocketImpl.read(PlainSocketImpl.java:458) 
12-28 18:28:24.769: W/System.err(1342):  at org.apache.harmony.luni.net.SocketInputStream.read(SocketInputStream.java:59) 
12-28 18:28:24.769: W/System.err(1342):  at java.io.DataInputStream.readLine(DataInputStream.java:310) 
12-28 18:28:24.769: W/System.err(1342):  at com.example.lightreading.ConnectionDB$clientCon.run(ConnectionDB.java:83) 
12-28 18:28:24.769: W/System.err(1342):  at java.lang.Thread.run(Thread.java:1019) 

下面是一个使用线程我的代码:

public class ConnectionDB{ 

public static String ip; 
public static int port; 
private static ConnectionDB instance = null; 

private StringBuilder sb; 
private String response = ""; 
private String data; 


public static ConnectionDB getInstance() { 
     if(instance == null) { 
     instance = new ConnectionDB(); 
     } 
     return instance; 
} 

public String connect(String s_send) throws InterruptedException{ 
    data = s_send; 
    Thread cThread = new Thread(new clientCon()); 
    cThread.setPriority(Thread.MAX_PRIORITY); 
    cThread.start(); 

    return response.toString(); 
} 


class clientCon implements Runnable { 

    private Socket socket = null; 
    private DataOutputStream dataOutputStream = null; 
    private DataInputStream dataInputStream = null; 
    @Override 
    public void run() { 
     // TODO Auto-generated method stub 
     try { 
       socket = new Socket(ip,port); 
       dataOutputStream = new DataOutputStream(socket.getOutputStream()); 
       dataInputStream = new DataInputStream(socket.getInputStream()); 
       Log.d("sending msg: ",data); 
       dataOutputStream.writeBytes(data); 
       dataOutputStream.flush(); 
       dataOutputStream.close(); 
       Log.d("msg sent: ", data); 

       while ((data = dataInputStream.readLine()) != null) { 
        Log.d("data from server: ", data); 
        sb.append(data); 
       } 
       Log.d("msg received: ", sb.toString()); 
      } catch (UnknownHostException e) { 
       // TODO Auto-generated catch block 
       e.printStackTrace(); 
      } catch (IOException e) { 
       // TODO Auto-generated catch block 
       e.printStackTrace(); 
      } 
     if (sb != null){ 
      response = sb.toString(); 
      Log.d("Response from server: ", response); 
     }else{ 
      Log.d("Response from server is null", ""); 
     } 

    } 

} 

}

回答

0

我有同样的问题,你必须socket.shutdownOutput();以便套接字准备好传输数据