Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/sockets/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如果服务器打开,Java会自动连接到该服务器_Java_Sockets_Network Programming - Fatal编程技术网

如果服务器打开,Java会自动连接到该服务器

如果服务器打开,Java会自动连接到该服务器,java,sockets,network-programming,Java,Sockets,Network Programming,我正在尝试创建一个程序,该程序将确定服务器是否已连接、关闭或断开连接。 我需要使客户端在服务器打开时自动连接到服务器 问题: 1。如何持续ping服务器以确定服务器是否已启动? 2。为什么单击按钮时服务器只能接收一次。 3。确定服务器何时断开连接 这是我的密码: 服务器 public Server() { super("Server"); server.setLayout(new BorderLayout()); main.setLa

我正在尝试创建一个程序,该程序将确定服务器是否已连接、关闭或断开连接。 我需要使客户端在服务器打开时自动连接到服务器

问题:

1。如何持续ping服务器以确定服务器是否已启动?

2。为什么单击按钮时服务器只能接收一次。

3。确定服务器何时断开连接

这是我的密码:

服务器

   public Server()
    {
        super("Server");
        server.setLayout(new BorderLayout());
        main.setLayout(new BorderLayout());
        top.setLayout(new BorderLayout());
        bot.setLayout(new BorderLayout());
        console.setEditable(false);
        console.setFont(new Font("Courier New",Font.PLAIN,14));
        console.setBackground(Color.BLACK);
        console.setForeground(Color.WHITE);
        bot.add(console);
        top.add(btnReply,BorderLayout.EAST);
        top.add(queryline,BorderLayout.CENTER);
        main.add(top,BorderLayout.NORTH);
        main.add(bot,BorderLayout.CENTER);
        add(main);
    }

    private void runServer() throws IOException
    {
        int port = 25000;
        ServerSocket serverSocket = new ServerSocket(port);
        console.setText("Server is Up and listening to the port: "+port+"\n");
        System.out.println("Server is Up and listening to the port: "+port+"\n");

        while(true)
        {
            Thread thread = new Thread(new Handler(socket));
            thread.start();
        }
    }

    public static void main(String args[]) 
    {
        Server f=new Server();
        f.setVisible(true);
        f.setExtendedState(JFrame.MAXIMIZED_BOTH);
        f.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);

        try
        {
            f.runServer();
        }catch(IOException ex)
        {
            //JOptionPane.showMessageDialog(null,ex.getMessage());
        }
    }

    @Override
    public void actionPerformed(ActionEvent e) 
    {

    }
}

class Handler implements Runnable 
{
    private Socket socket;
    public Handler(Socket socket){
        this.socket = socket;
    }

    public void run() 
    {
        // You may need to add a repeat and exit clause here...
        Server f=new Server();
        try
        {
            InputStreamReader ir = new InputStreamReader(socket.getInputStream());
            BufferedReader br = new BufferedReader(ir);
            String message = br.readLine();
            System.out.println(message);
            String[] received=message.split("~");
            f.console.append(received[1]+": requesting for "+received[0]+"\n");
            System.out.println(received[1]+": requesting for "+received[0]+"\n");
        }catch(IOException ex)
        {
            ex.printStackTrace();
        }
    }
}
客户端

public class Branch extends JFrame
{
    private static Socket socket;
    JPanel main=new JPanel();
    JPanel top=new JPanel();
    JPanel bot=new JPanel();
    JButton btnItem=new JButton("item");
    JButton btnGlstock=new JButton("glstock");
    JTextArea console=new JTextArea();
    JScrollPane scrollv=new JScrollPane(console);

    ActionListener item=new ActionListener()
    {
        @Override
        public void actionPerformed(ActionEvent e)
        {
            String ip="";
            String send="";
            try
            {
                ip=InetAddress.getLocalHost().getHostAddress();
                send="item~"+ip;
                request(send);
            }catch(Exception ex)
            {
                JOptionPane.showMessageDialog(null,ex.getMessage());
            }
        }
    };

