我有一个与客户端通信的服务器。
服务器是多线程的,当从套接字读取的第一行是“请求”时,该线程是使用套接字和连接到套接字的缓冲读取器创建的:
public class scriptComm implements Runnable {
private Socket sock;
private Socket sock2;
private Connection connection;
private BufferedReader reader;
@Override
public void run() {
try {
String name = reader.readLine();
String password = reader.readLine();
String line;
connection = methods.connectToDatabase();
BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(sock.getOutputStream()));
if (connection != null && name != null && password != null) {
try {
ResultSet rs = connection.createStatement().executeQuery(
"SELECT name, password, doupdate FROM accounts "
+ "WHERE name = '" + name + "' AND doupdate = 'yes'"
+ " AND password = '" + password + "'");
if (rs.next()) {
methods.log("worked");
bw.write("accept");
bw.flush();
bw.close();
reader = new BufferedReader(new InputStreamReader(sock2.getInputStream()));
if ((line = reader.readLine()) != null) {
mainFrame.jTextArea1.append("line \n");
connection.createStatement().executeUpdate(
"UPDATE accounts SET updatetext = '" + line + "' "
+ "WHERE name = '" + name + "'");
}else{
mainFrame.jTextArea1.append("No text received \n");
}
} else {
bw.write("decline");
bw.flush();
}
bw.close();
rs.close();
} catch (SQLException ex) {
methods.log("Error when executing statement in scriptComm");
ex.printStackTrace();
} catch (IOException ex) {
ex.printStackTrace();
}
} else {
methods.log("missing values in scriptComm");
}
} catch (IOException ex) {
}
}
public scriptComm(Socket sock, BufferedReader reader) {
this.sock = sock;
this.sock2 = sock;
this.reader = reader;
}}
您可能会注意到我在写入“接受”后关闭了 bw 流。
这是因为当流没有关闭时,客户端只是挂在那里,就好像它没有收到任何输入一样。
客户端:
try{
String line;
Socket sock = new Socket("myipaddresshere",portnumber);
PrintWriter writer = new PrintWriter(sock.getOutputStream());
BufferedReader reader = new BufferedReader(new InputStreamReader(sock.getInputStream()));
writer.println("script");
writer.flush();
writer.println(jTextField1.getText());
writer.flush();
writer.println(jTextField2.getText());
writer.flush();
if ((reader.readLine()).equals("accept")) {
writer.write("testing123");
writer.flush();
writer.close();
} else {
jTextArea1.append("fail");
}
reader.close();
writer.close();
}catch(IOException e){
jTextArea1.append("Server not available. Please try again later.");
}
当从服务器写入“accept”后流没有关闭时,就好像客户端只是坐在 if(reader.readLine().equals("accept")) 布尔检查(是的,流被刷新服务器-边 )。
但是,当流也在服务器端关闭时,它会通过布尔检查并继续将“testing123”行写入流。服务器显然无法读取此行,因为当 BufferedReader 关闭时套接字流已关闭。正如您可能注意到的,我尝试通过简单地创建另一个名为 sock2 的变量来复制套接字,但似乎这个连接也关闭了(有道理)。
注意:当使用错误的用户/密码连接时(即当 rs.next() 返回 false 时),它会将“拒绝”写入流并且客户端会得到这个。
真的很纠结这个。。
谢谢,迈克。