Java 检查服务器上的客户端套接字是否已关闭
如何在服务器端检查客户端是否关闭了套接字 我有一台服务器,它等待连接,然后向客户端返回10条消息:Java 检查服务器上的客户端套接字是否已关闭,java,sockets,Java,Sockets,如何在服务器端检查客户端是否关闭了套接字 我有一台服务器,它等待连接,然后向客户端返回10条消息: public class SocketServidor { static ServerSocket serverSocket; public static void main(String[] args) throws Exception { serverSocket = new ServerSocket(5963); while(true) {
public class SocketServidor {
static ServerSocket serverSocket;
public static void main(String[] args) throws Exception {
serverSocket = new ServerSocket(5963);
while(true) {
final Socket socket = serverSocket.accept();
new Thread(() -> {
try {
PrintWriter out = new PrintWriter(socket.getOutputStream());
for (int i = 0; i < 10; i++) {
int valor = (int) (Math.random() * 5) + 1;
out.println("Você acabou de ganhar R$ "+new DecimalFormat("###,##0.00").format(valor)+"!");
out.flush();
Thread.sleep(valor*1000);
}
socket.close();
} catch (Exception ex) {
Logger.getLogger(SocketServidor.class.getName()).log(Level.SEVERE, null, ex);
}
}).start();
}
}
}
问题是,即使在第五次读取之后,当客户端关闭套接字时,服务器仍会继续向客户端发送消息。当客户端关闭服务器端的套接字时,如何关闭服务器端的套接字?PrintWriter.flush()会抑制该异常 您看不到异常,因为PrintWriter.flush()抑制了该异常。要检查
PrintWriter.println()
之后的错误状态,可以使用PrintWriter.checkError()
而不是flush()
。或者,您可以使用OutputStreamWriter
而不是PrintWriter
,这样就不会抑制执行serverSocket = new ServerSocket(5963);
while(true) {
final Socket socket = serverSocket.accept();
new Thread(() -> {
try {
PrintWriter out = new PrintWriter(socket.getOutputStream());
for (int i = 0; i < 10; i++) {
int valor = (int) (Math.random() * 5) + 1;
out.println("Você acabou de ganhar R$ "+new DecimalFormat("###,##0.00").format(valor)+"!");
//out.flush();
if(out.checkError()){
System.out.println("Error. Break");
break;
}
Thread.sleep(valor*1000);
}
socket.close();
} catch (Exception ex) {
ex.printStackTrace();
}
}).start();
}
serverSocket=新的serverSocket(5963);
while(true){
最终套接字=serverSocket.accept();
新线程(()->{
试一试{
PrintWriter out=新的PrintWriter(socket.getOutputStream());
对于(int i=0;i<10;i++){
intvalor=(int)(Math.random()*5)+1;
out.println(“Voc#acabou de ganhar R$”+新的十进制格式(“0.00”)。格式(valor)+“!”;
//out.flush();
if(out.checkError()){
System.out.println(“Error.Break”);
打破
}
线程。睡眠(valor*1000);
}
socket.close();
}捕获(例外情况除外){
例如printStackTrace();
}
}).start();
}
serverSocket = new ServerSocket(5963);
while(true) {
final Socket socket = serverSocket.accept();
new Thread(() -> {
try {
Writer out = new OutputStreamWriter(socket.getOutputStream());
for (int i = 0; i < 10; i++) {
int valor = (int) (Math.random() * 5) + 1;
out.write("Você acabou de ganhar R$ "+new DecimalFormat("###,##0.00").format(valor)+"!");
out.write("\r\n");
out.flush();
Thread.sleep(valor*1000);
}
socket.close();
} catch (Exception ex) {
ex.printStackTrace();
}
}).start();
}
serverSocket=新的serverSocket(5963);
while(true){
最终套接字=serverSocket.accept();
新线程(()->{
试一试{
Writer out=新的OutputStreamWriter(socket.getOutputStream());
对于(int i=0;i<10;i++){
intvalor=(int)(Math.random()*5)+1;
输出。写入(“Voc#acabou de ganhar R$”+新的十进制格式(“0.00”)。格式(valor)+“!”;
out.write(“\r\n”);
out.flush();
线程。睡眠(valor*1000);
}
socket.close();
}捕获(例外情况除外){
例如printStackTrace();
}
}).start();
}
在这里检查我的答案,我看不出在服务器端使用循环的原因。为什么不将这个循环移动到客户端,让客户端定期向服务器请求数据?
serverSocket = new ServerSocket(5963);
while(true) {
final Socket socket = serverSocket.accept();
new Thread(() -> {
try {
Writer out = new OutputStreamWriter(socket.getOutputStream());
for (int i = 0; i < 10; i++) {
int valor = (int) (Math.random() * 5) + 1;
out.write("Você acabou de ganhar R$ "+new DecimalFormat("###,##0.00").format(valor)+"!");
out.write("\r\n");
out.flush();
Thread.sleep(valor*1000);
}
socket.close();
} catch (Exception ex) {
ex.printStackTrace();
}
}).start();
}