    ActionListener glstock=new ActionListener()
    {
        @Override
        public void actionPerformed(ActionEvent e)
        {
            String ip="";
            String send="";
            try
            {
                ip=InetAddress.getLocalHost().getHostAddress();
                send="glstock~"+ip;
                request(send);
            }catch(Exception ex)
            {
                JOptionPane.showMessageDialog(null,ex.getMessage());
            }
        }
    };

    private void request(String send)
    {
        try
        {
            OutputStream os = socket.getOutputStream();
            OutputStreamWriter osw = new OutputStreamWriter(os);
            BufferedWriter bw = new BufferedWriter(osw);
            bw.write(send+"\n");
            bw.flush();
        }catch(Exception ex)
        {
            ex.printStackTrace();
        }
    }

    public Branch()
    {
        super("Branch");
        scrollv.setAutoscrolls(true);
        main.setLayout(new BorderLayout());
        top.setLayout(new FlowLayout());
        top.add(btnItem);
        top.add(btnGlstock);
        btnItem.addActionListener(item);
        btnGlstock.addActionListener(glstock);
        bot.setLayout(new BorderLayout());
        console.setEditable(false);
        console.setForeground(Color.white);
        console.setBackground(Color.black);
        bot.add(scrollv,BorderLayout.CENTER);
        main.add(top,BorderLayout.NORTH);
        main.add(bot,BorderLayout.CENTER);
        add(main);
    }

   private void connect2Server() throws IOException
   {
    Timer timer=new Timer(5000,checkPing);

    try
    {
        socket = new Socket(IP,port);
        console.append("You are now Connected to the Server\r\n");
        //timer.start();
        socket.setSoTimeout(5000);
        InputStreamReader isr=new InputStreamReader(socket.getInputStream());
        isr.read();
    }
    catch(SocketTimeoutException ex)
    {
        ex.printStackTrace();
    }
    catch(IOException ex)
    {
        console.append("Server is offline\r\n");
        ex.printStackTrace();
    }
    connect2Server();
  }

    public static void main(String args[]) 
    {
        Branch frame=new Branch();
        frame.setVisible(true);
        frame.setExtendedState(JFrame.MAXIMIZED_BOTH);
        frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        frame.connect2Server();
        frame.connectDatabase();
    }
}
如何持续ping服务器以确定服务器是否已启动

使用某种计时器来安排一次常规回调,并在那里进行测试。ping服务器(在此上下文中)可以简单地尝试与之建立连接

你也可以用

为什么当我点击按钮时服务器只能接收一次

因为服务器不再处理您的连接。看看你的服务器代码

while(true)
{
    //^Reading the message from the client
    // Wait for a NEW client connection
    socket = serverSocket.accept();
    // Process request...
    InputStream is = socket.getInputStream();
    InputStreamReader isr = new InputStreamReader(is);
    BufferedReader br = new BufferedReader(isr);
    String message = br.readLine();
    System.out.println(message);
    String[] received=message.split("~");
    console.append(received[1]+": requesting for "+received[0]+"\n");
    // ... No longer monitoring for new content...
}
serverSocket.accept()正在等待新的客户端连接,而不是监视现有连接

您应该做的是生成某种类型的
线程
,将引用传递给客户机
套接字
连接,并在其自己的循环中处理它…提供超时或可能的退出条件,以便套接字和线程可以关闭

确定服务器何时断开连接

基本上,如果您尝试向服务器(或客户机)发送某些内容,它将抛出某种类型的
异常
,这很好地表明连接由于某种原因已断开

您还可以使用某种计时器定期向服务器发送“健康”检查消息,但是,您需要确保正在同步通信,这样两个(客户端)线程就不会同时尝试发送消息

旁注 发送消息时,当前代码将阻止事件调度线程。当您在本地进行测试时,这可能不是一件大事,但是,根据连接的速度和服务器及时响应的能力,可能会导致您的UI出现“冻结”一两秒钟(或更长时间)

请查看以了解更多详细信息

用示例更新

为了使您的服务器能够处理多个客户端连接,您需要为每个新连接生成一个新线程,例如

private void runServer() throws IOException
{
    int port = 25000;
    ServerSocket serverSocket = new ServerSocket(port);
    console.setText("Server is Up and listening to the port: "+port+"\n");
    System.out.println("Server is Up and listening to the port: "+port+"\n");

    while(true)
    {
        Socket socket = serverSocket.accept();
        Thread thread = new Thread(new Handler(socket));
        thread.start();
    }
}
class Handler implements Runnable 
{
    private Socket socket;
    public Handler(Socket socket){
        this.socket = socket;
    }

    public void run() 
    {
        // You may need to add a repeat and exit clause here...
        try
        {
            boolean keepRunning = true;
            while (keepRunning) {
                InputStreamReader ir = new InputStreamReader(socket.getInputStream());
                BufferedReader br = new BufferedReader(ir);
                String message = br.readLine();
                System.out.println(message);
                String[] received=message.split("~");
                System.out.println(received[1]+": requesting for "+received[0]+"\n");
                // Check for a valid "exit" state and change keepRunning
                // if the client want's to disconnect...
            }
        }catch(IOException ex)
        {
            ex.printStackTrace();
        } finally {
            try {
                if (socket != null) {
                    socket.close();
                }
            } catch (Exception exp) {
            }
        }
    }
}
然后在“客户端套接字处理程序”中,您需要设置一个循环,该循环将一直从客户端套接字读取数据,直到出现错误或客户端请求终止通信,例如

private void runServer() throws IOException
{
    int port = 25000;
    ServerSocket serverSocket = new ServerSocket(port);
    console.setText("Server is Up and listening to the port: "+port+"\n");
    System.out.println("Server is Up and listening to the port: "+port+"\n");

    while(true)
    {
        Socket socket = serverSocket.accept();
        Thread thread = new Thread(new Handler(socket));
        thread.start();
    }
}
class Handler implements Runnable 
{
    private Socket socket;
    public Handler(Socket socket){
        this.socket = socket;
    }

    public void run() 
    {
        // You may need to add a repeat and exit clause here...
        try
        {
            boolean keepRunning = true;
            while (keepRunning) {
                InputStreamReader ir = new InputStreamReader(socket.getInputStream());
                BufferedReader br = new BufferedReader(ir);
                String message = br.readLine();
                System.out.println(message);
                String[] received=message.split("~");
                System.out.println(received[1]+": requesting for "+received[0]+"\n");
                // Check for a valid "exit" state and change keepRunning
                // if the client want's to disconnect...
            }
        }catch(IOException ex)
        {
            ex.printStackTrace();
        } finally {
            try {
                if (socket != null) {
                    socket.close();
                }
            } catch (Exception exp) {
            }
        }
    }
}
另外,请确保正确关闭资源;)

如何持续ping服务器以确定服务器是否已启动

使用某种计时器来安排一次常规回调,并在那里进行测试。ping服务器(在此上下文中)可以简单地尝试与之建立连接

你也可以用

为什么当我点击按钮时服务器只能接收一次

因为服务器不再处理您的连接。看看你的服务器代码

while(true)
{
    //^Reading the message from the client
    // Wait for a NEW client connection
    socket = serverSocket.accept();
    // Process request...
    InputStream is = socket.getInputStream();
    InputStreamReader isr = new InputStreamReader(is);
    BufferedReader br = new BufferedReader(isr);
    String message = br.readLine();
    System.out.println(message);
    String[] received=message.split("~");
    console.append(received[1]+": requesting for "+received[0]+"\n");
    // ... No longer monitoring for new content...
}
serverSocket.accept()正在等待新的客户端连接,而不是监视现有连接

您应该做的是生成某种类型的
线程
,将引用传递给客户机
套接字
连接,并在其自己的循环中处理它…提供超时或可能的退出条件,以便套接字和线程可以关闭

确定服务器何时断开连接

基本上,如果您尝试向服务器(或客户机)发送某些内容,它将抛出某种类型的
异常
,这很好地表明连接由于某种原因已断开

您还可以使用某种计时器定期向服务器发送“健康”检查消息,但是,您需要确保正在同步通信,这样两个(客户端)线程就不会同时尝试发送消息

