2013-11-26 148 views
1

我在我的電腦上執行java服務器並讓我的android設備連接到它。我可以連接它,但一旦連接就會斷開連接。我確信在android方面我需要做一些事情,但我很少迷失它。我有互聯網許可,所以很好。Android tcp客戶端連接,然後從java服務器斷開連接

而且忽視了註釋代碼,我發送圖像從我的Android到PC。也忽略savebitmap並採取截圖我不認爲它影響連接,如果它沒有被調用。

的Java服務器:Java服務器

import java.io.BufferedReader; 
import java.io.DataOutputStream; 
import java.io.InputStream; 
import java.io.InputStreamReader; 
import java.net.Socket; 


public class EchoThread extends Thread { 
    protected Socket socket; 



    public EchoThread(Socket clientSocket){ 
     this.socket = clientSocket; 
    } 
    public void run(){ 
     InputStream inp = null; 
     BufferedReader brinp = null; 
     DataOutputStream out = null; 
     try{ 
      inp = socket.getInputStream(); 
      brinp = new BufferedReader(new InputStreamReader(inp)); 
      out = new DataOutputStream(socket.getOutputStream()); 
     }catch(Exception e){ 
      return; 

     } 
     String line; 
     while(true){ 
      try{ 
       line = brinp.readLine(); 
       if ((line == null) || line.equalsIgnoreCase("QUIT")){ 
        socket.close(); 
        return; 

       }else{ 
        out.writeBytes(line+ "\n\r"); 
        out.flush(); 
       } 
      }catch(Exception e){ 
       e.printStackTrace(); 
       return; 
      } 
     } 

    } 



} 

這裏

import javax.imageio.ImageIO; 
import javax.imageio.ImageReadParam; 
import javax.imageio.ImageReader; 
import javax.imageio.stream.ImageInputStream; 
import javax.swing.*; //access JFrame 
import javax.swing.text.html.HTMLDocument.Iterator; 

import java.awt.BorderLayout; 
import java.awt.Graphics; 
import java.awt.Graphics2D; 
import java.awt.Image; 
import java.awt.image.BufferedImage; 
import java.io.*; 
import java.net.*; 

public class tcpmain { 

    BufferedReader in; 

    static final int PORT = 9000; 
    public static void main(String[] args) { 
     // TODO Auto-generated method stub 

     //lines to make the gui frame 
     JFrame mainframe = new JFrame(); 
     mainframe.setTitle("TCP Listener"); 
     mainframe.setSize(600,800); 
     mainframe.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
     mainframe.setVisible(true); 


     ServerSocket serverSocket = null; 
     Socket socket = null; 
     try{ 
      serverSocket = new ServerSocket(PORT); 



      //Receive code motherfucker 
      /*int filesize=450660; 
      int bytesRead; 
      int current=0; 

      //receive file motherfucker 
      byte [] mybytearray = new byte [filesize]; 
      InputStream is = srsvsock.getInputStream(); 
      FileOutputStream fos = new FileOutputStream("C:\\Users\\Andy\\Desktop\\testimage.jpg"); 
      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();*/ 


      } 
      catch(Exception e){ 
       e.printStackTrace(); 
      } 
     while (true) { 
      try { 
       socket = serverSocket.accept(); 
       JOptionPane.showMessageDialog(null, "Client connected", "ALERT", JOptionPane.INFORMATION_MESSAGE); 
      } catch (IOException e) { 
       System.out.println("I/O error: " + e); 
      } 
      // new threa for a client 
      new EchoThread(socket).start(); 
      if (socket != null && !socket.isClosed()){ 
       try { 
        socket.close(); 
        JOptionPane.showMessageDialog(null, "Client Disconnected", "ALERT", JOptionPane.INFORMATION_MESSAGE); 
       } catch (IOException e) { 
        // TODO Auto-generated catch block 
        e.printStackTrace(); 
       } 
      } 
     } 


     } 


    } 

客戶端處理程序是Android客戶端:

package com.example.tcpsocket; 

