2014-12-01 129 views
1

我是java中服务器概念的全新服务器。我建立了一个非常简单的服务器(大部分是从他的网上复制而来的),我希望它发送的是什么“状态”,但我希望它只发送一次。这是我的代码,它可能更清晰。Java服务器和客户端之间的通信

服务器:

package components; 

import java.io.DataInputStream; 
import java.io.PrintStream; 
import java.io.IOException; 
import java.net.Socket; 
import java.net.ServerSocket; 

public class mainServer { 

    // The server socket. 
    private static ServerSocket serverSocket = null; 
    // The client socket. 
    private static Socket clientSocket = null; 

    // This chat server can accept up to maxClientsCount clients' connections. 
    private static final int maxClientsCount = 3; 
    private static final clientThread[] threads = new clientThread[maxClientsCount]; 

    public static void main(String args[]) { 

    // The default port number. 
    int portNumber = 3333; 
    if (args.length < 1) { 
     System.out 
      .println("Usage: java MultiThreadChatServer <portNumber>\n" 
       + "Now using port number=" + portNumber); 
    } else { 
     portNumber = Integer.valueOf(args[0]).intValue(); 
    } 

    /* 
    * Open a server socket on the portNumber (default 2222). Note that we can 
    * not choose a port less than 1023 if we are not privileged users (root). 
    */ 
    try { 
     serverSocket = new ServerSocket(portNumber); 
    } catch (IOException e) { 
     System.out.println(e); 
    } 

    /* 
    * Create a client socket for each connection and pass it to a new client 
    * thread. 
    */ 
    while (true) { 
     try { 
     clientSocket = serverSocket.accept(); 
     int i = 0; 
     for (i = 0; i < maxClientsCount; i++) { 
      if (threads[i] == null) { 
      (threads[i] = new clientThread(clientSocket, threads)).start(); 
      break; 
      } 
     } 
     if (i == maxClientsCount) { 
      PrintStream os = new PrintStream(clientSocket.getOutputStream()); 
      os.println("Server too busy. Try later."); 
      os.close(); 
      clientSocket.close(); 
     } 
     } catch (IOException e) { 
     System.out.println(e); 
     } 
    } 
    } 
} 

/* 
* The chat client thread. This client thread opens the input and the output 
* streams for a particular client, ask the client's name, informs all the 
* clients connected to the server about the fact that a new client has joined 
* the chat room, and as long as it receive data, echos that data back to all 
* other clients. When a client leaves the chat room this thread informs also 
* all the clients about that and terminates. 
*/ 
class clientThread extends Thread { 

    private DataInputStream is = null; 
    private PrintStream os = null; 
    private Socket clientSocket = null; 
    private final clientThread[] threads; 
    private int maxClientsCount; 

    public clientThread(Socket clientSocket, clientThread[] threads) { 
    this.clientSocket = clientSocket; 
    this.threads = threads; 
    maxClientsCount = threads.length; 
    } 

    public void run() { 
    int maxClientsCount = this.maxClientsCount; 
    clientThread[] threads = this.threads; 

    try { 
     /* 
     * Create input and output streams for this client. 
     */ 
     is = new DataInputStream(clientSocket.getInputStream()); 
     os = new PrintStream(clientSocket.getOutputStream()); 
     os.println("Enter your name."); 

     while (true) { 
     String line = is.readLine(); 
     if (line.startsWith("/quit")) { 
      break; 
     } 
     if (line.startsWith("Home")) { 
      os.println("Server in Home mode"); 
     } 
     if (line.startsWith("Search/Modify")){ 
      System.out.println("Server in search and modify mo"); 
     } 
     } 
     for (int i = 0; i < maxClientsCount; i++) { 
     if (threads[i] != null && threads[i] != this) { 
      threads[i].os.println("*** The user " 
       + " is leaving the chat room !!! ***"); 
     } 
     } 
     os.println("*** Bye " + " ***"); 

     /* 
     * Clean up. Set the current thread variable to null so that a new client 
     * could be accepted by the server. 
     */ 
     for (int i = 0; i < maxClientsCount; i++) { 
     if (threads[i] == this) { 
      threads[i] = null; 
     } 
     } 

     /* 
     * Close the output stream, close the input stream, close the socket. 
     */ 
     is.close(); 
     os.close(); 
     clientSocket.close(); 
    } catch (IOException e) { 
    } 
    } 
} 

