[英]Socket java disconnect
我做了这个程序,我有一个问题。 当客户端断开服务器崩溃时,我不知道如何解决此问题。
import java.io.*;
import java.net.*;
public class clientread extends Thread{
Socket sc;
public int ver=0;
public clientread(Socket sc)
{
this.sc=sc;
}
public void run()
{ BufferedReader buf=new BufferedReader(new InputStreamReader(System.in));
while(true){
try{
String mes=buf.readLine();
if(mes.equals("END"))
{
sc.close();
break;
}
if(mes!=null)
{
PrintStream ps=new PrintStream(sc.getOutputStream());
ps.println(mes);
}
}
catch(Exception e)
{
e.printStackTrace();
}
}
}
}
import java.net.*;
import java.io.*;
public class citireserver extends Thread{
Socket sock;
public citireserver(Socket sr)
{
sock=sr;
}
public void run()
{
while(true)
{
try{
BufferedReader buf=new BufferedReader(new InputStreamReader(sock.getInputStream()));
String mes=buf.readLine();
if(mes!=null)
System.out.println(mes);
}
catch(Exception e)
{
e.printStackTrace();
}
}
}
}
第一个从键盘读取一条消息并将其发送到服务器,服务器将其发送到其余的客户端,第二个从服务器读取所有消息并进行打印。 我以为在第一类中放置一个条件,即如果客户端输入“ END”,它将终止,但不知道结束所有这些条件。 这是访问这两个类的客户端类
import java.net.*;
public class client {
public static void disc(Socket sc)
{
try{
sc.close();
}
catch(Exception e)
{
e.printStackTrace();
}
}
public static void main(String[] args) {
try{
Socket sr=new Socket("192.168.0.105",1028);
new clientread(sr).start();
new citireserver(sr).start();
}
catch(Exception e)
{
e.printStackTrace();
}
}
}
import java.net.*;
public class server {
/**
* @param args
*/
public static void main(String[] args) {
System.out.println("the server is running");
try{
ServerSocket sr=new ServerSocket(1028,100);
while(true)
{
new handler(sr.accept()).start();
}
}
catch(Exception e)
{
e.printStackTrace();
}
}
}
import java.io.*;
import java.util.*;
import java.net.*;
public class handler extends Thread {
public static ArrayList<Socket> sock=new ArrayList<Socket>();
Socket sc;
public handler(Socket sc)
{
this.sc=sc;
}
public void check()
{
if(!sc.isConnected())
{
for(int i=0;i<sock.size();i++)
if(sock.get(i)==sc)
sock.remove(i);
}
}
public void run()
{
sock.add(sc);
System.out.println("connected");
while(true)
{
try{
BufferedReader io=new BufferedReader(new InputStreamReader(sc.getInputStream()));
String ms=io.readLine();
System.out.println(ms);
if(ms.equals("END"))
{
break;
}
if(ms!=null)
{
Iterator<Socket> it=sock.iterator();
while(it.hasNext())
{
Socket vv=it.next();
PrintStream ps=new PrintStream (vv.getOutputStream());
ps.println(ms);
}
}
}
catch(Exception e)
{
e.printStackTrace();
}
}
try{
sc.close();
check();
}
catch(Exception e)
{
e.printStackTrace();
}
}
}
我想把if如果放在buf.readline之后的第一类中,并且如果条件为true,那么sc.close并中断。 但是它什么也没做,我可能会收到一条消息,可能是因为该套接字在第二类的另一个线程中使用,而且我不知道如何停止所有这些。 我在关闭的客户端中收到此错误
java.net.SocketException:套接字在citireserver.run(citireserver.java:15)处的java.net.Socket.getInputStream(Socket.java:876)关闭
编辑:我与线程解决后,我得到另一个
错误:java.net.SocketException:套接字在handler.run(handler.java:41)处java.net.Socket.getOutputStream(Socket.java:916)关闭
我断开一个客户端的连接后会出现此错误,我认为这是因为该套接字没有从arraylist中删除,并且在进行迭代时将其移到了该套接字上。为什么不将其删除呢? check()有什么问题?
当readLine()
返回null时,您应该:
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.