0

サーバーからクライアントにデータを送信するアプリケーションを作成しました....コード(サーバーとクライアント)はデスクトップアプリケーションで完全に機能しますが、クライアントをAndroidタブレットに、サーバーをデスクトップに配置すると、機能しません

Androidとデスクトップ間の通信にwifiを使用しています

私が設定した権限は以下のとおりです

 <uses-permission android:name="android.permission.INTERNET" />
    <uses-permission android:name="android.permission.ACCESS_WIFI_STATE" />
    <uses-permission android:name="android.permission.WRITE_SETTINGS" />

この問題の背後にあるものを誰か教えてください.....

この例外が発生しています

java.net.ConnectException: failed to connect to /192.168.1.74 (port 4545): connect failed: ECONNREFUSED (Connection refused)

サーバー.java

public class Server
{
  private int TAB_SERVER_PORT = 4545;
  private static PrintWriter TABout;
  private HashSet <PrintWriter> TABhs=new HashSet<PrintWriter>();
  public static void main(String args[])
  {
    new Thread(new TABServerThread()).start();
  } 

    private class TABServerThread implements Runnable {
        private ServerSocket TABserver;
        @Override
        public void run() {
            try {
                TABserver = new ServerSocket(TAB_SERVER_PORT);
                System.out.println("Server Start the server at port " + TAB_SERVER_PORT + " and waiting for clients...");
                while (true) {
                    Socket socket = TABserver.accept();
                    System.out.println("Server Accept socket connection: "+ socket.getLocalAddress());
                    new Thread(new TABClientHandler(socket)).start();
                }
            } catch (IOException e) {
                e.printStackTrace();
            }
        }

    }

    private class TABClientHandler implements Runnable {
        private Socket clientSocket;
        private Scanner in;
        public TABClientHandler(Socket clietSocket) {
            this.clientSocket = clietSocket;
        }
        @Override
        public void run() {
            try {
                TABout = new PrintWriter(clientSocket.getOutputStream());
                TABhs.add(TABout);
                in = new Scanner(clientSocket.getInputStream());
                String line;
                while ((line = in.nextLine()) != null) {
                    if (line.equals("Reply")){
                        TABout.print("Server replies");
                        TABout.flush();
                    }
                }
            } catch (IOException e) {
                e.printStackTrace();
            }

        }

    }
}

クライアント.java

public class Client implements Runnable {
            private int TAB_SERVER_PORT = 4545;
            private Socket tabletclient;
            private PrintWriter tabletout;
            private Scanner in;

            @Override
            public void run() {
                    String line;
                    boolean flag=true;
                    System.out.println("Waiting for server connection....");
                    while(flag){
                    try {
                        tabletclient = new Socket("192.168.1.74", TAB_SERVER_PORT);
                        tabletout = new PrintWriter(tabletclient.getOutputStream());
                        in = new Scanner(tabletclient.getInputStream());
                        try
                        {
                            if((line = in.nextLine())!=null)
                            {
                                System.out.println("Client Server says: " + line);
                                if (line.equals("Hello client")) {
                                    tabletout.println("Reply");
                                    tabletout.flush();
                                }
                            }
                        }catch(Exception d){
                            System.out.println("Connection from server has lost.........");
                        }
                        } catch (UnknownHostException e) {
                        } catch (IOException e) {
                        }
                     }
            }

 public static void main(String[] args) {
               new Thread(new Client()).start();

            }
        }
4

3 に答える 3

0

接続をブロックするのはファイアウォールである必要があります。無効にして再試行できます。さらに問題が発生した場合は、wireshark を使用してパケットをキャプチャし、問題の場所を確認してください。

Linux または Windows の両方で "netstat -n" を試して、サーバー ソケットがそこでバインドされ、リッスンされているかどうかを確認できます。

于 2013-08-29T06:48:09.493 に答える
-1

Android アプリケーションをクライアントに、デスクトップ アプリケーションをサーバーに変更します。この方法ははるかに簡単で安全です (もちろん私の意見では)。モバイル デバイスの IP はいつでも変更される可能性があります... モバイルであることはわかっています。クライアントはモバイル サーバーの IP を推測できません。

Client.java を Android アプリに、Server.java をデスクトップ アプリに移動します。

于 2013-08-29T07:13:47.177 に答える
-1

"ifconfig" (Linux で作業している場合) を使用して IP アドレスを確認するか、Windows システムで作業している場合は "ipconfig" を使用してみてください。IP アドレスが正確に「192.168.1.74」であることを確認してください。

于 2016-06-30T23:59:48.890 に答える