我有一个服务器和client.java,可以通过输入和输出流两种方式发送和接收消息但是只要有连接就会发送消息,然后服务器关闭它自己,到目前为止我放了缓冲的读者等。在一个finally块中,只有当e == true时才激活(e表示退出,所以我可以在需要时停止它)但是它仍然在发送/接收消息后停止构建 第一个问题我怎么能阻止它关闭自己? 第二个问题如何将输入流阅读器放在循环中以持续测试来自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 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
}
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();
}
}
答案 0 :(得分:1)
好的开始,停止while循环,在某些时候你必须说该语句是假的或真的(取决于你在第一个地方使用的)。那么,如果你说while(true)
。这将永远是真实的,因为没有什么可比较,因此它将永远创造无限循环。但是,如果你说我们做了类似的事情
`while(x=true)'
{
x=false;
}
这将确保您停止while循环,并且不会再次输入。怎么样?好吧,我们进入while循环,条件是x是真的。一旦我们进入该循环,我们声明x为false。因此,在下一次迭代中,x将为false,因此我们不会进入while循环。有点直接不是吗? 至于它自身的问题,我建议阅读THIS文章。它非常清晰,布局合理,它将向您展示如何编写基于套接字的好程序:)
答案 1 :(得分:0)
第一个问题是调用bufferreader,printwriter等..然后在一个单独的方法中使用.close,可以随时激活。
对于我的第二个问题,我发现我可以使用while循环:
while(true) {
//code...
}
感谢没有人的帮助。