zoukankan      html  css  js  c++  java
  • java.net.SocketException: Broken pipe

    java.net.SocketException: Broken pipe


    生产上遇到一个问题,socket发生Broken pipe错误,如下
    image_1ckekef9ml3airm1hvc1ikn1l2f1p.png-68.7kB

    这个问题跟踪了好几个月,始终没有模拟出为什么会发生Broken pipe。最后发现,是客户端设置了超时时间setSoTimeout,也是神坑。

    下面的例子可以完整的还原出Broken Pipe错误,请在linux底下运行。

    Client:

    import java.io.DataInputStream;
    import java.io.DataOutputStream;
    import java.io.IOException;
    import java.io.OutputStream;
    import java.net.Socket;
    
    public class Client {
    
        public static void main(String[] args) {
            Socket s = null;
            try {
                s = new Socket("127.0.0.1", 3113);
                s.setSoTimeout(5000);
    
                DataOutputStream out = new DataOutputStream(
                        s.getOutputStream());
    
    
                //client->server
                out.write("1111 from client".getBytes());
    
    
                // server->client
                DataInputStream in = new DataInputStream(s.getInputStream());
                byte[] bytes = new byte[1024];
                int len = in.read(bytes);
    
                System.out.println("client:" + new String(bytes, 0, len));
    
                out.write("2222 from client".getBytes());
    
    
            } catch (Exception e) {
                e.printStackTrace();
            } finally {
                if (s != null) {
                    try {
                        s.close();
                    } catch (IOException e) {
                        e.printStackTrace();
                    }
                }
            }
        }
    }
    

    Server:

    import java.io.DataInputStream;
    import java.io.DataOutputStream;
    import java.io.IOException;
    import java.io.InputStream;
    import java.net.ServerSocket;
    import java.net.Socket;
    
    public class Server {
    
    	public static void main(String[] args) {
    	        try {
    	            ServerSocket ss = new ServerSocket(3113);
    	            Socket s = ss.accept();
    	            //client->server
    				DataInputStream is = new DataInputStream(s.getInputStream());
    	            byte[] buf =new byte[1024];
    	            int len = is.read(buf);
    	            System.out.println("recv:"+new String(buf,0,len));
    	
    	            Thread.sleep(10000);
    
    				//server->client
    	            s.getOutputStream().write("1111 server".getBytes());
    	
    
    
                    //client->server
    				DataInputStream in = new DataInputStream(s.getInputStream());
    				byte[] bytes = new byte[1024];
    				int length = in.read(bytes);
    
    				try {
    					System.out.println("recv2:"+new String(bytes,0,length));
    				} catch (Exception e) {
    					e.printStackTrace();
    
    					System.out.println("--------------");
    
    					DataOutputStream out = new DataOutputStream(s.getOutputStream());
    					try {
    						out.write("error write ".getBytes());
    					} catch (IOException e1) {
    						System.out.println("==============================");
    						e1.printStackTrace();
    					}
    				}
    
    			}catch (Exception e){
    				System.out.println(e.getStackTrace());
    	            e.printStackTrace();
    	        }
    	    }
    }
    
  • 相关阅读:
    类的再理解
    关于网络配置和zmp以及json
    PCL 库安装
    Ros学习注意点
    Ros集成开发环境配置
    《TCP/IP详解卷1:协议》第3章 IP:网际协议(1)-读书笔记
    《Effective C++》第1章 让自己习惯C++-读书笔记
    《TCP/IP详解卷1:协议》第2章 链路层-读书笔记
    《TCP/IP详解卷1:协议》第1章 概述-读书笔记
    C++内存分配与对象构造的分离
  • 原文地址:https://www.cnblogs.com/liangzs/p/9448575.html
Copyright © 2011-2022 走看看