簡體   English   中英

服務器/ Android客戶端僅接收/發送一次

[英]Server/Android client receives/sends only once

我想將一串文本從Android手機發送到PC上運行的Java服務器,並且可以運行,但是只有一次,它會收到第一個字符串,但是當我在手機上鍵入另一個字符串並按下按鈕時,服務器什么也沒收到,(這是我的android應用代碼):

button.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View v) {
            messsage = etMsg.getText().toString();
            etMsg.setText("");

            new Thread(new Runnable() {
                @Override
                public void run() {
                    try
                    {
                        client = new Socket(etIP.getText().toString(), port);
                        printwriter = new PrintWriter(client.getOutputStream());
                        printwriter.write(messsage);
                        printwriter.flush();
                        printwriter.close();
                        client.close();
                    }
                    catch (UnknownHostException e)
                    {
                        e.printStackTrace();
                    }
                    catch (IOException e)
                    {
                        e.printStackTrace();
                    }
                }
            }).start();
        }
    });

這是Java服務器的代碼:

package src;
import java.io.IOException;
import java.net.ServerSocket;
import java.net.Socket;
import java.util.Scanner;

public class VRS {

public static void main(String[] args) throws IOException {
    Socket clientSocket = null;
    ServerSocket serverSocket = null;
    try{
        serverSocket = new ServerSocket(4444);
        System.out.println("server started on port 4444");
        clientSocket = serverSocket.accept();
    }catch(Exception e){} //read & display the message
        //BufferedReader in = new BufferedReader(new InputStreamReader(clientSocket.getInputS­tream()));
        Scanner in1 = new Scanner(clientSocket.getInputStream());
        String mes; 
        while(true){
            if (in1.hasNext())
            {
                mes=in1.nextLine();
                System.out.println("Client message :"+mes + System.lineSeparator());
            }
        }
    }
}

我是Java的初學者,誰能幫助我發現問題。

服務器上的掃描程序正在等待帶有終結符的完整令牌,而您沒有從客戶端發送一個令牌。 嘗試在客戶端附加一個行結束符,例如

printwriter.println(messsage);

除此之外,似乎每次在客戶端單擊時都會創建一個新的Socket對象。 但是服務器沒有在等待新的連接。 您可以:

  1. 在客戶端重用Socket ,而不是為每次點擊都創建一個新Socket 例如,使您的client變量成為類成員。
  2. 在每個消息調用之后的服務器端, clientSocket = serverSocket.accept(); 再次創建一個新的Socket 這個新的服務器端Socket將與客戶端上的新套接字相對應。

第一種選擇被認為效率更高,尤其是當您要處理的連接和消息數量增加時。

暫無
暫無

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

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