我看到了一些关于这个的帖子,但我还是找不到答案。
以下是我的服务器与客户端的交互方式:
public void run () {
try {
//Read client request
InputStream is = server.getInputStream();
byte[] buff = new byte[1024];
int i;
ByteArrayOutputStream bos = new ByteArrayOutputStream();
while ((i = is.read(buff, 0, buff.length)) != -1) {
bos.write(buff, 0, i);
System.out.println(i + " bytes readed ("+bos.size()+")");
}
is.close();
is = null;
//Do something with client request
//write response
OutputStream os = server.getOutputStream();
os.write("server response".getBytes());
os.flush();
os.close();
os = null;
} catch (IOException ioe) {
ioe.printStackTrace();
}
}这是客户端:
public void run() {
try {
InetAddress serverAddr = null;
serverAddr = InetAddress.getByName("10.0.2.2");
socket = new Socket(serverAddr, 5000);
//Send Request to the server
OutputStream os = socket.getOutputStream();
os.write(jsonRequest.toString().getBytes("UTF-8"));
os.flush();
os.close();
os = null;
//Read Server Response
InputStream is = socket.getInputStream();
byte[] buff = new byte[1024];
int i;
ByteArrayOutputStream bos = new ByteArrayOutputStream();
while ((i = is.read(buff, 0, buff.length)) != -1) {
bos.write(buff, 0, i);
System.out.println(i + " bytes readed ("+bos.size()+")");
}
is.close();
is = null;
//Do something with server response
} catch (UnknownHostException uhe) {
sendCallbackError(uhe);
} catch (IOException ioe) {
sendCallbackError(ioe);
}
}如您所见,客户端连接并发送请求。服务器读取该请求,然后写入客户端将读取的响应。
此代码的问题在于客户机中的OutputStream.close()和服务器中的InputStream.close()。正如Javadocs中所述,关闭流将关闭Socket。结果是,当客户端试图读取服务器响应时,Socket已经关闭。
我设法通过调用Socket.shutdownInput和Socket.shutdownOutput来克服这一问题。不过,我仍在想,这是否是正确的做法?
需要注意的是,当服务器写入响应或客户端读取时使用close()关闭流不会造成问题(我猜结束时客户端和服务器之间是同步的)。
所以我的问题是:
close()关闭最后的流(当从服务器发送和读取响应时)发布于 2013-07-11 04:17:36
您可以执行以下操作:
try{
}catch(){
}finally{
if(is!=null){
is.close();
}
if(os!=null){
os.close();
}
}发布于 2013-07-11 04:53:34
这段代码的问题是客户机中的OutputStream.close()和服务器中的InputStream.close()。正如Javadocs中所述,关闭流将关闭套接字。
正确,但服务器中的InputStream不是直接连接到Socket:,而是连接到您不知道的东西上。你可以不受惩罚地关闭它,尽管你完全不需要关闭它。如果您愿意,可以关闭服务器中的OutputStream:尽管如此,由于它没有直接连接到Socket,,所以除了冲洗之外,它可能也可能没有任何效果。
为了解决您的实际问题,您不需要关闭客户机中的输出流,但是您确实需要发送一个适当的内容长度:头。这样,服务器就知道从客户端读取多少数据。如果这只是一个GET请求,那么内容长度很可能为零。您不需要调用shutdownOutput(),,尽管我想没有什么可以阻止您,而且调用shutdownInput()也不会对网络造成任何影响,所以这也是没有意义的。
https://stackoverflow.com/questions/17584927
复制相似问题