2016-03-26 15 views
0

serverBir localhost bağlantı noktasını dinleme değil, birkaç bağlantı noktası denedim. zaman aşımı çizgisi olmadan bile çalışmıyor. Lütfen bu koddaki herhangi bir değişikliği önerin.serverSocket dinlemiyor

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); 
} 
} 

Güvenlik duvarını denetledim ve bağlantı noktaları başka bir işlem tarafından kullanılmadıysa. herhangi bir yardım için teşekkür ederiz.

+2

Bunun neden çalışmadığını anlamıyorum. serverSocket.accept(); 'yeni bir bağlantı için bekleyecektir. Kodunuz, aslında sunucu soketine bağlanmadığınız sürece yeni bir istemci iş parçacığı başlattığınız satıra ulaşmaz. İstemci soketinin kodunu da eklemenizi öneririm –

cevap

0

Bu hiç şaşırtıcı değil. Geliştirdiğiniz uygulama bir Java uygulamasıdır. Bunun anlamı, çalışacağı normal yürütme kabının bir web tarayıcısıdır. Elbette, Java tarayıcı eklentisi, bir kullanıcı tarayıcısında çalışan uygulamalarda güvenlik kısıtlamaları oluşturmalıdır. Aksi takdirde, uygulamalar zararlı kodları kullanıcılara göndermek için mükemmel bir yol olacaktır.

Koruma mekanizmasına kum havuzu denir. Bu, birçok kısıtlamaya yol açar, bağlamınızda önemli olan tek kısıtlama, bir uygulamanın yalnızca geldikleri ana makineye ve bağlantı noktasına ağ bağlantılarını açmasına izin vermesidir. Bu, yüklendikleri sunucuya HTTP çağrıları yapabilecekleri anlamına gelir. ayrıntıları burada belgelere bakın: imzalı için http://docs.oracle.com/javase/7/docs/technotes/guides/jweb/security/rsa_signing.html varolan bildirim dosyası ayrıştırılır uygulamalarını: Ancak http://docs.oracle.com/javase/tutorial/deployment/applet/security.html

, bu kısıtlamaların kurtulmak için, burada açıklandığı gibi uygulamasını oturum açabilirsiniz. http://docs.oracle.com/javase/7/docs/technotes/guides/jweb/security/manifest.html

Uzun cevap kısa: Uygulamanızı doğru şekilde imzalayın ve gitmek için iyi olmalısınız.

+0

da imzalamadan soket transferini yapabilmemin herhangi bir yolu var mı? veya uygulama yerine başka bir tekniği kullanabilir miyim? Yukarıdaki kodda, uygulamada grafik görüntüsü oluşturmayı ve kaydetme amacıyla sunucuya aktarmayı planlıyorum. – APL

+0

Tabii ki her zaman eksiksiz bir teknoloji geçişi yapabilirsiniz. HTML5, JavaScript'te çizim işlevini uygulayın ve bir tuvale çizin. Bir kanvasın mevcut içeriğini her zaman HTTP üzerinden gönderebilirsiniz. Ancak, bu tamamen farklı bir soru olurdu. –