2 xw13782513621 xw13782513621 于 2016.04.01 14:50 提问

socket监听输入流怎么关闭

用java写的,socket连接后另开一个线程实时监听输入流,但是如果服务器那边发生异常中断了,我这边也利用心跳机制知道有异常,需要断掉socket重新连,但是监听输入流的线程就卡在read的那个方法里了,怎么才能从那个read的阻塞里出来呢?

2个回答

wojiushiwo945you
wojiushiwo945you   Ds   Rxr 2016.04.01 15:10

不对啊,我理解的是如果服务器端异常中断了,那么你这边连接也会报连接关闭异常的吧。

xw13782513621
xw13782513621 不报啊,要是没有心跳包,根本就不知道连接是否异常关闭了
一年多之前 回复
msx985211
msx985211   2016.04.01 15:11

给你粘贴一个服务端和客户端的代码你瞅瞅吧
import java.net.*;
import java.io.*;

public class Server{
public static void main(String[] args){

    InputStream in=null;
    OutputStream out=null;
    try{
        ServerSocket ss=new ServerSocket(8888);
        Socket socket=ss.accept();
        in=socket.getInputStream();
        out=socket.getOutputStream();
        DataOutputStream dos=new DataOutputStream(out);
        DataInputStream dis=new DataInputStream(in);
        String s=null;
        if((s=dis.readUTF())!=null){
            System.out.println(s);
        }
        /*
        System.out.println(dis.readUTF())
        */

        String fileContent = readFileContent("E:\\LQ.txt");;
        dos.writeUTF(fileContent);
        dis.close();
        dos.close();
        socket.close();
    }catch(IOException e) {
        e.printStackTrace();
    }

 }

private static String readFileContent(String fileName) throws IOException {
    File file = new File(fileName);
    BufferedReader bf = new BufferedReader(new FileReader(file));
    String content = "";
    StringBuilder sb = new StringBuilder();
    while(content != null){
        content = bf.readLine();
        if(content == null){
            break;
        }
        sb.append(content.trim());
    }
    bf.close();
    return sb.toString();
}

}

import java.net.*;
import java.io.*;

public class Client{
public static void main(String[] args){

    InputStream is=null;
    OutputStream os=null;
    try{
        Socket socket=new Socket("localhost",8888);
        is=socket.getInputStream();
        os=socket.getOutputStream();
        DataInputStream dis=new DataInputStream(is);
        DataOutputStream dos=new DataOutputStream(os);
        dos.writeUTF("hello");
        String s=null;
        if((s=dis.readUTF())!=null);
        System.out.println(s);
        dis.close();
        dos.close();
        socket.close();
    }catch(IOException e) {e.printStackTrace();}
}

}

msx985211
msx985211 回复江三沐洛: 哦哦,那我不清楚了,等待大神解决
一年多之前 回复
xw13782513621
xw13782513621 你这个是客户端与服务器只做了一次交互啊,我这边需求是输入流要一直处于监听状态,服务器会主动向客户端推送些消息的
一年多之前 回复
Csdn user default icon
上传中...
上传图片
插入图片
准确详细的回答,更有利于被提问者采纳,从而获得C币。复制、灌水、广告等回答会被删除,是时候展现真正的技术了!