java - socket.shutdownOutput() 的目的

标签 java sockets groovy tcp tcpclient

我正在使用下面的代码将数据发送到 TCP 服务器。我假设我需要使用 socket.shutdownOutput() 来正确指示客户端已完成发送请求。我的假设正确吗?如果不是,请告诉我 shutdownOutput() 的用途。也感谢我可以进行的任何进一步优化。

客户端

def address = new InetSocketAddress(tcpIpAddress, tcpPort as Integer)
clientSocket = new Socket()
clientSocket.connect(address, FIVE_SECONDS)
clientSocket.setSoTimeout(FIVE_SECONDS)

// default to 4K when writing to the server
BufferedOutputStream outputStream = new BufferedOutputStream(clientSocket.getOutputStream(), 4096)

//encode the data
final byte[] bytes = reqFFF.getBytes("8859_1")
outputStream.write(bytes,0,bytes.length)
outputStream.flush()
clientSocket.shutdownOutput()

服务器

ServerSocket welcomeSocket = new ServerSocket(6789)

while(true)
{
    println "ready to accept connections"
    Socket connectionSocket = welcomeSocket.accept()
    println "accepted client req"
    BufferedInputStream inFromClient = new BufferedInputStream(connectionSocket.getInputStream())
    BufferedOutputStream outToClient = new BufferedOutputStream(connectionSocket.getOutputStream())
    ByteArrayOutputStream bos=new ByteArrayOutputStream()

    println "reading data byte by byte"  
    byte b=inFromClient.read()    
    while(b!=-1)
    {        
       bos.write(b)
       b=inFromClient.read()
    }
    String s=bos.toString()

    println("Received request: [" + s +"]")   

    def resp = "InvalidInput"
    if(s=="hit") { resp = "some data" }

    println "Sending resp: ["+resp+"]"

    outToClient.write(resp.getBytes());
    outToClient.flush()
}

最佳答案

I am using the below code to send data to a tcp server. I am assuming that I need to use socket.shutdownOutput() to properly indicate that the client is done sending the request. Is my assumption correct?

YES 您的假设是正确的。此输出 ShutDown 被称为 half close 。使用半关闭,TCP 为连接的一端提供了终止其输出的能力,同时仍从另一端接收数据。让我向您介绍 socket.shutdownOutput() 方法的效果:

  1. 在本地,本地套接字及其输入流的读取行为正常 目的,但出于写作目的,套接字及其输出流的行为 就好像套接字已被关闭:随后写入 套接字将抛出 IOException
  2. TCP 的正常连接终止序列(a - FIN 确认为 一个 ACK​​)在任何未决数据被发送和确认后排队等待发送。
  3. Remotely,远程套接字正常用于写入目的,但用于 阅读目的套接字的行为就好像它已被关闭 结束:进一步从套接字读取返回 EOF 条件,即读取计数 的 -1 或 EOFException ,具体取决于被调用的方法。
  4. 当本地套接字最终关闭时,连接终止序列 已发送,不再重复;如果另一端已经 也完成了半关闭,套接字上的所有协议(protocol)交换现在都是 完成。

因此我们看到,当收到 EOF 时,该端确信另一端已完成输出关闭。而这个场景是通过另一边的socket.shutDownOutput()完美实现的。

来源:Java 基础网络 Esmond Pitt

关于java - socket.shutdownOutput() 的目的,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15206605/

相关文章:

Python:Selenium 无法在 UDOO 上找到空闲端口

python - 如何在列表 C++ 中存储套接字

java - 为什么 gradle 不返回其他项目的依赖关系?

groovy - 相当于 Groovy 中的 eval()

sql-server - sqljdbc4 在更新到 Apple Java for Mac OS X 10.6 update 6 后挂起

java - 如何使用 Thymeleaf 和 spring 将对象或数组从 html 页面发送到 POST 方法

c - Linux:是否有超时的套接字读取或接收?

Java/Groovy 如何正确比较两个字符串值? .equals() 不工作

java - 应用程序在 Android 3.0 平板电脑上缩小

java - Shiro 权限字符串已拒绝功能?