簡體   English   中英

Java服務器到Android客戶端:無法接收TCP數據包

[英]Java Server to Android Client: Cannot receive TCP packets

我正在嘗試編寫Java服務器,以便Android客戶端可以向其發送字符串,並且服務器將使用自己的字符串進行回復。 第一部分工作正常,客戶端將字符串發送到服務器,但是服務器向發送消息的服務器不起作用:數據包將其從服務器中移出,但Android客戶端未將其提取。 有人對如何解決此問題有建議嗎?

整個過程以前都在Python服務器上工作,但是由於庫支持,我將更改為Java(Java對NAT遍歷有更好的支持)

服務器(Java):

public class TCPServer implements Runnable {
    private Thread t = null;

    @Override
    public void run() {
        // TODO Auto-generated method stub
        String receive;
        String response = "1||2||3||4\n";
        ServerSocket tcpServer = null;
        Socket tcpClient = null;
        try {
            tcpServer = new ServerSocket(4999);
            System.out.println("   TCP open for connections");
            while(true) {
                tcpClient = tcpServer.accept();
                BufferedReader inStream = new BufferedReader(new InputStreamReader(tcpClient.getInputStream()));
                receive = inStream.readLine();
                System.out.println("Server <<< " + receive);

                DataOutputStream outStream = new DataOutputStream(tcpClient.getOutputStream());
                outStream.write(response.getBytes("UTF-8"));
                outStream.flush();
                System.out.println("Server >>> " + response);
            }
        } catch (IOException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
            System.out.println("IOException: " + e.toString());
        } finally {
            if (tcpServer != null) {
                try {
                    tcpServer.close();
                } catch (IOException e) {
                    // TODO Auto-generated catch block
                    e.printStackTrace();
                    System.out.println("IOException: " + e.toString());
                }
            }
            if (tcpClient != null) {
                try {
                    tcpClient.close();
                } catch (IOException e) {
                    // TODO Auto-generated catch block
                    e.printStackTrace();
                    System.out.println("IOException: " + e.toString());
                }
            }
        }
    }

    public void start() {
        // TODO Auto-generated method stub
        if(t == null) {
            t = new Thread(this);
            t.start();
            System.out.println("Start TCP Server");
        }

    }
}

客戶端(Android):

public class AsyncTCPSend extends AsyncTask<Void, Void, Void> {
            String address = "";
            String message = "";
            String response = "";
            AsyncTCPSend(String addr, String mes) {
                address = addr;
                message = mes + "\n";
            }

            @Override
            protected Void doInBackground(Void... params) {
                Socket socket = null;
                try {
                    socket = new Socket(address, 4999);
                    socket.getOutputStream().write(message.getBytes());

                    ByteArrayOutputStream writeBuffer = new ByteArrayOutputStream(1024);
                    byte[] buffer = new byte[1024];

                    int bytesRead;
                    InputStream writeIn = socket.getInputStream();

                    while((bytesRead = writeIn.read(buffer)) != -1) {
                        writeBuffer.write(buffer,0,bytesRead);
                        response += writeBuffer.toString("UTF-8");
                    }
                } catch (UnknownHostException e){
                    e.printStackTrace();
                    response = "Unknown HostException: " + e.toString();
                    System.out.println(response);
                } catch (IOException e) {
                    response = "IOException: " + e.toString();
                    System.out.println(response);
                } finally {
                    if (socket != null) {
                        try {
                            socket.close();
                        } catch (IOException e) {
                            e.printStackTrace();
                        }
                    }
                }
                return null;
            }

            @Override
            protected void onPostExecute(Void result) {
                recieve.setText(response);
                super.onPostExecute(result);
            }
        }

我不知道為什么要調用InputStream'writeIn',但是問題是客戶端一直在讀取套接字直到流結束,並且服務器從不關閉接受的套接字,因此流結束永遠不會發生。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM