2015-12-14 2 views
1

Итак, у меня есть сервер-клиентская программа, которая делает захват экрана и показывает его на экране. Я хочу, чтобы проверить, в основной части, если порт я хочу подключиться, используется или нет, и напечатать некоторые соответствующие сообщения ..Проверьте, используется ли порт, к которому вы хотите подключиться.

Сервер:

package test; 

import java.awt.image.BufferedImage; 
import java.io.IOException; 
import java.net.ServerSocket; 
import java.net.Socket; 
import java.net.SocketTimeoutException; 
import java.sql.SQLException; 

import javax.imageio.ImageIO; 
import javax.swing.ImageIcon; 
import javax.swing.JFrame; 
import javax.swing.JLabel; 

public class Server extends Thread 
{ 
     private ServerSocket serverSocket; 
     Socket server; 

     public Server(int port) throws IOException, SQLException, ClassNotFoundException, Exception 
     { 
      serverSocket = new ServerSocket(port); 
      serverSocket.setSoTimeout(180000); 
     } 

     public void run() 
     { 
      while(true) 
      { 
       try 
       { 
        server = serverSocket.accept(); 
        BufferedImage img=ImageIO.read(ImageIO.createImageInputStream(server.getInputStream())); 
        JFrame frame = new JFrame(); 
        frame.getContentPane().add(new JLabel(new ImageIcon(img))); 
        frame.pack(); 
        frame.setVisible(true);     
       } 
      catch(SocketTimeoutException st) 
      { 
        System.out.println("Socket timed out!"); 
        break; 
      } 
      catch(IOException e) 
      { 
        e.printStackTrace(); 
        break; 
      } 
      catch(Exception ex) 
      { 
        System.out.println(ex); 
      } 
      } 
     } 

//  private static boolean isLocalPortInUse(int port) { 
//   try { 
//    // ServerSocket try to open a LOCAL port 
//    new ServerSocket(port).close(); 
//    // local port can be opened, it's available 
//    return false; 
//   } catch(IOException e) { 
//    // local port cannot be opened, it's in use 
//    return true; 
//   } 
//  } 

     public static void main(String [] args) throws IOException, SQLException, ClassNotFoundException, Exception 
     { 
       int port = 9000; 
       Thread t = new Server(port); 

       t.start(); 

     } 
} 

Клиент:

package test; 

import java.awt.AWTException; 
import java.awt.Image; 
import java.awt.Rectangle; 
import java.awt.Robot; 
import java.awt.image.BufferedImage; 
import java.io.IOException; 
import java.net.Socket; 

import javax.imageio.ImageIO; 

public class Client 
{ 
    static BufferedImage img; 
    byte[] bytes; 

    public static void main(String [] args) 
    { 
     String serverName = "localhost"; 
     int port = 10001; 
     try 
     { 
      Socket client = new Socket(serverName, port); 
      Robot bot; 
      bot = new Robot();//clasa Robot ajuta la creare capturii de ecran 
      img = bot.createScreenCapture(new Rectangle(0, 0, 500, 500));//scalarea imaginii; schimba dimensiunea screen shotului 
      ImageIO.write(img,"JPG",client.getOutputStream()); 
      System.out.println("The image is on the screen!Yey!"); 
      client.close(); 
     } catch(IOException | AWTException e) { 
      e.printStackTrace(); 
     } 
    } 
} 
+1

Так что это вопрос? –

+0

Я хочу проверить в основной части, если порт, к которому я хочу подключиться, используется или нет, и для печати некоторых релевантных сообщений. –

+1

http://stackoverflow.com/questions/2675362/how-to-find-an -available-port? rq = 1 может иметь важную информацию, связанную с вашей проблемой. –

ответ

0

Если клиент и сервер находятся в одном окне, вы можете использовать стратегию привязки к существующему порту и проверку конкретного исключения.

public static void main(String...args) throws IOException { 
    int port = 31999; // for demonstration purposes only. 

    boolean serverRunning = isServerRunning(port); 
    System.out.printf("Server running: %s\n", serverRunning); 

    new ServerSocket(port); // start the server 

    serverRunning = isServerRunning(port); 
    System.out.printf("Server running: %s\n", serverRunning); 
} 

private static boolean isServerRunning(int port) throws IOException { 
    try(ServerSocket clientApp = new ServerSocket(port)) { 
    return false; 
    } catch (java.net.BindException e) { 
    return true; 
    } 
} 

Если сервер находится на другом поле, которое, скорее всего, так, то вы можете следовать подобной стратегии, а не ищет ConnectException

public static void main(String...args) throws IOException { 
    int port = 31999; // for demonstration purposes only. 

    boolean serverRunning = isServerRunning("localhost", port); 
    System.out.printf("Server running: %s\n", serverRunning); 

    new ServerSocket(port); // start the server 

    serverRunning = isServerRunning("localhost", port); 
    System.out.printf("Server running: %s\n", serverRunning); 
} 

private static boolean isServerRunning(String address, int port) throws IOException { 
    try(Socket clientApp = new Socket(address, port)) { 
    return true; 
    } catch (java.net.ConnectException e) { 
    return false; 
    } 
} 
+0

Почему? Просто попробуйте подключиться к нему. Одна строка кода. – EJP

+0

Это зависит от того, какие библиотеки вы используете, но с простой библиотекой, например 'Socket' или' ServerSocket', вы не можете просто подключиться. Неисправное соединение вызовет исключение, и вам нужно будет различать «UnknownHostException», «NullPointerExcepiton» или «ConnectException» (например), чтобы правильно решить, как реагировать. При этом у вас также есть соединение сокета, которое должно быть закрыто. Необходимость try-catch действительно единственная накладная - фактическое соединение - одна строка кода. – SireInsectus