2013-07-10 2 views
0

Он должен отправлять данные на сервер, когда кнопка join нажимает кнопку, но не передает данные на сервер и не выводит сообщение на консоль. Зачем?Сервер Java не получает данные от клиента

Сервер

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

} 
+1

, потому что у вас возникла проблема с событием Dispatch Thread, описанным в учебнике Oracle. Совместимость в Swing, Swing GUI не волнует, не уведомляется каким-то образом о том, что фоновый процесс что-то изменить из EDT – mKorbel

+0

@mkorbel как разрешить это? – varuog

+0

@mKorbel правильно; есть полный пример [здесь] (http://stackoverflow.com/a/3245805/230513). – trashgod

ответ

0

Работает ли ваш сервер?

Похоже serverOnline инициализирует ложь, поэтому, когда вы получаете

while(serverOnline) 

немедленно терпит неудачу и продолжает, где она установлена ​​истина в конце концов блока. Если вы снова должны «запустить» сервер в этот момент, он должен начать ждать соединений, но похоже, что ваш пользовательский интерфейс потребует, чтобы вы сначала нажали «остановить», что установит serverOnline на false. Добавьте строку в начало Server.start(), которая устанавливает serverOnline в true, и она должна работать.

Два предложения не связанные с фактически получить сервер для запуска:

1) в server.close() вы закрываете свой сокет. Я переместил бы это на блок finally в Server.start(), чтобы ваш сокет мог завершить все подключенные ему соединения до того, как он был закрыт.

2) В конструкторе ServerView есть точка, где «сервер» пишется «serever ». К сожалению! :-)

0

я заметил под ServerView по методу запуска() вы никогда не сделать это

this.serverButton.setActionCommand("join"); 

но вы делаете это для запуска и остановки. Может быть, это немного связано с тем, почему соединение не работает должным образом, поскольку у вас есть это позже в ServerController

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

О, и я хотел спросить ... Все ли работает, но кнопка соединения? Ваш вопрос заставляет задуматься, что это единственное, что не работает. – booleanCube

Смежные вопросы