主营: 所以此刻它不断通过输出传送流的家里来了,然后服务器返回字符串“的服务器是在家庭的地位”,这是再打印。我怎么才能让它只发送一次,这对我能够检测到我的gui上按下哪个按钮并在服务器发送命令时是有用的。

package components; 

//Import all libraries 
import java.awt.EventQueue; 

public class MainFrame implements Runnable { 
    //declare Jpanel 
    private static JFrame frmHome; 

    // The client socket 
    private static Socket clientSocket = null; 
    // The output stream 
    private static PrintStream os = null; 
    // The input stream 
    private static DataInputStream is = null; 
    private static BufferedReader inputLine = null; 
    private static boolean closed = false; 

    public static void main(String[] args){ 
     // The default port. 
     int portNumber = 3333; 
     // The default host. 
     String host = "localhost"; 

      System.out 
       .println("Usage: java MultiThreadChatClient <host> <portNumber>\n" 
        + "Now using host=" + host + ", portNumber=" + portNumber); 
     /* 
     * Open a socket on a given host and port. Open input and output streams. 
     */ 
     try { 
      clientSocket = new Socket(host, portNumber); 
      inputLine = new BufferedReader(new InputStreamReader(System.in)); 
      os = new PrintStream(clientSocket.getOutputStream()); 
      is = new DataInputStream(clientSocket.getInputStream()); 
     } catch (UnknownHostException e) { 
      System.err.println("Don't know about host " + host); 
     } catch (IOException e) { 
      System.err.println("Couldn't get I/O for the connection to the host " 
       + host); 
     } 

     /* 
     * If everything has been initialized then we want to write some data to the 
     * socket we have opened a connection to on the port portNumber. 
     */ 
     if (clientSocket != null && os != null && is != null) { 
      try { 

      /* Create a thread to read from the server. */ 
      new Thread(new MainFrame()).start(); 
      while (!closed) { 
       os.println("Home"); 
      } 
      /* 
      * Close the output stream, close the input stream, close the socket. 
      */ 
      os.close(); 
      is.close(); 
      clientSocket.close(); 
      } catch (IOException e) { 
      System.err.println("IOException: " + e); 
      } 
     } 
     } 

     /* 
     * Create a thread to read from the server. (non-Javadoc) 
     * 
     * @see java.lang.Runnable#run() 
     */ 
     public void run() { 
     /* 
     * Keep on reading from the socket till we receive "Bye" from the 
     * server. Once we received that then we want to break. 
     */ 
      MainFrame window = new MainFrame(); 
      MainFrame.frmHome.setVisible(true); 
     String responseLine; 
     try { 
      while ((responseLine = is.readLine()) != null) { 
      System.out.println(responseLine); 
      if (responseLine.indexOf("*** Bye") != -1) 
       break; 
      } 
      closed = true; 
     } catch (IOException e) { 
      System.err.println("IOException: " + e); 
     } 
     } 

    public MainFrame() { 
     initialize(); 
    } 

    //function to make window visible 
    void setVisible() { 
     main(null); 
    } 

