Android tcp客户端连接然后从java服务器断开连接

问题描述 投票:2回答:2

我在我的电脑上做java服务器,并让我的Android设备连接到它。我可以连接它,但一旦连接就断开连接。我确信在android方面我需要做些什么,但我很少迷失它。我有互联网许可,所以很好。

还要忽略我从android到PC发送图像的注释代码。同时忽略savebitmap并截取屏幕截图如果没有调用它,我认为它不会影响连接。

Java服务器:

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


        }


    }

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

    }



}

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


            }
        }


    }





}
java android tcp
2个回答
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();
            }
        }

启动Thread后不应关闭套接字。在完成与它的通信后,套接字的关闭应该是EchoThread的工作。您可以在run()方法socket.close();的末尾插入此行,以便在完成后自行关闭。


0
投票

看起来很可能是由于这条线:

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

如果您的套接字先前已打开并且您传递给要处理的线程,则套接字仍将打开,socket.isClosed()将返回false,您将立即关闭套接字并在主线程中清理它。

© www.soinside.com 2019 - 2024. All rights reserved.