import java.io.BufferedInputStream; 
import java.io.ByteArrayOutputStream; 
import java.io.File; 
import java.io.FileInputStream; 
import java.io.FileNotFoundException; 
import java.io.FileOutputStream; 
import java.io.IOException; 
import java.io.InputStream; 
import java.io.OutputStream; 
import java.net.InetAddress; 
import java.net.Socket; 

import android.os.Bundle; 
import android.app.Activity; 
import android.graphics.Bitmap; 
import android.graphics.Bitmap.CompressFormat; 
import android.util.Log; 
import android.view.Menu; 
import android.view.View; 
import android.view.View.OnClickListener; 
import android.widget.Button; 

public class MainActivity extends Activity { 

    private Socket socket; 

    private static final int SERVERPORT = 9000; 

    private static final String SERVER_IP = "192.168.1.113"; 

    Bitmap bitmap; 
    File imagePath; 


    @Override 
    protected void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     setContentView(R.layout.activity_main); 

     Button btnconnect = (Button)findViewById(R.id.button1); 
     btnconnect.setOnClickListener(connect); 

    } 

    private OnClickListener connect = new OnClickListener(){ 

     @Override 
     public void onClick(View arg0) { 
      // TODO Auto-generated method stub 
      //Bitmap bitmap = takeScreenshot(); 
       // saveBitmap(bitmap); 
      new Thread(new clienthread()).start(); 

     } 

    }; 

    public Bitmap takeScreenshot() { 
      View rootView = findViewById(android.R.id.content).getRootView(); 
      rootView.setDrawingCacheEnabled(true); 
      return rootView.getDrawingCache(); 
     } 

    public void saveBitmap(Bitmap bitmap){ 
     File imagePath = new File("sdcard/screenshot.jpg"); 
      FileOutputStream fos; 
      try { 
       fos = new FileOutputStream(imagePath); 
       bitmap.compress(CompressFormat.JPEG, 100, fos); 
       fos.flush(); 
       fos.close(); 
       new Thread(new clienthread()).start(); 
      } catch (FileNotFoundException e) { 
       Log.e("GREC", e.getMessage(), e); 
      } catch (IOException e) { 
       Log.e("GREC", e.getMessage(), e); 
      } 
    } 

    @Override 
    public boolean onCreateOptionsMenu(Menu menu) { 
     // Inflate the menu; this adds items to the action bar if it is present. 
     getMenuInflater().inflate(R.menu.main, menu); 
     return true; 
    } 

    class clienthread implements Runnable { 


     @Override 
     public void run() { 
      // TODO Auto-generated method stub 
      try{ 
       InetAddress serverAddr = InetAddress.getByName(SERVER_IP); 
       socket = new Socket(serverAddr, SERVERPORT); 
       /*File imagePath = new File("sdcard/screenshot.jpg"); 




       byte[] mybytearray = new byte[450560]; 
       FileInputStream fis = new FileInputStream(imagePath); 
       BufferedInputStream bis = new BufferedInputStream(fis); 
       bis.read(mybytearray,0,mybytearray.length); 
       OutputStream os = socket.getOutputStream(); 
       os.write(mybytearray,0,mybytearray.length); 
       os.close();*/ 
      } 
      catch(Exception e){ 


      } 
     } 


    } 





} 

回答

0

看起來是最有可能是由於這一行:

 if (socket != null && !socket.isClosed()){ 

如果插座之前被打開,你如果通過關閉的線程來處理,插座仍然是開放的,socket.isClosed()將返回false,你會立即關閉插座和清理你的主線程。

+0

謝謝他們,他們java控制檯沒有扔任何東西,當我測試它與我的兩個Android設備。謝啦。 :) – andyADD

1

這裏:

 new EchoThread(socket).start(); 
     if (socket != null && !socket.isClosed()){ 
      try { 
       socket.close();//Don't do this here!!!!!! 
       JOptionPane.showMessageDialog(null, "Client Disconnected", "ALERT", JOptionPane.INFORMATION_MESSAGE); 
      } catch (IOException e) { 
       // TODO Auto-generated catch block 
       e.printStackTrace(); 
      } 
     } 

你不應該關閉套接字你開始你的線程之後。在完成通信後,關閉套接字應該是EchoThread的工作。您可以在run()方法socket.close();的末尾插入此行,以便在完成後自行關閉。

相關問題