tStream in = socket.getInputStream(); int dataLen = 0; //报文前六个字节所标识的完整报文长度 int readLen = 0; //已成功读取的字节数 int needDataLen = 0; //剩余需要读取的报文长度,即报文正文部分的长度 byte[] buffer = new byte[6]; //假设报文协议为:前6个字节表示报文长度(不足6位左补0),第7个字节开始为报文正文 while(readLen < 6){ readLen += in.read(buffer, readLen, 6-readLen); } dataLen = Integer.parseInt(new String(buffer)); System.out.println("dataLen=" + dataLen); byte[] datas = new byte[dataLen]; System.arraycopy(buffer, 0, datas, 0, 6); needDataLen = dataLen - 6; while(needDataLen > 0){ readLen = in.read(datas, dataLen-needDataLen, needDataLen); System.out.println("needDataLen=" + needDataLen + " readLen=" + readLen); needDataLen = needDataLen - readLen; } System.out.println("Receive request " + new String(datas, "UTF-8")); OutputStream out = socket.getOutputStream(); out.write("The server status is opening".getBytes("UTF-8")); //The flush method of OutputStream does nothing //out.flush(); } catch (IOException e) { //当服务端正在进行发送数据的操作时,如果客户端断开了连接,那么服务器会抛出一个IOException的子类SocketException异常 //java.net.SocketException: Connection reset by peer //这只是服务器与单个客户端通信时遇到了异常,这种异常应该被捕获,使得服务器能够继续与其它客户端通信 e.printStackTrace(); } finally { if(null != socket){ try { //与一个客户通信结束后要关闭Socket,此时socket的输出流和输入流也都会被关闭 //若先后调用shutdownInput()和shutdownOutput()方法,也仅关闭了输入流和输出流,并不等价于调用close() //通信结束后,仍然要调用Socket.close()方法,因为只有该方法才会释放Socket所占用的资源,如占用的本地端口等 socket.close(); } catch (IOException e) { //ignore the exception } } } } } }
|