我有一个服务器和client.java,可以通过输入和输出流两种方式发送和接受消息,但一旦有连接发送消息,然后服务器关闭自己,到目前为止我已经把缓冲阅读器等。在finally块中,只有当e == true (e为退出,所以我可以在我想要的时候停止它)时才激活,但它仍然在发送/接收消息后停止构建第一个问题,我怎样才能阻止它自我关闭?第二个问题我怎么能把输入流阅读器在一个循环中不断地测试从client.java输入?
Client.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 Servern");
}
}
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
}
Server.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 Connectingn");
} 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();
}
}
要开始,要停止while循环,在某些时候你必须说语句是假还是真(取决于你首先使用的是什么)。所以如果你说while(true)
。这将永远是真的,因为没有什么可以比较的,因此它将创建无限循环,永远持续下去。但是如果你说我们这样做
`while(x=true)'
{
x=false;
}
这将确保您停止while循环并且不会再次进入它。如何?我们在x为真的条件下进入while循环。一旦进入循环,我们就声明x为假。因此,在下一次迭代中,x将为假,因此我们将不会进入while循环。有点直接,不是吗?
至于问题本身,我建议阅读这篇文章。它非常清晰,布局很好,它将向您展示如何编写良好的基于套接字的程序:)
第一个问题是调用缓冲区读取器、打印机等。在这些方法之外,在一个可以随时激活的单独方法中使用.close。
对于我的第二个问题,我发现我可以使用while循环: while(true) {
//code...
}
谢谢大家的帮助。