0

我有一个服务器和client.java,它可以通过输入和输出流双向发送和接受消息,但是一旦有连接,就会发送一条消息,然后服务器关闭它自己,到目前为止,我已经放置了缓冲阅读器等等。在一个 finally 块中,该块仅在 e == true 时激活(e 表示退出,因此我可以在需要时停止它)但在发送/接收消息后它仍然停止构建第一个问题如何阻止它关闭它自己?第二个问题如何将输入流阅读器放入循环中以不断测试来自 client.java 的输入?

客户端.java

package client;

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

    // Variables declaration - do not modify                     
/**
 *
 * @author ****
 */
public class Client extends javax.swing.JFrame {

;

    public Client() {
        initComponents();
    }
    private void jTextField1ActionPerformed(java.awt.event.ActionEvent evt) {                                            
    jTextField1.setText("");
    input = jTextField1.getText();
    send(input);     
    }                                           
    int port = 1234;
    String hostname = "localhost";
    String input,output;

    public void send(String text) {   
    try {
         Socket skt = new Socket(hostname, port);           /*Connects to server*/

         BufferedReader in = new BufferedReader(new
         InputStreamReader(skt.getInputStream()));          /*Reads from server*/
         System.out.println("Server:" + in.readLine());

         PrintWriter out = new PrintWriter(skt.getOutputStream(), true);
         out.println(text);                                   /*Writes to server*/
         out.close();    /*Closes all*/
         in.close();
         skt.close();

      }
      catch(Exception e) {
         System.out.print("Error Connecting to Server\n");
      } 
    }
    public void startUP() {

    }
    public static void main(String args[]) {
     Client c = new Client();
     c.startUP();
     c.send("Server is online");
      new Client().setVisible(true);

   }


    // Variables declaration - do not modify                     
    private javax.swing.JScrollPane jScrollPane1;
    private javax.swing.JTextArea jTextArea1;
    private javax.swing.JTextField jTextField1;
    // End of variables declaration                   
}

服务器.java

package server;

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

class Server {
    /*
     To send string to client use "out.print(data)"
     To use info sent from client use "in.readLine()"
     */
        int port = 1234;
    String input,output;
    boolean e = false;
    String question = "how are you";
    String answer = "i am fine";

    public void send(String text) {
        ServerSocket srvr = null;
        Socket skt = null;
         PrintWriter out = null;
         BufferedReader in = null;
    try {
         srvr = new ServerSocket(port);
         skt = srvr.accept();                       /*Waiting for Connection from client*/
         System.out.println("Connection = true");

         out = new PrintWriter(skt.getOutputStream(), true);
         out.println(text);                                                  /*Write/Send to Client*/

         in = new BufferedReader(new
         InputStreamReader(skt.getInputStream()));                   /*Read from Client*/
         System.out.println("Client:" + in.readLine());
         input = in.readLine();

      } catch( Exception e) {
         System.out.println("Error Connecting\n");
      } finally {
        if(e == true){
        try {
         out.close();
         in.close();
         skt.close();               /*Closes all*/
         srvr.close();

         } catch (IOException e) {
        }
    }
    }
    }

public void testFor() {
    if(input.equals(question)){ send(answer); }
}

   public static void main(String args[]) {
       Server s = new Server();

       s.send("Client is online");  //sends a message to client
      // s.testFor();

   }
}
4

2 回答 2

1

好的开始,停止一个while循环,在某些时候你必须说这个陈述是假的或真的(取决于你首先使用什么)。所以,如果你说while(true)。这将永远是正确的,因为没有什么可比较的,因此它将创建无限循环,永远持续下去。但是,如果您说我们做类似的事情

 `while(x=true)'
  {
     x=false;
  }

这将确保您停止 while 循环并且您不会再次输入它。如何?好吧,我们在 x 为真的条件下进入 while 循环。一旦我们进入那个循环,我们就声明 x 为假。因此在下一次迭代中 x 将为假,因此我们不会进入 while 循环。有点直截了当,不是吗?
至于问题本身,我建议阅读这篇文章。它非常清晰且布局合理,它将向您展示如何编写好的基于套接字的程序:)

于 2013-04-01T00:44:52.013 回答
0

第一个问题是从方法中调用 bufferreader、printwriter 等,然后在可以随时激活的单独方法中使用 .close。

对于我的第二个问题,我发现我可以使用 while 循环:

    while(true) {
//code...
    }

谢谢没人帮忙。

于 2013-03-31T20:28:08.033 回答