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一直傻等下去。故此种方法不可取。
java的Socket通信例子及关于java.net.SocketException: Socket is closed错误的更多相关文章
- Delphi和JAVA用UTF-8编码进行Socket通信例子
最近的项目(Delphi开发),需要经常和java语言开发的系统进行数据交互(Socket通信方式),数据编码约定采用UTF-8编码. 令我无语的是:JAVA系统那边反映说,Delphi发的数据他们收 ...
- Socket通信客户端设计(Java)
public class Client extends JFrame implements Runnable{ private JPanel jPanel= new JPanel(); private ...
- Socket通信例子
Server端 using System; using System.Collections.Generic; using System.ComponentModel; using System.Da ...
- Python Socket通信例子
一.TCP 通信 服务端 #!/usr/bin/env python # -*- coding: utf-8 -*- # server_tcp.py import socket so = socket ...
- windows下用c实现Socket通信
原文:windows下用c实现Socket通信 原本以为c是跨平台,所以,c在windows下和linux下的程序应该是类似于Java,什么都不用改变的,今儿才恍然大悟,他们的类库不一样啊-- 下面我 ...
- Android之从TCP/IP、HTTP看Socket通信
1.概念 TCP/IP:属于传输层/网络层协议.手机能够使用联网功能是因为手机底层实现了TCP/IP协议,可以使手机终端通过无线网络建立TCP连接.TCP协议可以对上层网络提供接口,使上层网络数据的传 ...
- 基于TCP与UDP协议的socket通信
基于TCP与UDP协议的socket通信 C/S架构与初识socket 在开始socket介绍之前,得先知道一个Client端/服务端架构,也就是 C/S 架构,互联网中处处充满了 C/S 架构(Cl ...
- JAVA基础知识之网络编程——-基于NIO的非阻塞Socket通信
阻塞IO与非阻塞IO 通常情况下的Socket都是阻塞式的, 程序的输入输出都会让当前线程进入阻塞状态, 因此服务器需要为每一个客户端都创建一个线程. 从JAVA1.4开始引入了NIO API, NI ...
- JAVA基础知识之网络编程——-TCP/IP协议,socket通信,服务器客户端通信demo
OSI模型分层 OSI模型是指国际标准化组织(ISO)提出的开放系统互连参考模型(Open System Interconnection Reference Model,OSI/RM),它将网络分为七 ...
随机推荐
- MATLAB曲线绘制
一. 二维数据曲线图1.1 绘制 单根二维曲线plot 函数的基本调用 格式为:plot(x,y) 其中x和y为长度相同的向量,分别用于存储x坐标 和y坐标数据. 例1-1 在0≤x≤2p区间内,绘制 ...
- NuGet在2015中的使用
NuGet Package Restore https://docs.nuget.org/Consume/Package-Restore 以https://github.com/andburn/hd ...
- java实现最基础的socket网络通信
一.网络通信基础 网络中存在很多的通信实体,每一个通信实体都有一个标识符就是IP地址. 而现实中每一个网络实体可以和多个通信程序同时进行网络通信,这就需要使用端口号进行区分. 二.java中的基本网络 ...
- npm安装插件提示
现在使用node的人群越来越多,咱也不能落后,得跟紧脚步才行. 今天使用 npm 安装插件的时候,出现以下提示,而且,安装程序看着好像终止了.而且,看到一个exit单词,就认为说安装出错了. $ np ...
- hashmap的遍历
import java.util.HashMap;import java.util.Iterator; public class hash { /** * @param args */ public ...
- IE6、IE7、IE8中overflow:hidden无效问题
在做图片无缝滚动效果时遇到了这个兼容问题 div宽1000px高250px超出隐藏. 但在Firefox中正常,超出部分隐藏,但是在IE6.IE7.IE8.Sogou高速下都显示了出来.做了这么多年的 ...
- UVA 575 Skew Binary (水)
题意:根据这种进制的算法,例如,给你一个左式,要求推出右式.(其实右式就是一个十进制数,根据这种进位的方法来转成特殊进制的数.) 思路:观察转换特点,有点类似于二进制,但是其在后面还减一了.比如25- ...
- sublime3 常用功能总结
介绍几个常见的功能: l 自动完成:自动完成的快捷键是Tab和Enter,如果在html文件中,输入cl按下tab或Enter,即可自动补全为class=””:加上zencoding后,更是如虎添翼, ...
- ios第三方开源库
1.AFNetworking 目前比较推荐的iOS网络请求组件,默认网络请求是异步,通过block回调的方式对返回数据进行处理. 2.FMDB 对sqlite数据库操作进行了封装,demo也比较简单. ...
- POJ 1860 Currency Exchange
题意:有n种货币,可以互相兑换,有m个兑换规则,兑换规则给出汇率r和手续费c,公式为b = (a - c) * r,从a货币兑换为b货币,问能不能通过不断的兑换赚钱,兑换期间手中的钱数不可以为负. 解 ...