Java Socket通信以及可能出现的问题解决(2)

对于readLine()方法,它解除阻塞、正确结束并返回读取的值,只有以下几种情况:

①读取的数据里含有回车符"\r"或者换行符"\n"或者回车换行符"\r\n";

②读取的数据是在另一端通过println方法写入的,因为println方法自带换行符;

③BufferedReader类的缓冲区满了,那么JVM会自动刷新缓冲区从而释放“积攒”的数据(但是鉴于默认缓冲区大小为8192个字符,对于小数据量的通信,显然触发不了);

④对于读取的数据,写入这些数据的流发生异常或者直接关闭,那么readLine()就会把它吃的数据全部吐出来。这就刚好解释了,为什么在我的程序中,断开客户端Socket连接,服务器端立刻输出所有客户端消息的原因。

综上,在Socket通信过程中,保证某一端输出流的缓冲被刷新,保证另一端的readLine方法能正常停止,即可解决写入的数据在另一端无法输出的问题。

以下是我修改后能成功运行的代码,分别是服务器端Socket和客户端Socket。

over!

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.io.OutputStream;
import java.io.PrintWriter;
import java.net.ServerSocket;
import java.net.Socket;
import java.io.BufferedWriter;
import java.io.OutputStreamWriter;
public class ShakingServer{
    public static void main(String[] args) throws IOException {

//创建服务器套接字实例,设置监听端口为2000
        ServerSocket server=new ServerSocket(2000);
        //开始监听客户端的请求,并阻塞
        Socket socket=server.accept();
        //请求收到后,自动建立连接。通过IO流进行数据传输
        System.out.println("连接建立成功");

OutputStream os=socket.getOutputStream();
        PrintWriter pw=new PrintWriter(new BufferedWriter(new OutputStreamWriter(os)),true);
        pw.write("欢迎访问摇头耶稣的世界!");
        pw.flush();
                //因为我关闭了输出流,所以另一端的readLine方法才正常结束了
        socket.shutdownOutput();

InputStream is=socket.getInputStream();
        InputStreamReader isr=new InputStreamReader(is);
        BufferedReader br=new BufferedReader(isr);
        while(true) {
            String str=br.readLine();
            if(str.equals("quit")) {
                break;
            }
            System.out.println("Client said: "+str);
        }
        socket.shutdownInput();
        //socket.shutdownOutput();
        socket.close();
        server.close();
    }
}

内容版权声明:除非注明,否则皆为本站原创文章。

转载注明出处:https://www.heiqu.com/9943c7399adc90fd85776f852e551110.html