1

私はAndroid、Java、およびソケットプログラミングが初めてなので、もちろん3つすべてをマージしようとしています!

Android アプリ (クライアント) に短い文字列を送信するだけのデスクトップ ベースの Java サーバーを作成しています。

私はAndroidアプリを正常に実行しており、問題なく読み取られる文字列をサーバーに送信します。

サーバーを実行していますが、問題なく文字列を受信して​​います。

ただし、サーバーから返された文字列を読み取ろうとするたびに、アプリ(クライアント)にはソケットタイムアウトがあります。同じコードを使用しているため、問題を理解できません。

とにかくここにコードがあります:

//SERVER//

import java.io.*;
import java.net.*;
import java.util.*;

public class GpsServer {

    ServerSocket serversocket = null;
    Socket socket = null;

    public GpsServer() 
    {
        try
        {
            serversocket = new ServerSocket(8189);
        } 
        catch (UnknownHostException unhe) 
        {
            System.out.println("UnknownHostException: " + unhe.getMessage());
        } 
        catch (InterruptedIOException intioe) 
        {
            System.out.println("Timeout while attempting to establish socket connection.");
        } catch (IOException ioe) 
        {
            System.out.println("IOException: " + ioe.getMessage());
        }
    }

    public void refreshServer() {

        try 
        {
            socket = serversocket.accept();

            InputStreamReader inputstreamreader = new InputStreamReader(socket.getInputStream());
            BufferedReader bufferedreader = new BufferedReader(inputstreamreader);
            PrintWriter printwriter = new PrintWriter(socket.getOutputStream(),true);

            System.out.println("socket read successful");
            printwriter.println("Send Bye to disconnect.");

            String lineread = "";
              boolean done = false;
              while (((lineread = bufferedreader.readLine()) != null) && (!done)){
                System.out.println("Received from Client: " + lineread);
                printwriter.println("You sent: " + lineread);
                if (lineread.compareToIgnoreCase("Bye") == 0) done = true;
              }

            System.out.println("Closing connection");

            socket.close();
            bufferedreader.close();
            inputstreamreader.close();
            printwriter.close();
        } 
        catch (UnknownHostException unhe) 
        {
            System.out.println("UnknownHostException: " + unhe.getMessage());
        } 
        catch (InterruptedIOException intioe)
        {
            System.out
                    .println("Timeout while attempting to establish socket connection.");
        } 
        catch (IOException ioe) 
        {
            System.out.println("IOException: " + ioe.getMessage());
        }
    }

    public void nullify() {     
        try 
        {
            socket.close();
            serversocket.close();
        } 
        catch (IOException ioe) 
        {
            System.out.println("IOException: " + ioe.getMessage());
        }
    }
}

そしてクライアント...

//CLIENT

import java.io.*;
import java.net.*;
import java.util.*;

public class GpsClient {

    public String lastMessage;
    Socket socket = null;

    String serverurl;
    int serverport;

    public GpsClient() {
        lastMessage = "";

        serverport = 8189;
        serverurl = "192.168.10.4";

        try 
        {
            socket = new Socket(serverurl, serverport);
            socket.setSoTimeout(10000);
        } 
        catch (UnknownHostException unhe) 
        {
            System.out.println("UnknownHostException: " + unhe.getMessage());
        } 
        catch (InterruptedIOException intioe) 
        {
            System.out.println("Timeout while attempting to establish socket connection.");
        } 
        catch (IOException ioe) 
        {
            System.out.println("IOException: " + ioe.getMessage());
        }
    }

    public void retrieveNew() {

        try {
            socket = new Socket(serverurl, serverport);
            socket.setSoTimeout(10000);

            lastMessage = "connected!";

            InputStreamReader inputstreamreader = new InputStreamReader(socket.getInputStream());
            BufferedReader bufferedreader = new BufferedReader(inputstreamreader);

            PrintWriter printwriter = new PrintWriter(socket.getOutputStream(),true);
            printwriter.println("Request");

            lastMessage = "Request sent";

//          Get error when I uncomment this block, i.e. try to read the response from the server
//          "Timeout while attempting to establish socket connection."

//          String lineread = "";
//          while ((lineread = bufferedreader.readLine()) != null) {
//              System.out.println("Received from Server: " + lineread);
//              lastMessage = "Received from Server: " + lineread;
//          }

            lastMessage = "closing connection!";
            bufferedreader.close();
            inputstreamreader.close();
            printwriter.close();
            socket.close();

        } 
        catch (UnknownHostException unhe) 
        {
            System.out.println("UnknownHostException: " + unhe.getMessage());
        } 
        catch (InterruptedIOException intioe) 
        {
            System.out.println("Timeout while attempting to establish socket connection.");
        } 
        catch (IOException ioe) 
        {
            System.out.println("IOException: " + ioe.getMessage());
        } 
        finally 
        {
            try 
            {
                socket.close();
            } 
            catch (IOException ioe) 
            {
                System.out.println("IOException: " + ioe.getMessage());
            }
        }
    }

    public void nullify() {
        try 
        {
            PrintWriter printwriter = new PrintWriter(socket.getOutputStream(),true);
            printwriter.println("Bye");
            printwriter.close();
            socket.close();
        }
        catch (IOException ioe) 
        {
            System.out.println("IOException: " + ioe.getMessage());
        }
    }
}

前もって感謝します!

ジョシュ

4

2 に答える 2

0

ETXなどのサーバー メッセージの末尾に何かを挿入するか<end>、メッセージを でラップしてみてください<msg>...</msg>

Android では while ループで、 をチェックする代わりに受信したかどうかをチェックし(lineread = bufferedreader.readLine()) != nullます。

于 2015-08-11T11:43:07.973 に答える
0

私のコメントに記載されているすべての問題とは別に、クライアントに 2 つのソケットを作成しており、サーバーは 1 つの接続のみを処理するように記述されています。したがって、最初のものに書き込み、そこから読み取ろうとしますが、クライアントは2番目のものに書き込み、そこから読み取ろうとします。

それを修正すると、両側が互いに読み込もうとするため、デッドロックが発生します。

また、知っておく必要のある例外を飲み込むため、ネットワーク経由で使用しPrintWriterないでください。PrintStreamを使用しBufferedWriterます。

于 2013-05-15T02:29:33.333 に答える