2016-11-05 11 views
0

これは説明が少し難しく、コードをすべてポストするには大きすぎるため、コードを重要な部分に減らす必要がありました。スレッドサーバーから非静的メソッドを呼び出す

私はクライアントにいくつかのデータを提供するマルチスレッドソケットサーバーを持っていますが、2つ以上の同時要求を受け取るまでうまく動作しますが、要求から返されたデータが正しくなく、他のリクエストのデータの

これは主なclient()メソッドが静的変数として定義されているために発生した可能性があります。そのため、各リクエストによって変数が更新され、個々のリクエストではなくグローバルになります。

私の主な方法は静的であると宣言されなければなりません。また、インスタンスは1つしかないので静的でなければなりませんが、スレッド要求は静的ではありません。

クライアント()メソッドが静的コンテキストから非staticを呼び出すことができないというエラーをスローするので、問題をコンパイルできません。

どのように私のサーバースレッドから静的でないメソッドを呼び出すことができますか?各要求に静的で上書きされない独自の有効範囲を持つ変数です。

私が最初に言ったように、説明するのはちょっと難しいですが、私はそれをカバーしたいと思いますか?

public static void main(String[] args) throws Exception { 
    try { 
    new Server().start(); 
    } 
} 


public void client(Socket socket, int conidx){ 
    ... code  
} 


private static class Server { 

    private void start() { 
     ..code 
    } 

    .... code 

    try { 
     Socket s = serverSocket.accept(); 
     executorService.submit(new ServiceRequest(s)); 
    } 

    class ServiceRequest implements Runnable { 
     ... code 

     public void run() { 
      client(socket,conidx); 
     } 
    } 
} 

答えて

0

まず、メインオブジェクトのインスタンスを作成する必要があります(メインコードをそのコードを含めないようにしてください)。提案のための

public static void main(String[] args) throws Exception { 
    System.exit(run()); 
} 
... 
public int run() throws Exception { 
    try { 
     new Server().start(); 
    } 
} 
... 
private class /*no static here*/ Server 
{ 
    class ServiceRequest implements Runnable { 
     public void run() { 
      client(socket, conidx); 
      // or Main.client(socket, conidx); 
    ... 
+0

おかげで、これを変更すると宣言された静的メソッドや変数を持っていないにも関わらず、複数の送信:

第二に、サーバー内部クラスは、クラスを囲むの文脈の中で住んでいるので、静的であってはなりません同時に要求すると、すべての要求で最後の要求のデータが使用されます。 – crankshaft

関連する問題