Java服务器未从客户端接收数据

时间:2013-07-10 13:42:03

标签: java swing sockets networking event-dispatch-thread

它应该在join按钮单击时将数据发送到服务器,但它不会将数据发送到服务器,也不会在控制台中打印消息。为什么?

服务器

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

客户端

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

}

2 个答案:

答案 0 :(得分:0)

我注意到在start()方法下的ServerView下你永远不会这样做

 this.serverButton.setActionCommand("join");

但你这样做是为了开始和停止。也许这有点与为什么连接不能正常工作有关,因为你稍后在ServerController

中有这个
else if(e.getActionCommand()=="join")
    {
        this.join();
    }

答案 1 :(得分:0)

您的服务器正在运行吗?

看起来serverOnline初始化为false,所以当你到达

while(serverOnline) 

它立即失败并继续,在finally块中设置为true。如果您此时再次“启动”服务器,它应该开始等待连接,但看起来您的UI将要求您首先点击“停止”,这会将serverOnline设置为false。在Server.start()的开头添加一行,将serverOnline设置为true,它应该可以工作。

与实际运行服务器无关的两个建议:

1)在Server.close()中你正在关闭套接字。我会将它移动到Server.start()中的finally块,以便您的套接字可以在强制关闭之前完成它所拥有的任何连接

2)ServerView的构造函数中有一点,“server”拼写为“serever”。哎呀! : - )