旁注 发送消息时,当前代码将阻止事件调度线程。当您在本地进行测试时,这可能不是一件大事,但是,根据连接的速度和服务器及时响应的能力,可能会导致您的UI出现“冻结”一两秒钟(或更长时间)

请查看以了解更多详细信息

用示例更新

为了使您的服务器能够处理多个客户端连接,您需要为每个新连接生成一个新线程,例如

private void runServer() throws IOException
{
    int port = 25000;
    ServerSocket serverSocket = new ServerSocket(port);
    console.setText("Server is Up and listening to the port: "+port+"\n");
    System.out.println("Server is Up and listening to the port: "+port+"\n");

    while(true)
    {
        Socket socket = serverSocket.accept();
        Thread thread = new Thread(new Handler(socket));
        thread.start();
    }
}
class Handler implements Runnable 
{
    private Socket socket;
    public Handler(Socket socket){
        this.socket = socket;
    }

    public void run() 
    {
        // You may need to add a repeat and exit clause here...
        try
        {
            boolean keepRunning = true;
            while (keepRunning) {
                InputStreamReader ir = new InputStreamReader(socket.getInputStream());
                BufferedReader br = new BufferedReader(ir);
                String message = br.readLine();
                System.out.println(message);
                String[] received=message.split("~");
                System.out.println(received[1]+": requesting for "+received[0]+"\n");
                // Check for a valid "exit" state and change keepRunning
                // if the client want's to disconnect...
            }
        }catch(IOException ex)
        {
            ex.printStackTrace();
        } finally {
            try {
                if (socket != null) {
                    socket.close();
                }
            } catch (Exception exp) {
            }
        }
    }
}
然后在“客户端套接字处理程序”中,您需要设置一个循环,该循环将一直从客户端套接字读取数据,直到出现错误或客户端请求终止通信,例如

private void runServer() throws IOException
{
    int port = 25000;
    ServerSocket serverSocket = new ServerSocket(port);
    console.setText("Server is Up and listening to the port: "+port+"\n");
    System.out.println("Server is Up and listening to the port: "+port+"\n");

    while(true)
    {
        Socket socket = serverSocket.accept();
        Thread thread = new Thread(new Handler(socket));
        thread.start();
    }
}
class Handler implements Runnable 
{
    private Socket socket;
    public Handler(Socket socket){
        this.socket = socket;
    }

    public void run() 
    {
        // You may need to add a repeat and exit clause here...
        try
        {
            boolean keepRunning = true;
            while (keepRunning) {
                InputStreamReader ir = new InputStreamReader(socket.getInputStream());
                BufferedReader br = new BufferedReader(ir);
                String message = br.readLine();
                System.out.println(message);
                String[] received=message.split("~");
                System.out.println(received[1]+": requesting for "+received[0]+"\n");
                // Check for a valid "exit" state and change keepRunning
                // if the client want's to disconnect...
            }
        }catch(IOException ex)
        {
            ex.printStackTrace();
        } finally {
            try {
                if (socket != null) {
                    socket.close();
                }
            } catch (Exception exp) {
            }
        }
    }
}
另外,请确保正确关闭资源;)

如何持续ping服务器以确定服务器是否已启动

使用某种计时器来安排一次常规回调,并在那里进行测试。ping服务器(在此上下文中)可以简单地尝试与之建立连接

你也可以用

为什么当我点击按钮时服务器只能接收一次

因为服务器不再处理您的连接。看看你的服务器代码

while(true)
{
    //^Reading the message from the client
    // Wait for a NEW client connection
    socket = serverSocket.accept();
    // Process request...
    InputStream is = socket.getInputStream();
    InputStreamReader isr = new InputStreamReader(is);
    BufferedReader br = new BufferedReader(isr);
    String message = br.readLine();
    System.out.println(message);
    String[] received=message.split("~");
    console.append(received[1]+": requesting for "+received[0]+"\n");
    // ... No longer monitoring for new content...
}
serverSocket.accept()正在等待新的客户端连接,而不是监视现有连接

您应该做的是生成某种类型的
线程
,将引用传递给客户机
套接字
连接,并在其自己的循环中处理它…提供