Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/sockets/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java socket.shutdownOutput()的用途_Java_Sockets_Groovy_Tcp_Tcpclient - Fatal编程技术网

Java socket.shutdownOutput()的用途

Java socket.shutdownOutput()的用途,java,sockets,groovy,tcp,tcpclient,Java,Sockets,Groovy,Tcp,Tcpclient,我正在使用下面的代码向tcp服务器发送数据。我假设我需要使用socket.shutdownOutput()来正确地指示客户机已完成发送请求。我的假设正确吗?如果没有,请告诉我shutdownOutput()的用途。也感谢我能做的任何进一步优化 客户端 def address = new InetSocketAddress(tcpIpAddress, tcpPort as Integer) clientSocket = new Socket() clientSocket.connect(addre

我正在使用下面的代码向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()
}
表示客户端已完成通过TCP连接发送任何数据。它将发送剩余数据,然后发送终止序列,该序列将完全关闭其传出连接。无法发送任何进一步的数据,这也将向您的程序指示请求已完全完成。因此,如果您确定不必再发送任何数据,建议您这样做

但不需要指示请求已完成(如果有多个请求,则不必一直打开/关闭输出),还有其他方法

我正在使用下面的代码向tcp服务器发送数据。我想 我需要使用socket.shutdownOutput()来正确指示 客户端已完成发送请求。我的假设正确吗?

你的假设是正确的。这种输出关闭被称为“半关闭”。使用半关闭TCP使连接的一端能够终止其输出,同时仍然从另一端接收数据。让我带您了解一下socket.shutdownOutput()方法的效果:

  • 在本地,本地套接字及其输入流的读取行为正常 目的,但出于写入目的,套接字及其输出流的行为 就好像套接字已经被关闭一样:后续写入 套接字将抛出一个
    IOException
  • TCP的正常连接终止顺序(a-FIN由 ACK)将在发送和确认任何挂起数据后排队发送
  • 远程,远程套接字的行为通常用于写入目的,但用于 读取目的套接字的行为就好像它已被此操作关闭一样 结束:从套接字进一步读取将返回EOF条件,即读取计数 of-1或
    EOFEException
    ,具体取决于调用的方法
  • 当本地套接字最终关闭时,连接终止顺序 已发送,且不会重复;如果另一端已经 也完成了一半,套接字上的所有协议交换现在都完成了 完成
  • 因此,我们看到,当接收到EOF时,该端被确保另一端已完成输出关闭。通过另一侧的
    socket.shutDownOutput()
    可以完美地实现此场景


    来源:Java基础网络,Esmond Pitt

    +1您能否详细说明“但不需要指示请求已完成(如果有多个请求,您不必一直打开/关闭输出),还有其他方法。”如果您有多个请求要发送到服务器,您可以定义一个“魔术包”等(一个特殊的、唯一的字节数组),发送该数组将指示服务器一个请求已结束。一个简单的示例(不适用于更复杂、更重要的程序)是字符串“End”的字节数组,假设您不发送字符串……一直打开/关闭输出是什么意思?您不能重新打开已关闭的“输出”回答这个问题时我还在学校;)我想我的意思是,一个人不需要一直关闭和重新连接,一个打开的套接字连接就足以回答多个请求。