簡體   English   中英

為什么我的PrintWriter沒有將數據發送到服務器?

[英]Why my PrintWriter is not sending data to server?

我正在開發一個Android應用程序。 Android應用程序(客戶端)將與pc(服務器)連接並共享數據。 現在,我可以成功建立連接,但是無法發送數據。 這是我的Java文件,具有建立連接和發送數據的所有邏輯。

ServerConnection.java

public class ServerConnection  {

    private static  int SERVER_PORT = 1100;
    private static  String SERVER_IP = "192.168.43.7";
    private boolean isConnected=false,connectionDone=false;
    private boolean mouseMoved=false;
    Context context;
    private Socket socket;
    private PrintWriter out;

    public void startConnection(String port , String ip){
        SERVER_IP = ip.toString();

        ConnectPhoneTask connectPhoneTask = new ConnectPhoneTask();
        connectPhoneTask.execute(SERVER_IP);
    }


    public void sendDataToServer(String text){
        try {
            if(isConnected) {
                out = new PrintWriter(new BufferedWriter(new OutputStreamWriter(socket.getOutputStream())), true); //create output stream to send data to server

            }
        }catch (IOException e){
            Log.e("remotedroid", "Error while creating OutWriter", e);
            Toast.makeText(context, "Error: while creating OutWriter "+e, Toast.LENGTH_LONG).show();
        }
        if(out!=null){
            out.println(text);
        }
        else{
            Log.e("check" , "Something is wrong here");
        }
    }

    public class ConnectPhoneTask extends AsyncTask<String,Void,Boolean> {

        @Override
        protected Boolean doInBackground(String... params) {
            boolean result = true;

            try {
                InetAddress serverAddr = InetAddress.getByName(params[0]);
                socket = new Socket(serverAddr, SERVER_PORT);//Open socket on server IP and port

            } catch (IOException e) {
                Log.e("remotedroid", "Error while connecting", e);
                result = false;
            }
            return result;
        }

        @Override
        protected void onPostExecute(Boolean result)
        {
            isConnected = result;
            try {
                if(isConnected) {
                    out = new PrintWriter(new BufferedWriter(new OutputStreamWriter(socket.getOutputStream())), true); //create output stream to send data to server

                }
            }catch (IOException e){
                Log.e("remotedroid", "Error while creating OutWriter", e);
            }
        }
    }

}

並且此片段將啟動連接並發送數據(通過調用sendDataToServer(String text)方法)。

LogIntoServer.java

public class LogIntoServer extends Fragment {

    private EditText ipadr,portadr;
    private Button connect,disconnect;
    ServerConnection serverConnection;
    String SERVER_IP ;
    String SERVER_PORT;
    PrintWriter out;


    public LogIntoServer() {
        // Required empty public constructor
    }


    @Override
    public View onCreateView(LayoutInflater inflater, ViewGroup container,
                             Bundle savedInstanceState) {
        // Inflate the layout for this fragment
        View v = inflater.inflate(R.layout.fragment_log_into_server, container, false);
        ipadr      = v.findViewById(R.id.ipadr);
        portadr    = v.findViewById(R.id.portadr);
        connect    = v.findViewById(R.id.connect);
        disconnect = v.findViewById(R.id.disconnect);

        serverConnection = new ServerConnection();
        connect.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                 SERVER_IP = ipadr.getText().toString();
                 SERVER_PORT = portadr.getText().toString();
                 serverConnection.startConnection(SERVER_PORT , SERVER_IP);
                 serverConnection.sendDataToServer("Connection Successful");
            }
        });

        disconnect.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                serverConnection.sendDataToServer("exit");
            }
        });

        return v;
    }

}

如果我雙擊連接按鈕,則它將僅發送一次“連接成功”。 請幫忙。

將這些字段添加到AsyncTask 可能甚至是static

private boolean isConnecting = false;
private boolean isConnected = false;

並在套接字狀態更改時將其設置為truefalse

則不再需要單擊該按鈕的頻率了。

sendDataToServer()代碼可能應該在onPreExecute()運行。

圍繞AsyncTask額外類也是一團糟;

更好地直接構建它-使用IP,端口和消息。

您得到了一些OutputStreamWriter但從未寫入流;

除此之外,那里幾乎沒有任何onPostExecute代碼。

暫無
暫無

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

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