0

ソケットを使用してクライアントサーバーアプリを作成してみます。私はすでにAVDでそれを行うことに成功しており、私のPCマシンでサーバーとクライアントの両方を実行しています。しかし、デバイスの同じ Wifi ネットワークで動作させようとすると、アプリがクラッシュします。

はい、私は接続に別のスレッドを使用しており、既にインターネットの使用をマニフェストに追加しています。

ここにいくつかのコードがあります...

クライアント スレッド:

package com.mainlauncher;

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

public class ConnectionThread extends Thread {

private static final int SERVERPORT = 7777;
private static final String SERVERADDRESS = "My-PC";
private Socket socket;
private DataInputStream in;
private DataOutputStream out;

@Override
public void run() {
    super.run();
    open();
    close();
}

void open(){
    try{
        socket = new Socket(SERVERADDRESS,SERVERPORT);
        in = new DataInputStream(socket.getInputStream());
        out = new DataOutputStream(socket.getOutputStream());
    }
    catch(IOException e){}
}

void close(){
    try {
        if(in!=null)
            in.close();
        if(out!=null)
            out.close();
        if(socket!=null)
            socket.close();
    } 
    catch (IOException e) {}
    socket=null;

}


}

サーバー側のメイン:

import java.io.IOException;
import java.net.*;


public class Main {

public static void main(String[] args) {
    int port = 7777;
    new Main().handleClients(port);
}

private void handleClients(int port) {
    ServerSocket serverSocket = null;
    try{
        serverSocket = new ServerSocket(port);
        System.out.println("Server is ready...");
        for(int i=1; ; i++){
            Socket socket = serverSocket.accept();
            ServerThread thread = new ServerThread(i,socket);
            System.out.println(i + " Connected");
            thread.run();
        }
    }
    catch (Exception e){
        System.err.println(e.getMessage());
    }
    finally{
        if(serverSocket != null){
            try{ serverSocket.close(); }
            catch(IOException x){}
        }

    }


}

}

および ServerThread:

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


public class ServerThread extends Thread {

private int serverIndex;
private Socket socket;
private DataOutputStream out;
private DataInputStream in;

public ServerThread (int serverIndex, Socket socket){
    this.serverIndex = serverIndex;
    this.socket = socket;
}

@Override
public void run() {
    super.run();

    try {
        in = new DataInputStream(socket.getInputStream());
        out = new DataOutputStream(socket.getOutputStream());
    } catch (IOException e) {
        System.out.println(serverIndex + " Disconnected");
    }

    finally{
        try {
            in.close();
            out.close();
            socket.close();
        } catch (IOException e) {}
    }
}
}

ここで答えを探してみました\ googleなど...何も役に立ちませんでした。私のPCには、ファイアウォールや着信接続をブロックするものはありません。

アイデアはありますか?

ありがとう、リオズ

4

1 に答える 1

1

これで問題がすぐに解決するわけではありませんが、プログラムが実際の問題の証拠を捨てる原因となっているバグがいくつかあります。

1) これは単に例外を押しつぶし、それが起こったというすべての証拠を捨てました。

    catch(IOException e){}

2) これは少し良いですが、スタック トレースではなく、例外メッセージのみを出力します。

    catch (Exception e){
        System.err.println(e.getMessage());
    }

2) のもう 1 つの問題は、IOExceptions だけでなく、すべての例外をキャッチすることです。NullPointerExceptionこれには、などの未チェックの例外が含まSecurityExceptionれます。

例外は次のように診断する必要があります。

    catch (IOException e){
        e.printStackTrace();
    }

またはログに記録されます。


最後に、リクエストを処理する方法が間違っています:

    Socket socket = serverSocket.accept();
    ServerThread thread = new ServerThread(i,socket);
    System.out.println(i + " Connected");
    thread.run();

間違いは最後の文にあります。これが実際に行うことは、threadオブジェクトのrun()メソッドを単に呼び出すことです...現在のスレッドで。メソッドを別のスレッドで実行run()するには、メソッドを呼び出す必要がありますstart。このような:

    Socket socket = serverSocket.accept();
    ServerThread thread = new ServerThread(i,socket);
    System.out.println(i + " Connected");
    thread.start();
于 2012-10-27T13:56:38.213 に答える