gpt4 book ai didi

java - 检查您要连接的端口是否正在使用

转载 作者:太空宇宙 更新时间:2023-11-04 13:07:41 24 4
gpt4 key购买 nike

所以我有一个服务器客户端程序,它可以捕获屏幕并将其显示在您的屏幕上。我想在主要部分验证我想要连接的端口是否正在使用并打印一些相关消息..

服务器:

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

最佳答案

如果客户端和服务器在同一个盒子上,那么您可以使用绑定(bind)到现有端口并检查特定异常的策略。

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

关于java - 检查您要连接的端口是否正在使用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34272602/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com