简体   繁体   中英

Android tcp client connects then disconnect from java server

I am doing java server on my pc and having my android device connect to it. I can connect it but it disconnects as soon as it connects. I am sure there is something I need to do on the android side but I am little lost on it. I have the internet permission so that is fine.

Also ignore the commented code I was sending image from my android to pc. Also ignore the savebitmap and take screenshot I don't think its affecting the connection if its not being called.

Java Server:

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
            /*int filesize=450660;
            int bytesRead;
            int current=0;

            //receive file
            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();
                }
            }
        }


        }


    }

client handler for java server

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

    }



}

Here is android client:

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){


            }
        }


    }





}

Here:

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

You shouldn't close your socket after you started your Thread. The closing of the socket should be the job of the EchoThread after you finished communicating with it. You can insert this line at the end of run() method socket.close(); so it closes itself when you're done.

Looks like it is most likely due to this line:

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

If your socket was previously opened and you passed if off to the thread to handle, the socket would still be open and socket.isClosed() will return false and you'll immediately close the socket and clean it up in your main thread.

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM