1. 今天写socket数据相互通信的时候,碰到一个及其蛋疼的错误。单向传输数据的时候serverclient是没有问题的,但是两个都有输入输出操作的时候就出现了这个问题 java.net.SocketException: Socket is closed:
  2.  
  3. 下面附代码:
  1. Server:
  2.  
  3. StringBuffer result = new StringBuffer("");
  4. int port = 9090;
  5. //定义一个ServerSocket监听在端口9090上
  6. ServerSocket server = null;
  7.  
  8. while(true){//注意while放在哪
  9.  
  10. try {
  11.  
  12. server = new ServerSocket(port);
  13. //server尝试接收其他Socket的连接请求,server的accept方法是阻塞式的
  14. Socket client = server.accept();
  15. server.setSoTimeout(20*1000);
  16. System.out.println("client connected!");
  17.  
  18. //接收消息
  19. Reader read = new InputStreamReader(client.getInputStream());
  20. BufferedReader bufferReader = new BufferedReader(read);
  21. String readLine = "";
  22. //bufferReader.readLine()用一次读一行,前面用过再用就是下一行
  23. while((readLine = bufferReader.readLine()) != null){
  24. result.append(readLine);
  25. }
  26. bufferReader.close;
  27. System.out.println("from client: " + result.toString());
  28.  
  29. //boolean isConnected = socket.isConnected() && !socket.isClosed();
  30.  
  31. //读完后写一句
  32. OutputStream os = client.getOutputStream();//这一行会报socket关闭的错误
  33. DataOutputStream out = new DataOutputStream(os);
  34. out.writeBytes("Hello Client,I'm Server!");
  35. System.out.println("sent mesg");
  36.  
  37. out.flush();//清空缓存
  38. out.close();//关闭
  39. client.close();
  40.  
  41. } catch (IOException e) {
  42. e.printStackTrace();
  43. } finally {//这里socket.close最好放在finally里
  44. try
  45. {
  46. if(server != null){
  47. server.close();
  48. }
  49. }catch(IOException e){
  50. e.printStackTrace();
  51. }
  52. }
  53.  
  54.     }
  1. Client:
  2. StringBuffer result = new StringBuffer("") ;
  3. String host = "192.168.0.88";
  4. int port = 9090;
  5. Socket client = null;
  6.  
  7. try
  8. {
  9. System.out.println("Connecting to " + host + " on port " + port);
  10. client = new Socket(host, port);
  11. client.setSoTimeout(20*1000);
  12. System.out.println("Just connected to " + client.getRemoteSocketAddress());
  13.         //发送消息
  14. OutputStream os = client.getOutputStream();
  15. DataOutputStream out = new DataOutputStream(os);
  16. out.writeBytes("Hello Server!");
  17. System.out.println("sent mesg");
  18. out.flush();//清空缓存
  19. out.close();//关闭
  20. //接收消息
  21. Reader read = new InputStreamReader(client.getInputStream());//同样这里会报错
  22. BufferedReader bufferReader = new BufferedReader(read);
  23. String readLine = "";
  24. while((readLine = bufferReader.readLine()) != null){
  25. result.append(readLine);
  26. }
  27. System.out.println("from Server: " + result.toString());
  28. bufferReader.close;
  29.  
  30. }catch(IOException e){
  31. e.printStackTrace();
  32. } finally {
  33. try
  34. {
  35. if(client != null){
  36. client.close();
  37. }
  38. }catch(IOException e){
  39. e.printStackTrace();
  40. }
  41. }
  1. 找了很久终于找到 bufferReader.close()与out.close()关闭会直接导致sockect.close()故只进行输入输出中的一个之后就出现java.net.SocketException: Socket is closed:错误,可能是因为用到了socket.getOutputStream(),socket.getInputStream()的缘故。
  2.  
  3. 这里将out.close()与bufferReader.close()兑换成client.shutdownOutput()与client.shutdownInput();之后就不会出现Socket直接被关闭的问题了。
  4.  
  5. Socket.close()->输入输出流都被关闭->有时候希望仅关闭输入流或输出流之一->Socket半关闭方法->shutdownInput():仅关闭输入流shutdownOutput():仅关闭输出流
  6.  
  7. 上述问题中如果把bufferReader.close()与out.close()放在最后,就会出现Serverread的时候因为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. struts2中利用POI导出Excel文档并下载

    1.项目组负责人让我实现这个接口,因为以前做过类似的,中间并没有遇到什么太困难的事情.其他不说,先上代码: package com.tydic.eshop.action.feedback; impor ...

  2. System,Integer,Calendar,Random和容器

    System 1)arraycopy int[] a = {1.2.3.4}; int[] b = new int[5]; System.arraycopy(a,1,b,3,2); //把数组a中从下 ...

  3. java开发之匿名内部类,接口的使用

    下面的例子是Java.JDK7学习笔记上的 打算开发多人联机程序,对每个联机客户端,都会建立Client对象封装相关信息 1.Client.java public class Client { pri ...

  4. iOS学习笔记:iOS核心动画中的常用类型

    CATransaction 当我们在自定义的图层上修改某些支持动画的属性时,系统会为该属性的修改自动产生动画.这种其实属于隐式动画.隐式动画要得益于CATransaction. 一个CATransac ...

  5. Android adb 常用技巧

    1.在命令行管理模拟器设备(AVD) list:列出机器上所有已经安装的Android版本和AVD设备 list avd:列出机器上所有已经安装的AVD设备: list target:列出机器上所有已 ...

  6. JAVA的核心概念:接口(interface)

    JAVA的核心概念:接口(interface) 接口与类属于同一层次,实际上,接口是一种特殊的抽象类. 如:    interface IA{ }  public interface: 公开接口  与 ...

  7. CocoaPods requires your terminal to be using UTF-8 encoding

    WARNING: CocoaPods requires your terminal to be using UTF-8 encoding. See https://github.com/CocoaPo ...

  8. WinScp上传和下载

    不多说,贴代码,看不懂得可以留言.需要引入WinSCP public class WebWinScp { //远程上传路径 private SessionOptions sessionOptions ...

  9. lrj计算几何模板

    整理了一下大白书上的计算几何模板. #include <cstdio> #include <algorithm> #include <cmath> #include ...

  10. acdream 1210 Chinese Girls' Amusement (打表找规律)

    题意:有n个女孩围成一个圈从第1号女孩开始有一个球,可以往编号大的抛去(像传绣球一样绕着环来传),每次必须抛给左边第k个人,比如1号会抛给1+k号女孩.给出女孩的人数,如果他们都每个人都想要碰到球一次 ...