java的Socket通信例子及关于java.net.SocketException: Socket is closed错误

今天写socket数据相互通信的时候,碰到一个及其蛋疼的错误。单向传输数据的时候server与client是没有问题的,但是两个都有输入输出操作的时候就出现了这个问题 java.net.SocketException: Socket is closed:

下面附代码:
Server:

        StringBuffer result = new StringBuffer("");
        int port = 9090;
        //定义一个ServerSocket监听在端口9090上
        ServerSocket server = null;

        while(true){//注意while放在哪

            try {

                server = new ServerSocket(port);
                //server尝试接收其他Socket的连接请求,server的accept方法是阻塞式的
                Socket client = server.accept();
                server.setSoTimeout(20*1000);
                System.out.println("client connected!");

                //接收消息
                Reader read = new InputStreamReader(client.getInputStream());
                BufferedReader bufferReader = new BufferedReader(read);
                String readLine = "";
                //bufferReader.readLine()用一次读一行,前面用过再用就是下一行
                while((readLine = bufferReader.readLine()) != null){
                    result.append(readLine);
                }
                bufferReader.close;
                System.out.println("from client: " + result.toString());  

                //boolean isConnected = socket.isConnected() && !socket.isClosed();

                //读完后写一句
                OutputStream os = client.getOutputStream();//这一行会报socket关闭的错误
                DataOutputStream out = new DataOutputStream(os);
                out.writeBytes("Hello Client,I‘m Server!");
                System.out.println("sent mesg");

                out.flush();//清空缓存
                out.close();//关闭
                client.close();  

            } catch (IOException e) {
                e.printStackTrace();
            } finally {//这里socket.close最好放在finally里
                try
                {
                    if(server != null){
                        server.close();
                    }
                }catch(IOException e){
                    e.printStackTrace();
                }
            }            
Client:
        StringBuffer result = new StringBuffer("") ;
        String host = "192.168.0.88";
        int port = 9090;
        Socket client = null;

        try
        {
             System.out.println("Connecting to " + host + " on port " + port);
             client = new Socket(host, port);
             client.setSoTimeout(20*1000);
             System.out.println("Just connected to "+ client.getRemoteSocketAddress());
                     //发送消息
             OutputStream os = client.getOutputStream();
             DataOutputStream out = new DataOutputStream(os);
             out.writeBytes("Hello Server!");
             System.out.println("sent mesg");
             out.flush();//清空缓存
             out.close();//关闭
//接收消息
             Reader read = new InputStreamReader(client.getInputStream());//同样这里会报错
             BufferedReader bufferReader = new BufferedReader(read);
             String readLine = "";
             while((readLine = bufferReader.readLine()) != null){
                 result.append(readLine);
             }
             System.out.println("from Server: " + result.toString());
             bufferReader.close;

          }catch(IOException e){
             e.printStackTrace();
          } finally {
                try
                {
                    if(client != null){
                        client.close();
                    }
                }catch(IOException e){
                    e.printStackTrace();
                }
          }
找了很久终于找到 bufferReader.close()与out.close()关闭会直接导致sockect.close()故只进行输入火鼠初中一个之后就出现java.net.SocketException: Socket is closed:错误,可能是因为用到了socket.getOutputStream(),socket.getInputStream()的缘故。

这里将out.close()与bufferReader.close()兑换成client.shutdownOutput()与client.shutdownInput();之后就不会出现Socket直接被关闭的问题了。

Socket.close()->输入输出流都被关闭->有时候希望仅关闭输入流或输出流之一->Socket半关闭方法->shutdownInput():仅关闭输入流shutdownOutput():仅关闭输出流

上述问题中如果把bufferReader.close()与out.close()放在最后,就会出现Server在read的时候因为Client未关闭outputstream一直傻等下去。故此种方法不可取。
时间: 2024-10-07 16:01:58

java的Socket通信例子及关于java.net.SocketException: Socket is closed错误的相关文章

Socket通信——C++服务器端和Java客户端

一句话来说就是,C++和Java 通过socket进行通信.数据传输,通过发送"字节流"即可. 字节对于C++和java来说是通用的,但是传输的过程有许多问题需要注意,我为了弄清楚这个过程,查了一些资料,做了一些整理. 不了解C++ socket编程,可以看这篇博客: Linux 下:socket通信(Linux下,C/C++语言):http://blog.csdn.net/giantpoplar/article/details/47657303 Windows下:winsock:ht

一个最简单的Socket通信例子

所谓socket通常也称作"套接字",用于描述IP地址和端口,是一个通信链的句柄.应用程序通常通过"套接字"向网络发出请求或者应答网络请求.  Socket和ServerSocket类库位于java.net包中.ServerSocket用于服务器端,Socket是建立网络连接时使用的.在连接成功时,应用程序两端都会产生一个Socket实例,操作这个实例,完成所需的会话.对于一个网络连接来说,套接字是平等的,并没有差别,不因为在服务器端或在客户端而产生不同级别.不管是

Delphi和JAVA用UTF-8编码进行Socket通信例子

最近的项目(Delphi开发),需要经常和java语言开发的系统进行数据交互(Socket通信方式),数据编码约定采用UTF-8编码. 令我无语的是:JAVA系统那边反映说,Delphi发的数据他们收到是乱码,而我这边(Delphi7,ANSI)收到的数据将utf-8转码成ansi也是乱码. 因为不太熟悉java语言,还曾经怀疑是不是Delphi的utf-8编码和java语言的不一样. 最近学习了一下java的相关知识,写一个小程序来测试验证一下我曾经的怀疑. 事实证明,Delphi7的UTF-

Android基础入门教程——7.6.2 基于TCP协议的Socket通信(1)

Android基础入门教程--7.6.2 基于TCP协议的Socket通信(1) 标签(空格分隔): Android基础入门教程 本节引言: 上一节的概念课枯燥无味是吧,不过总有点收获是吧,本节开始我们来研究基于TCP协议的Socket 通信,先来了解下Socket的概念,以及Socket通信的模型,实现Socket的步骤,以及作为Socket服务 端与客户端的两位各做要做什么事情!好的,我们由浅入深来扣这个Socket吧! 1.什么是Socket? 2.Socket通信模型: Socket通信

【Node.js基础篇】(十)使用net模块和Readline模块实现Socket通信

Node.js的socket通信和C++.Java的非常相像,学过这两种语言的socket通信的同学可以很快就掌握好Node.js的socket通信.下面我们以实现一个Echo服务器的服务端和客户端为目的,学习一下Node.js的socket通信. 所谓的Echo服务器指的是这样一种服务器:客户端发送一条消息给服务端,服务端就把这条消息原封不动地返回给客户端. 服务端 服务端的实现分为三步: - 通过createServer创建一个server服务端 - 使用server的listen方法监听指

深入浅出讲解:php的socket通信

深入浅出讲解:php的socket通信 对TCP/IP.UDP.Socket编程这些词你不会很陌生吧?随着网络技术的发展,这些词充斥着我们的耳朵.那么我想问: 1.         什么是TCP/IP.UDP?2.         Socket在哪里呢?3.         Socket是什么呢?4.         你会使用它们吗? 什么是TCP/IP.UDP? TCP/IP(Transmission Control Protocol/Internet Protocol)即传输控制协议/网间协

Android之从TCP/IP、HTTP看Socket通信

1.概念 1.1 TCP/IP:属于传输层/网络层协议.手机能够使用联网功能是因为手机底层实现了TCP/IP协议,可以使手机终端通过无线网络建立TCP连接.TCP协议可以对上层网络提供接口,使上层网络数据的传输建立在“无差别”的网络之上.主要解决数据在网络中的传输. 1.2 HTTP:即超文本传送协议(Hypertext Transfer Protocol ),属于应用层协议,是Web联网的基础,也是手机联网常用的协议之一,HTTP协议是建立在TCP协议之上的一种应用.主要解决数据的包装与识别应

Socket通信——Linux下,使用C/C++

①  什么是Socket? Socket是一个通信的端点.一对进程在网络直接通过一对socket通信,每个进程一个. 一个socket由一个IP地址和端口号确定.Socket封装了一些操作,使得网络里两个进程的数据通信比较方便.基于TCP协议和UDP协议的socket用得很多. 下图展示了两种方式的通信过程 ②建立socket进行通信使用的几个函数 以Linux系统为例,说明一下几个函数 A.  socket()函数 int socket(int domain, int type, int pr

linux下java程序与C语言程序通过SOCKET通信的简单例子

linux下java程序与C语言程序通过SOCKET通信的简单例子 今天上午实验了java程序与c语言程序通过socket进行通信.由于没学过java,因此只是编写了C语言端的代码,java端的代码是从网上别的文章中找的,经过少量修改后与C语言端程序通信成功. 本例中C语言端作为服务器,java端作为客户端 代码如下: /****************** server program *****************/ #include <stdio.h> #include <sy