    private void initialize() { 
     //Initialise Main window with 3 options. 
     frmHome = new JFrame(); 
     frmHome.setTitle("Home"); 
     frmHome.setBounds(100, 100, 300, 372); 
     frmHome.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
     frmHome.getContentPane().setLayout(null); 
     frmHome.setResizable(false); 

     JLabel lblWelcomeToSrs = new JLabel("Welcome to SRS"); 
     lblWelcomeToSrs.setFont(new Font("Tahoma", Font.PLAIN, 14)); 
     lblWelcomeToSrs.setBounds(86, 183, 112, 14); 
     frmHome.getContentPane().add(lblWelcomeToSrs); 

     //initialise all buttons and labels of window. 
     JButton btnAdStu = new JButton("Add a student"); 
     btnAdStu.setBounds(10, 207, 126, 23); 
     btnAdStu.addActionListener(new ActionListener() { 
      public void actionPerformed(ActionEvent arg0) { 
       AddStudentFrame adus; 
       try { 
        adus = new AddStudentFrame(); 
        adus.setVisible(); 
        frmHome.setVisible(false); 
       } catch (ParseException e) { 
        e.printStackTrace(); 
       } 

      } 
     }); 
     frmHome.getContentPane().add(btnAdStu); 

     JButton btnCheckStud = new JButton("Search/Modify"); 
     btnCheckStud.setBounds(146, 207, 127, 23); 
     btnCheckStud.addActionListener(new ActionListener() { 
      public void actionPerformed(ActionEvent arg0) { 
       SearchFrame searchFrame; 
       searchFrame = new SearchFrame(); 
       searchFrame.setVisible(); 
      } 
     }); 
     frmHome.getContentPane().add(btnCheckStud); 

     JLabel lblNewLabel = new JLabel(""); 
     lblNewLabel.setBounds(0, 0, 0, 0); 
     frmHome.getContentPane().add(lblNewLabel); 

     JLabel lblCreatedByRmi = new JLabel("Created by R\u00E9mi Tuyaerts"); 
     lblCreatedByRmi.setBounds(147, 318, 184, 14); 
     frmHome.getContentPane().add(lblCreatedByRmi); 

     JButton btnNewButton = new JButton("Complete List of Students"); 
     btnNewButton.addActionListener(new ActionListener() { 
      public void actionPerformed(ActionEvent arg0) { 
       CompleteListFrame studentList = new CompleteListFrame(); 
       frmHome.setVisible(false); 
       studentList.setVisible(); 
      } 
     }); 
     btnNewButton.setBounds(52, 241, 184, 23); 
     frmHome.getContentPane().add(btnNewButton); 

     // Button to set up the database 
     JButton btnFillInDatabase = new JButton("Fill in database"); 
     btnFillInDatabase.addActionListener(new ActionListener() { 
      public void actionPerformed(ActionEvent arg0) { 
       StudentStoring.student1(); 
       StudentStoring.student2(); 
       StudentStoring.student3(); 
       StudentStoring.student4(); 
      } 
     }); 
     btnFillInDatabase.setBounds(80, 276, 126, 23); 
     frmHome.getContentPane().add(btnFillInDatabase); 

     // wonderful pictures of his excellence design by Yasser 
     JLabel lblNewLabel_1 = new JLabel(""); 
     Image img = new ImageIcon(frmHome.getClass().getResource("/michaelchung.jpg")).getImage(); 
     lblNewLabel_1.setIcon(new ImageIcon(img)); 
     lblNewLabel_1.setBounds(80, 11, 120, 148); 
     frmHome.getContentPane().add(lblNewLabel_1); 
    } 
} 
+1

'while(!closed){'等待用户输入然后发送给服务器'}'。 – jhamon 2014-12-01 16:45:13

+0

但我没有试图得到任何输入它真的只是一个状态,我想发送或只是一个按钮被点击的事实 – Tuytuy 2014-12-01 16:46:55

+0

然后不要把发送在循环 – 2014-12-01 16:47:16

回答

1

您必须决定是否要使用单个连接来回传输多个消息,或者是否要为每条消息建立新连接。

要保持单一连接,只需打开套接字(在客户端)并将其保存在某处。不要close()它,直到你实际上不再需要连接。

如果你想使用每封邮件一个连接,通过close()有效信令消息的结尾,你应该在那边被关闭连接使用setSoLinger()。这将使对方有时间读取任何待处理的数据,检测数据的结束并准备对话结束,而不会遇到“套接字关闭”异常。

相关问题