2

私は単純な接続アクティビティを持っています:

package com.example.conn08;

import ...;

public class MainActivity extends Activity
{
    public static Socket clientSocket;
    public static DataOutputStream outToServer;
    public static PrintWriter outTest;
    public static BufferedReader inToServer;

PrintWriter outTest を使用して、サーバーの可用性をテストします。ユーザーがインターネットに接続していない場合、またはサーバーが機能していない場合は、ブール値の shouldContinue を使用してスレッドを一時停止します。

    private Thread mThread;
    private final Object lock = new Object();
    private Boolean shouldContinue = true;


    @Override
    public void onCreate(Bundle savedInstanceState) 
    {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        mThread = new Thread(new Runnable() 
        {
            public void run() 
            {
                while (true) 
                {
                    synchronized(lock)
                    {
                        try 
                        {
                            lock.wait(); // lock the Thread
                        } 
                        catch (InterruptedException e) 
                        {
                            e.printStackTrace();
                        }
                    }
                    while (shouldContinue) 
                    {
                        try 
                        {
                            final String data = inToServer.readLine();
                            if (data != null)
                            {
                                Log.v("data", data);
                                runOnUiThread(new Runnable()
                                {
                                    @Override
                                    public void run()
                                    {
                                        String put[] = data.split("#");
                                        //Data parsing
                                    }
                                });
                            }
                        } 
                        catch (IOException e)
                        {
                            e.printStackTrace();
                        }

サーバーの可用性を確認します。

                        try {
                            if(clientSocket.getInputStream().read() == -1)
                            {
                                Log.v("Connection: ", "lost");
                            }
                        } catch (IOException e) {
                            // TODO Auto-generated catch block
                            e.printStackTrace();
                        }
                    }
                }
            }
        });
        mThread.start(); 

        Connect();
    }
    public void Connect()
    {
        shouldContinue = true;
        try
        {
            clientSocket = new Socket();
            clientSocket.connect(new InetSocketAddress("localhost", 15780), 30000);

            outToServer = new DataOutputStream(clientSocket.getOutputStream());
            inToServer = new BufferedReader(
            new InputStreamReader(clientSocket.getInputStream()));
            outTest = new PrintWriter(new BufferedWriter(
            new OutputStreamWriter(clientSocket.getOutputStream())), true);

            synchronized(lock) 
            {
                lock.notify();
            }

            sendUTF("3#kokoko"); //send the message!
        } 
        catch (IOException e)
        {
            e.printStackTrace();
        }
    }
    public static void sendUTF(String str)
    {
        try
        {
            byte[] buf = str.getBytes("UTF-8");
            outToServer.write(buf, 0, buf.length);
            outToServer.writeBytes("\n");
            outToServer.flush();
        } 
        catch (IOException e)
        {
            e.printStackTrace();
            outServ.setText("Нет соединения!");
        }
    }
}

を使用しない場合の問題

if(clientSocket.getInputStream().read() == -1)

そして、次のようにサーバーにデータを送信します。

sendUTF("3#kokoko");

すべて問題ありませんが、サーバーで使用すると、「#kokoko」のようなメッセージが表示されます。メッセージの最初の文字が失われ、ソケットがクラッシュします! お願い助けて

4

0 に答える 0