Java: Как запустить клиент или сервер, в зависимости от того, запущен ли уже сервер? - PullRequest
0 голосов
/ 20 января 2020

я кодировал игру с игровым полем, представленным в массивах. Я теперь реализовал 2 класса, называемых клиентом и сервером, у клиента есть кнопка «отправить». На сервере есть текстовое поле, в котором отправляемые данные, в моем случае объект массива, отображаются в виде строки <-both для тестирования прямо сейчас. Отправка данных работает нормально, и я хочу подключить к нему свою игру. В настоящее время это работает только в одном направлении. Клиент-> Сервер, позже я реализую двухстороннее соединение.

Моя проблема: я хочу, чтобы первый игрок подключился, действовал как хост / сервер и, следовательно, инициализировал сервер, если игра запущена Если второй человек запускает игру на своем p c впоследствии, он должен подключиться как клиент к уже запущенному серверу. Как проверить, запущен ли сервер, и, следовательно, создать экземпляр клиента для второго игрока?

Заранее спасибо!

Мой код для клиента:

package connect4;

import javax.swing.*;

import java.net.*;

import java.awt.event.*;
import java.io.DataOutputStream;
import java.io.IOException;
import java.io.ObjectOutputStream;

public class ClientTest {

    static protected ObjectOutputStream myoutput;


     public static void main(String[] args) {

      ClientTest client = new ClientTest();

          //test
       }



public ClientTest() {
    System.out.println("Client is connected");
    Window window1=new Window();

        window1.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
}
class Window extends JFrame{

    public Window(){

        setBounds(600,300,280,350);

        WindowClient winClient=new WindowClient();

        add(winClient);

        setVisible(true);
        }   

}

class WindowClient extends JPanel{

    public WindowClient(){

        JLabel text=new JLabel("CLIENT");

        add(text);





        mybutton=new JButton("Send");

        SendText textfield= new SendText();

        mybutton.addActionListener(textfield);

        add(mybutton);  

    }

private class SendText implements ActionListener{



        public void actionPerformed(ActionEvent e) {
            //System.out.println(campo1.getText());
            try {
                Socket mysocket=new Socket("localhost",9999);
                System.out.println("Data was sent..");
                ObjectOutputStream myoutput = new ObjectOutputStream(mysocket.getOutputStream());   

                myoutput.writeObject(GridTest.gamefield);

                myoutput.close();

            } catch (UnknownHostException e1) {
                // TODO Auto-generated catch block
                e1.printStackTrace();
            } catch (IOException e1) {
                // TODO Auto-generated catch block
                System.out.println(e1.getMessage());
            }// meine IP und eine freie Port
        }
    }


        //asd

private JTextField field1;

private JButton mybutton;

}}

Мой код для сервера:

package connect4;
import javax.swing.*;
import java.net.*;

import java.awt.*;
import java.io.*;

public class ServerTest  {
    private static char [][] spot = new char [6][7];
    static boolean connected;


    public static void main(String[] args) {
        // TODO Auto-generated method stub

    ServerTest server = new ServerTest();

    }   



public ServerTest() {
    WindowServer mywindow=new WindowServer();

    mywindow.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
}
class WindowServer extends JFrame implements Runnable  {

    public WindowServer(){

        setBounds(1200,300,280,350);                

        JPanel newpanel= new JPanel();

        newpanel.setLayout(new BorderLayout());

        textarea=new JTextArea();

        newpanel.add(textarea,BorderLayout.CENTER);

        add(newpanel);

        setVisible(true);

        Thread mythread = new Thread(this);

        mythread.start();

        }

    private JTextArea textarea;



    @Override
    public void run() {

        try {
            ServerSocket server=new ServerSocket(9999);//port öfnnen listen und Verbindungen akzeptieren

            while(true) {
            Socket mysocket= server.accept();

            ObjectInputStream myinput=new ObjectInputStream(mysocket.getInputStream());

            Object mymessage = myinput.readObject();

            textarea.append("\n" + mymessage);
            System.out.println(mymessage);
            System.out.println("Data recieved...");
            mysocket.close();
            }
        } catch (IOException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        } catch (ClassNotFoundException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }
    }
}}

1 Ответ

0 голосов
/ 21 января 2020

Какой-то псевдокод:

class ServerClient {
    try {
        connect(remoteServerCredentials);
    } catch (java.io.SocketException exception) {
        //  print failed to connect Starting up as server
        //  Start up the Server()
    }
}
...