socket客户端输出流已关闭,为何服务端还可以写数据? 5C

客户端代码:
//1,创建客户端socket。
Socket s = new Socket("172.18.24.57",10006);

    //2,读取客户端要上传的图片文件。
    FileInputStream fis = new FileInputStream("c:\\0.bmp");

    //3,获取socket输出流,将读到图片数据发送给服务端。
    OutputStream out = s.getOutputStream();

    byte[] buf = new byte[1024];

    int len = 0;

    while((len=fis.read(buf))!=-1){
        out.write(buf,0,len);
    }


    s.shutdownOutput();


    //读取服务端发回的内容。         
    InputStream in  = s.getInputStream();
    byte[] bufIn = new byte[1024];

    int lenIn = in.read(buf);
    String text = new String(buf,0,lenIn);
    System.out.println(text);

    fis.close();
    s.close();

服务端代码:
ServerSocket ss = new ServerSocket(10005);

    //2,
    Socket s = ss.accept();

    System.out.println(s.getInetAddress().getHostAddress()+".....connected");

    //3,
    BufferedReader bufIn = new BufferedReader(new InputStreamReader(s.getInputStream()));

    //4,
    BufferedWriter bufw = new BufferedWriter(new FileWriter("c:\\server.txt"));

    String line = null;

    while((line=bufIn.readLine())!=null){

// if("over".equals(line))
// break;
bufw.write(line);
bufw.newLine();
bufw.flush();
}

    PrintWriter out = new PrintWriter(s.getOutputStream(),true);
    out.println("上传成功");

    bufw.close();

    s.close();
    ss.close();


    http://ask.csdn.net/#

    问题描述:客户端执行  s.shutdownOutput();已经关闭了socket输出流,为什么服务端还可以向socket管道out.println("上传成功");写数据?http://ask.csdn.net/#
0

7个回答

客户端 服务端
out-----x------->in
in<--------------out

你只是关闭第一条单向连接

1

我就5分,想悬赏分值多点可没有了。。。。悲催

0
0
zhuoni2013
zhuoni2013 我看你推荐的博文了,TCP传输中客户端和服务端的socket只有一个,不是服务端又“创建socket”吧!不知道说得对不对,个人理解,谢谢你的热心解答~
2 年多之前 回复

按我对你的问题描述的理解是你客户端关闭了连接却还可以对服务器进行数据的上传,因为shutdown关闭是单向的拒绝接收数据,没有完整的结束握手,与你建立连接的对方还是可以接收到你的数据。

0

socket是一种全双工的通信方式,建立完socket连接后,连接的任何一方都可以发起关闭操作。客户端关闭socket之后,会发送FIN信号到服务器端,告诉socket程序,连接已经断开。如果服务端对此信号不处理,就会一直处于 CLOSE-WAIT 状态,虽然客户端已经不需要和服务器间进行通信了,但是服务器端的socket连接句柄并没有释放,只能等到超时候自己释放了。

0
0

服务端向socket管道out.println("上传成功"),客户端是从InputStream中读取这些数据,和OutputStream没关系

0
Csdn user default icon
上传中...
上传图片
插入图片
抄袭、复制答案,以达到刷声望分或其他目的的行为,在CSDN问答是严格禁止的,一经发现立刻封号。是时候展现真正的技术了!
其他相关推荐
socket传输图片用shutdownoutput()之后无法继续传输数据
socket传输图片用shutdownoutput()之后无法继续传输数据n新建立一个socket(用不同端口号)专门用来传输图片,传完关闭。nn
输出流关闭造成的Socket关闭
今天写安卓向服务器发送图片,发送完毕后,调用out.close(),然后接受a=in.read(data)时,安卓6.0报错。 n错误代码:socket recvfrom failed: EBADF (Bad file descriptor) n首先尝试:将out.close()移动至代码块最后,但发现服务器端的in.read(data)不会返回-1,造成死循环。 n经过查询得知,Java的sock
Socket 客户端不显示的关闭连接服务端read一直阻塞
rn初次学习socket,写了下面例子rnpublic class SocketServer {rnrn public static void main(String[] args) {rn int port = 8089;rn ServerSocket server = null;rn InputStream in = null;rn Socket socket = null;rn t...
C# socket服务端判断 客户端已经断开连接的一个小办法
具体原理就是: nIf the remote host shuts down the Socket connection with the Shutdown method, and all available data has been received, the Receive method will complete immediately and return zero bytes. n中文翻
客户端关闭,服务器端SocketException异常解决方案
关于客户端一关闭,服务器就提示SocketException:connection reset的实际解决方案。
Socket和ServerSocket中的输入和输出流
Socket指的就是客户端啦,nnnSocket socket = new Socket(&quot;localhost&quot;,8888);n//此处的inputStream用来从连接中拿数据nInputStream inputStream = socket.getInputStream();n//此处的outputStream用来向连接中取数据nOutputStream outputStream = sock...
Socket服务器端断开后重新打开,客户端将自动完成链接
Socket通信技术。利用到了Thread技术,完成了,服务器开启,一直监听客户端功能,两点是,当服务器端断开后重新打开后,客户端能自动链接到服务器端,由于网络原因最多延迟2分钟
关于客户端断开连接后服务器抛出异常Connection reset
学习了socket  ,在做一个类似qq的c/s结构的聊天软件。发现了一个问题rn就是在客户端与服务器通信后,服务器为客户端开启一个线程,使用while(true)循环时刻监听是否有通信。rn在界面开启时没有任何异常,可是当界面关闭 就一直抛出异常了。rn开启线程代码如下:rnrnrn异常内容如下:rnrnjava.net.SocketException: Connection resetrnat
客户端断开socket连接, 服务端send 向一个失效的socket 发送数据,导致服务的进程退出
问题描述:nn客户端断开socket连接, 服务端send 向一个失效的socket 发送数据,导致服务的进程退出。nn原因分析:nn在linux下写socket的程序的时候,如果尝试send到一个disconnected socket上,就会让底层抛出一个SIGPIPE信号。n这个信号的缺省处理方法是退出进程,大多数时候这都不是我们期望的。因此我们需要重载这个信号的处理方法。nn解决方法可以有两...
客户端关闭连接服务器端没反应
客户端关闭连接服务器端没反应 或者服务端断开连接,客户端没有反应:rn不管什么情况下,服务器端需要有定时检测机制,因为还有些情况下服务器端也是收不到断开消息的(比如拔网线和意外宕机)
android下socket编程问题:服务器关闭时,客户端发送请求的异常处理
我用socket分别创建了一个服务器和一个客户端。rr当服务器程序运行时,客户端和服务器发送接收数据是OK的。rr但是,如果服务器程序关闭以后,客户端仍然发送请求的话,会抛出一个IOException。但这个时间间隔很久,要三到四分钟才会抛出这个异常的。刚开始还以为是死机了呢!rr我想在客户端做一个处理:如果服务器未开,要弹出一个提示框,然后结束当前程序。r请问怎么实现?rr附创建客户端的部分代码
在一个处于CLOSE_WAIT状态下的socket上send数据,对方会毫不留情地RST(对方之前已经调用close发FIN)
在四次挥手中, 被动关闭的一端进入CLOSE_WAIT状态, 此时, 如果还在这个socket上发送数据, 那么主动关闭(这是说的是close关闭, 而非shundown关闭, 他们有区别, 我们后面再说)的一端会返回RST.n 我们来看看:n 服务端程序为:
Socket在终端退出后,程序如何继续运行
描述:设置程序进入后台作为守护进程运行。说明:长时间运行的服务器端程序必须启用此项。如果不启用守护进程,当ssh终端退出后,程序将被终止运行。启用守护进程后,标准输入和输出会被重定向到 log_file,如果 log_file未设置,则所有输出会被丢弃。示例:'daemonize' =&amp;gt; true如果设置为true,ssh终端退出后,程序将继续运行。...
怎么让客户端关闭后服务器不会报错?
标题:怎么让客户端关闭后服务器不会报错?n解释:当你客户端(clientSocket)连接上服务器(serverSocket)之后,服务器会创建一个clientSocket,这个clientSocket和你自己的客户端进行交互,当你关闭客户端时,在服务器中的clientSocket还在一直就收客户端发送的消息,所以会报错,因此我们在就收消息这里写一个try{} catch{}语句就可以了:n ...
linux socket tcp server 解决客户端socket断开后, 服务器端进程退出的问题
当服务器监听并接受一个客户端链接的时候, 可以不断向客户端发送数据, 这时如果客户端断开socket链接, 服务器继续向一个关闭的socket 发送数据(send, write)的时候, 系统会默认对服务器进程发送一个SIGPIPE信号, 这个信号的默认动作就是终止当前服务器进程.rn所以为了解决客户端断开后导致服务器进程结束的问题, 使用如下方法忽略SIGPIPE信号.rnstruct siga
基于TCP的半关闭
windows的closesocket函数意味着完全断开连接(单方面断开连接)。完全断开不仅指无法传输数据,而且也不能接受数据。因此,在某些情况下closesocket函数断开连接就显得不太适用。rn                             rnrn为了解决这类问题,只关闭一部分数据交换中使用的流(half-close)的方法应运而生。断开一部分连接是指,可以传输数据但无法接收,或
有关服务端主动关闭socket带来的几个问题分析--tcp四次握手半关闭问题导致
     一、场景:nginx开启keep-alive:nn nn  问题描述:nnn upstream prematurely closed connection while reading response header from upstream, client: X.90.10, server: www.example.com, request: &quot;POST /web/?a=b HTTP/...
TCP服务器如何判断客户端Socket断开连接 - ZYNQ7021学习
       ARM上基于Linux编写的 TCP 服务器,当客户端断开连接时,使用 select 函数的情况下,服务器仍然会接收到一个信号,在 select 函数会将这个设备描述符标记为可读/写,然后调用 recv 函数,若 recv 函数返回值为 0,则表示客户端已经断开,服务器需要将对应的 Socket 套接字关闭掉,让数据写回磁盘,并释放文件所占用的资源。nn第一步nn       判断多...
java nio 实现客户端与服务端读写
刚开始写,有待后续完善rnrn服务端代码:rnpackage com.geng.test3;nnimport java.io.IOException;nimport java.net.InetAddress;nimport java.net.InetSocketAddress;nimport java.nio.ByteBuffer;nimport java.nio.channels.Selecta
AsyncSocket写的客户端Socket,实现当服务器断开连接时弹窗提示
背景:n在MFC里面用AsyncSocket 写了一个客户端程序,一个按钮发数据,当发送数据时发现如果关闭服务器的监听端口依然会提示数据已发送。原因也许是因为异步Socket没有阻塞,connect后会立刻返回?n过程:n于是百度尝试各种方法,有心跳方法,一秒钟连一次服务器,但感觉对于我这个程序过于被动;又尝试在OnConnect的返回值nerrorcode上面下功夫,发现如果刚开始服务器没
服务端主动终止连接的情况分析
前面我们已经学习了基本的网络套接字编程,下面是与本文相关的网络编程源码github连接: nhttps://github.com/clearoff/Network-Code/tree/master/%E6%9C%8D%E5%8A%A1%E5%99%A8%E5%92%8C%E5%AE%A2%E6%88%B7%E7%AB%AF(1V1) n然后下面我们给出与本文相关的博客连接,因为涉及到了TCP的“三次
关于socket flush()目标端接收不到数据,close()可以接收到数据的问题
最近在写一个简单的socket示例时遇到一个问题,使用write.flush()目标端read接收不到数据,调用close()后数据可正常接收。这让我很是费解,记得当初学习flush方法时,都说明这个方法是强制将缓存区内容刷新到输出流中。难道是socket输出流有不一样。看到网上很多人在问这个问题,解释的也是五花八门的。后来我终于找到了原因,有这样疑惑的同胞们可以参考下,出问题的不是输出的逻辑,而是
关闭socket
问题现象:客户端linux A,服务端java B nA向B发信息, B必须在10秒内返信,若没返信 ,A timeOut时间到 n则关闭socket通信, 但是当A timeOut关闭socket后, B还能够对此socket进行写(理论上A关闭socket后, B对此socket写入应该报错)n原因: 客户端A关闭socket 用的close函数 n close—–关闭本进程的socket i
Java网络编程(输出流 OutputStream)
网络程序所做的很大一部分工作都是简单的输入输出:nn将数据字节从一个系统移动到另一个系统。字节就是字节。在很大程度上讲:nn读取服务器发送给你的数据与读取文件并没有什么不同。nn向客户端发送文本和写文件也没有什么不同。但是,Java中输入和输出(I/O)的组织与其他语言都不太一样。因此,这里说一下Java独特的I/O方法。nnJava的I/O建立在流(stream)之上。nn输入流读取文件,输出流...
Socket UDP通信 客户端给服务端发送数据
直接把代码贴出来,里面有详细的注释nnn //客户端发送数据nn public class SocketSend {n public static Socket socket = null;n private static String TAG = &quot;send&quot;;n public interface SendListener {n ...
Python下UDP的Socket编程:服务器端因客户端的非正常退出而报错?
服务器端代码nnnnimport socketnimport threadingnimport loggingnimport datetimennlogging.basicConfig(format='%(message)s', level=logging.INFO)nnnclass ChatUdpServer:n def __init__(self, ip='127.0.0.1', por...
Socket服务端,长连接,心跳包,自动释放掉线资源,可扩展处理数据接口
头文:nn最近看网上写Sokect编程,好多都写的没法扩展,不能复用,既然是面向对象,就多多少少应该有面向对象的思想,所以自己下午写了一个,没优化,有不好的地方请指出.nn解析:nnSocket的基本原理这里就不讲了,只贴代码和解释代码,不会讲很细.nn大致分为四个部分,3个部分都是一个单独的线程.1个部分为哈希表共享资源nn服务模块:SocketService,用于接受客户端连接.nn检测模块:...
【Java】NIO 客户端关闭
nio的客户端如果关闭了,服务端还是会收到该channel的读事件,但是数目为0,而且会读到-1,其实-1在网络io中就是socket关闭的含义,在文件时末尾的含义,所以为了避免客户端关闭服务端一直收到读事件,必须检测上一次的读是不是-1,如果是-1,就关闭这个channel。nelse if(key.isReadable()){n ByteBuffer buffer = ByteBu
python --- socket服务器与客户端各种状态案例
服务器端:root@kali:~/python/socket# pwdn/root/python/socketnroot@kali:~/python/socket# lsnsocket_server.py socket_server_using.pynroot@kali:~/python/socket# n客户短端:root@kali:~/python/socket# pwdn/root/pyth
Linux下客户端主动Close,服务端阻塞的read函数不会马上返回
今天在做一个socket通信的时侯,发现close后,阻塞的read函数并没有马上返回,导致后面的时序出现问题,具体情况如下: n服务端与客户端正常建立通信,都采用阻塞模式。当客户端close后,服务端阻塞的read函数并没有马上返回,并且此时在服务端还可以向此连接写入数据,并成功,然后客户端又成功读到数据,接着服务端阻塞的read函数返回<0,表示断开连接。 n以上客户端主动Close,服务端阻塞
为什么TCP服务端需要调用bind函数而客户端通常不需要呢
为什么TCP服务端需要调用bind函数而客户端通常不需要呢
Java中Socket如何获得输入流
Socket类是java语言建立网络连接的核心类,通过对指定地址和端口的访问,获得资源的输入流。本文通过对源码分析,简单介绍Socket类的实现。nJava version jdk1.8.0_121npackage java.netn Class Socketnnpublic InputStream getInputStream() throws IOException {n ...
tcp 服务端如何判断客户端断开连接
1.C/S结构。功能方面比较简单就是client端与server端建立连接,然后发送消息给server,如果socket连接断开(异常,正常)后,我如何才能感知到?nn要求:server端这边是绝对被动的,sever端不能主动断开连接。也没有连接链路维持包之类的。client端发送数据的时间也是不定的。在socket连接断开后, server要能够感知到并释放资源。nn方案1:当使用 select...
网络编程(7)—— 使用shutdown半关闭服务器和客户端的连接
之前在socket服务器和客户端中,在linux平台上一直使用close,windows平台使用closesocket断开连接,无论是close和closesocket,都是输入和输出的链接同时断开。试想下面一种应用场景,搭建一个文件传输的服务器和客户端,客户端从服务器处下载文件,当下载的文件完成时,客户端需要向服务器传递一个字符串,比如“ThankYou”。处理这种情况,再使用之前的close或
Java服务器与客户端的通信中对象流的使用
在使用java对象流的时候,首先要保证通信双方各有一个公用的包,里面的内容相同,注意异常的抛出。rn相同的包rnpackage common;nnpublic class User implements java.io.Serializable{n private String name;n private String pass;n public String getName() {n ret
java nio中,为什么客户端一方正常关闭了Socket,而服务端的isReadable()还总是返回true?...
我这篇文章想讲的是编程时如何正确关闭tcp连接。首先给出一个网络上绝大部分的java nio代码示例:服务端:1首先实例化一个多路I/O复用器Selector2然后实例化一个ServerSocketChannel3ServerSocketChannel注册为非阻塞(channel.configureBlocking(false);)4Se...
Java Socket多个客户端与服务器通信
client代码:package com.cqut.test4;import java.io.*;nimport java.net.Socket;nimport java.net.SocketException;nimport java.net.UnknownHostException;nimport java.util.Scanner;public class Client {n priva
如何向通过TCP socket给服务器端发送的数据里注明自己的客户端地址
服务器端监听在端口8081后,客户端发起连接,客户端的port为54436.nn客户端连接成功后,马上发起一个subscribe请求。n但是服务器端拿到这个请求的payload后,不知道是哪一个客户端发起的。nn只需要在客户端代码发送数据的方法里加上这一行数据:nnoMessageStructure.clientAddress = client.localAddress + “:” + clien...
Java socket中IO流的关闭问题
1、首先第一点  out 流和IO流和socket是绑定好了的,如果单方面关闭一个流的话,socke就会被关闭rn2、socket.shutdownOutputStream 使用这个的话,Socket还是可用的(in可用)rn3、Socket关闭 后 输出缓冲区里的数据会被丢弃rn4、参考文章:http://blog.csdn.net/justoneroad/article/details/696
客户端断开导致服务器退出的解决方法 - ZYNQ7021学习
      客户端断开导致服务器进程退出,其根本原因是由服务器端的 send 函数导致的。在 linux 下写 socket 的程序的时候,如果尝试 send 到一个 disconnected socket 上,就会让底层抛出一个 SIGPIPE 信号。这个信号的缺省处理方法是退出进程(send函数的flags参数设置为0),不会看到任何的提示。这里介绍两种解决方法。nn方法一nn       将...
文章热词 机器学习教程 Objective-C培训 交互设计视频教程 颜色模型 设计制作学习
相关热词 mysql关联查询两次本表 native底部 react extjs glyph 图标 java 为何要学习反射 python服务端开发教程