今天写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一直傻等下去。故此种方法不可取。

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

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

    最近的项目(Delphi开发),需要经常和java语言开发的系统进行数据交互(Socket通信方式),数据编码约定采用UTF-8编码. 令我无语的是:JAVA系统那边反映说,Delphi发的数据他们收 ...

  2. Socket通信客户端设计(Java)

    public class Client extends JFrame implements Runnable{ private JPanel jPanel= new JPanel(); private ...

  3. Socket通信例子

    Server端 using System; using System.Collections.Generic; using System.ComponentModel; using System.Da ...

  4. Python Socket通信例子

    一.TCP 通信 服务端 #!/usr/bin/env python # -*- coding: utf-8 -*- # server_tcp.py import socket so = socket ...

  5. windows下用c实现Socket通信

    原文:windows下用c实现Socket通信 原本以为c是跨平台,所以,c在windows下和linux下的程序应该是类似于Java,什么都不用改变的,今儿才恍然大悟,他们的类库不一样啊-- 下面我 ...

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

    1.概念 TCP/IP:属于传输层/网络层协议.手机能够使用联网功能是因为手机底层实现了TCP/IP协议,可以使手机终端通过无线网络建立TCP连接.TCP协议可以对上层网络提供接口,使上层网络数据的传 ...

  7. 基于TCP与UDP协议的socket通信

    基于TCP与UDP协议的socket通信 C/S架构与初识socket 在开始socket介绍之前,得先知道一个Client端/服务端架构,也就是 C/S 架构,互联网中处处充满了 C/S 架构(Cl ...

  8. JAVA基础知识之网络编程——-基于NIO的非阻塞Socket通信

    阻塞IO与非阻塞IO 通常情况下的Socket都是阻塞式的, 程序的输入输出都会让当前线程进入阻塞状态, 因此服务器需要为每一个客户端都创建一个线程. 从JAVA1.4开始引入了NIO API, NI ...

  9. JAVA基础知识之网络编程——-TCP/IP协议,socket通信,服务器客户端通信demo

    OSI模型分层 OSI模型是指国际标准化组织(ISO)提出的开放系统互连参考模型(Open System Interconnection Reference Model,OSI/RM),它将网络分为七 ...

随机推荐

  1. Github欢乐多 PHP神级代码引发吐槽热

    前日,github的PHP板块惊现一段能够提升70%运行效率的代码,引发了全世界众多网友的吐槽和调侃,“awesome!”.“well done!”.“PHP是世界第一语言!”平时不苟言笑,埋头苦干的 ...

  2. c 语言练习__求到N的阶乘的和。

    #include <stdio.h> /* 题目如下 * S = 1 + 2! + 3! + ... + N! */ int main(int argc, char *argv[]) { ...

  3. HDU 3308 线段树 最长连续上升子序列 单点更新 区间查询

    题意: T个测试数据 n个数 q个查询 n个数 ( 下标从0开始) Q u v 查询 [u, v ] 区间最长连续上升子序列 U u v 把u位置改成v #include<iostream> ...

  4. hdu 1394 Minimum Inversion Number (裸树状数组 求逆序数 && 归并排序求逆序数)

    题目链接 题意: 给一个n个数的序列a1, a2, ..., an ,这些数的范围是0-n-1, 可以把前面m个数移动到后面去,形成新序列:a1, a2, ..., an-1, an (where m ...

  5. ArrayList和List之间的转换

    开发中不免碰到List与数组类型之间的相互转换,举一个简单的例子: package test.test1; import java.util.ArrayList; import java.util.L ...

  6. Qt之自定义界面(右下角冒泡)

    简述 网页右下角上经常会出现一些提示性的信息,桌面软件中也比较常见,类似360新闻.QQ消息提示一样! 这种功能用动画实现起来很简单,这节我们暂时使用定时器来实现,后面章节会对动画框架进行详细讲解. ...

  7. UVALive 4043 Ants(二分图完美匹配)

    题意:每个蚁群有自己的食物源(苹果树),已知蚂蚁靠气味辨别行进方向,所以蚁群之间的行动轨迹不能重叠.现在给出坐标系中n个蚁群和n棵果树的坐标,两两配对,实现以上要求.输出的第 i 行表示第 i 个蚁群 ...

  8. 根据中国气象局提供的API接口实现天气查询

    中国气象局提供了三个天气查询的API接口: [1]http://www.weather.com.cn/data/sk/101190101.html [2]http://www.weather.com. ...

  9. HelloX操作系统网络功能简介及使用和开发指南

    HelloX网络功能简介及使用和开发指南 HelloX网络功能简介 作为物联网操作系统,网络功能是必备的核心功能之一.按照规划,HelloX实现了两个不同类型的TCP/IP协议栈,一个面向资源受限的嵌 ...

  10. django - get_or_create() 使用提醒

    [omron - debug] user_id建表的时候,不能使用unique,因为一个用户,可能有多个product_id,相对应的是,get_or_create()中的查询参数,如果在建表中有un ...