我正在使用下面的代码将数据发送到 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()
方法的效果:
- 在本地,本地套接字及其输入流的读取行为正常
目的,但出于写作目的,套接字及其输出流的行为
就好像套接字已被关闭:随后写入
套接字将抛出
IOException
- TCP 的正常连接终止序列(a - FIN 确认为 一个 ACK)在任何未决数据被发送和确认后排队等待发送。
- Remotely,远程套接字正常用于写入目的,但用于
阅读目的套接字的行为就好像它已被关闭
结束:进一步从套接字读取返回 EOF 条件,即读取计数
的 -1 或
EOFException
,具体取决于被调用的方法。 - 当本地套接字最终关闭时,连接终止序列 已发送,不再重复;如果另一端已经 也完成了半关闭,套接字上的所有协议(protocol)交换现在都是 完成。
因此我们看到,当收到 EOF 时,该端确信另一端已完成输出关闭。而这个场景是通过另一边的socket.shutDownOutput()
完美实现的。
来源:Java 基础网络 Esmond Pitt
关于java - socket.shutdownOutput() 的目的,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15206605/