2016-03-26 7 views
0

serverSocketはlocalhostのポートでリッスンしていないので、いくつかのポートを試しました。タイムアウトラインがなくても動作しません。このコードに変更を提案してください。serverSocket not listening

public class server1 extends JApplet implements Serializable{ 

static JApplet japplet = new JApplet(); 
private static ServerSocket serverSocket = null; 
private static Socket clientSocket = null; 
private static final int maxClientsCount = 5; 
private static final clientThread[] threads = new clientThread[maxClientsCount]; 

public void init() { 
    tool = Toolkit.getDefaultToolkit(); 
    setup_applet(); 
    setup_layout(); 
    run(); 
} 

public void run() { 
    try { 
     serverSocket = new ServerSocket(6789); 
     serverSocket.setSoTimeout(60000); 

    while (true) { 
     screen.init_Screen(); 
     clientSocket = serverSocket.accept(); 

      int i = 0; 
      for (i = 0; i < maxClientsCount; i++) { 
       if (threads[i] == null) { 
        (threads[i] = new clientThread(clientSocket, threads)) 
          .start(); 
        break; 
       } 
      } 
      if (i == maxClientsCount) { 
       clientSocket.close(); 
      } 
     } 
    } catch (IOException e) { 
     System.out.println(e); 
    } 
} 
} 

class clientThread extends Thread implements Serializable { 

private String clientName = null; 
private PrintStream os = null; 
private Socket clientSocket = null; 
private final clientThread[] threads; 
private int maxClientsCount; 

public clientThread(Socket clientSocket, clientThread[] threads) { 
    this.clientSocket = clientSocket; 
    this.threads = threads; 
    maxClientsCount = threads.length; 
} 

public void run() { 
    int maxClientsCount = this.maxClientsCount; 
    clientThread[] threads = this.threads; 

    try { 
     os = new PrintStream(clientSocket.getOutputStream()); 

     while (true) { 
      String msg = "server:apl"; 
      synchronized (this) { 
       for (int i = 0; i < maxClientsCount; i++) { 
        if (threads[i] != null && threads[i] == this) { 
         os.println(msg); 
         break; 
        } 
       } 
      } 
      synchronized (this) { 
       for (int i = 0; i < maxClientsCount; i++) { 
        if (threads[i] != null && threads[i] != this 
          && threads[i].clientName != null) { 
         BufferedImage image = ImageIO.read(clientSocket.getInputStream()); 
         if(image != null) { 
          soms1.screen.paint(image.getGraphics()); 
         } else { 
          System.out.println("failed to get"); 
         } 
        } 
       } 
      } 
      os.close(); 
     } 
    } catch (IOException e) { 
     System.out.println(e); 
} 
} 

ファイアウォールをチェックしても、ポートが別のプロセスで使用されていないかどうかチェックしました。 助けをいただければ幸いです。

+2

なぜこれが機能しないのかわかりません。 'serverSocket.accept();'は新しい接続を待ちます。サーバーソケットに実際に接続しない限り、コードは決して新しいクライアントスレッドを開始する行に到達しません。私はあなたもクライアントソケットのコードを追加することをお勧めします –

答えて

0

これは驚きではありません。開発したアプリケーションはJavaアプレットです。つまり、実行される通常の実行コンテナはWebブラウザです。もちろん、Javaブラウザプラグインは、ユーザーブラウザで実行されているアプレットにセキュリティ制限を課す必要があります。それ以外の場合、アプレットは悪質なコードをユーザーに配布するのに最適な方法です。

保護メカニズムは、サンドボックスと呼ばれます。これには多くの制限がありますが、アプレットではホストとポートへのネットワーク接続を開くことしかできません。つまり、ロードされたサーバーにHTTPコールを発信できます。詳細はこちらのドキュメント参照してください: http://docs.oracle.com/javase/tutorial/deployment/applet/security.html

をここで説明したようにしかし、あなたはこれらの制限を取り除くために、アプレットに署名することができます http://docs.oracle.com/javase/7/docs/technotes/guides/jweb/security/rsa_signing.html 署名付きアプレットの場合は、既存のマニフェストファイルが解析されます。 http://docs.oracle.com/javase/7/docs/technotes/guides/jweb/security/manifest.html

長い回答短い:適切にアプレットに署名してください。

+0

私は署名なしでソケット転送を行うことができます何らかの方法はありますか?または私はアプレットの代わりに他のテクニックを使用できますか?上記のコードでは、私はアプレットでグラフィックイメージを生成し、保存目的のためにサーバーに転送するつもりです。 – APL

+0

もちろん、いつでも完全なテクノロジーの切り替えが可能です。 HTML5、JavaScriptで描画機能を実装し、キャンバスに描画します。キャンバスの現在のコンテンツをHTTP経由でいつでも投稿できます。しかし、これはまったく別の問題です。 –

関連する問題