Java:如何启动客户端或服务器,取决于服务器是否已启动?

时间:2020-01-20 18:47:21

标签: java sockets tcp server client

我用Arrays表示的比赛场编码了一个游戏。我现在实现了两个类,分别称为“客户端”和“服务器”,客户端具有一个“发送”按钮。服务器具有一个textarea,其中发送的数据(在我的情况下为Array Object)显示为字符串<-两者都用于测试。发送数据工作正常,我想将我的游戏与其连接。目前,这目前仅以一种方式起作用,客户端->服务器,我稍后将实现2种方式的连接。

我的问题:如果游戏开始,我希望第一个连接的玩家充当主机/服务器,并因此初始化服务器。如果第二个人随后在他的PC上开始游戏,则他需要作为已运行服务器的客户端进行连接。如何检查服务器是否已经在运行,因此要为第二个播放器创建客户端实例?

预先感谢!

我为客户提供的代码:

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 :(得分:0)

一些伪代码:

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