简体   繁体   中英

Java server is not recieving data from client

It should send data to server when join button clicks but it does not send the data to server and does not print the message in console. why?

Server

package clientServer;
import java.net.*;
import java.io.*;

public class Server {
    private ServerView view;



    private boolean serverOnline=false;
    private ServerSocket server;
    private InputStream serverInStream;

    public Server(ServerView view)
    {
        this.view=view;
    }


    public void start()
    {
        //Manipulate model
        System.out.println("Server is started");
        //Optionally update view


        Socket listenPort;
        try
        {
            this.server=new ServerSocket(13131);

            while(this.serverOnline)
            {
                listenPort=this.server.accept();

                this.serverInStream=listenPort.getInputStream();

                BufferedReader bfw=new BufferedReader(new InputStreamReader(this.serverInStream));
                System.out.println(bfw.readLine());

        this.serverInStream.close();

            }
        }
        catch(IOException e)
        {
            System.err.println(e);
        }
        finally
        {
            this.serverOnline=true;
        }
    }

    public void stop()
    {
        try
        {
        this.serverOnline=false;
        this.server.close();
        }
        catch(IOException e)
        {
            System.err.println("Problem in stopping server" + e);
        }
        finally
        {
            System.out.println("Server has been stopped");
        }
    }

}

ServerView

package clientServer;

import javax.swing.*;
import java.awt.*;

public class ServerView {

    private JFrame window;
    private Container holder;
    private JButton serverButton;
    private JLabel label;
    private JPanel panel;
    private JButton serverJoinButton;
    private ServerController controller;

    public ServerView(ServerController controller) {
        this.controller = controller;
        this.window = new JFrame("Twenty nine");

        this.panel = new JPanel();
        this.holder = this.window.getContentPane();

        this.serverButton = new JButton("start");
        this.serverButton.setActionCommand("start");
        this.serverButton.addActionListener(this.controller);

        this.label = new JLabel("Serever is offline");

        this.holder.add(this.panel);

        this.panel.add(this.label);
        this.panel.add(this.serverButton);

        this.window.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        this.window.setSize(800, 900);
        // this.window.setLayout(new BorderLayout());
        this.window.setVisible(true);

    }

    public void start() {
        this.label.setText("Server is online");
        this.serverButton.setActionCommand("stop");
        this.serverButton.setText("stop");

        //Adds join buttton
        this.serverJoinButton = new JButton("Join");
        this.serverJoinButton.setText("join");
        this.serverJoinButton.addActionListener(this.controller);

        this.panel.add(this.serverJoinButton);
        //this.panel.repaint();
        this.panel.revalidate();
    }

    public void stop()
    { 
        this.label.setText("Server is offline");
        this.serverButton.setActionCommand("start");
        this.serverButton.setText("start");

        this.panel.remove(this.serverJoinButton);

        this.panel.repaint(); //Adding works properly removing dont
        this.panel.revalidate();
    }
}

ServerController

package clientServer;

import java.awt.event.*;

public class ServerController implements ActionListener {

    private Server model;
    private ServerView view;

    public void setModel(Server server) {
        this.model = server;

    }

    public void setView(ServerView view) {
        this.view = view;

    }

    public void actionPerformed(ActionEvent e) {
        if(e.getActionCommand()=="start")
        {
            this.start();
        } 
        else if(e.getActionCommand()=="stop")
        {
            this.stop();
        }
        else if(e.getActionCommand()=="join")
        {
            this.join();
        }

    }

    public void start() {
        //Reponse to event immidiately
        this.view.start();
        //Response and manipulate model
        //Should start a new thread instead of using swing eventDispatch thread
        this.model.start();
    }
    public void stop() {
        //Reponse to event immidiately
        this.view.stop();
        //Response and manipulate model
        this.model.stop();
    }
    public void join()
    {
        System.out.println("Client tries to connect");
        Client cl=new Client();
        cl.join();
    }
}

Client

package clientServer;

import java.net.*;
import java.io.*;

public class Client {

    private Socket socket;

    public Client()
    {
        try
        {
        this.socket=new Socket("127.0.0.1",13131);
        }
        catch(UnknownHostException e)
        {
            System.err.println(e);
        }
        catch(IOException e)
        {
            System.err.println(e);
        }
    }

    public void join()
    {
        System.out.println("Client join called");
        System.out.println("Client socket is connected:" + this.socket.isConnected());
        try
        {
        OutputStream op=this.socket.getOutputStream();

        BufferedWriter bfw=new BufferedWriter(new OutputStreamWriter(op));
        bfw.write("Client is connected \n");

        bfw.close();
        }
        catch(IOException e)
        {
            System.err.println(e);
        }
    }

}

I noticed under ServerView under the start() method you never do this

 this.serverButton.setActionCommand("join");

but you do do this for start and stop. Maybe that has a bit to do with why the join isn't working properly since you have this later in ServerController

else if(e.getActionCommand()=="join")
    {
        this.join();
    }

Is your server running?

It looks like serverOnline initializes to false, so when you get to

while(serverOnline) 

It immediately fails and continues on, where it is set to true in the finally block. If you were to "start" the server again at this point it should begin waiting for connections, but it looks like your UI will require you to hit "stop" first, which will set serverOnline to false. Add a line to the beginning of Server.start() that sets serverOnline to true and it should work.

Two suggestions not related to actually getting your server to run:

1) in Server.close() you are closing your socket. I would move that to the finally block in Server.start() so that your socket can finish up any connections it has before being forced to close

2) There's a point in ServerView's constructor where "server" is spelled "serever". Oops! :-)

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM