Java套接字并不总是获取所有字节

时间:2016-08-24 07:49:48

标签: java sockets

我的Java应用程序使用套接字有问题。连接到服务器上的socket后,我们可以下载文件。

程序如下:

  • 客户端向要下载文件名的服务器发送消息
  • 服务器以文件大小响应
  • 然后服务器发送到套接字所有文件字节

这是我的Java代码:

//init keyManagerFactory and trustManager
SSLContext sslContext = SSLContext.getInstance("TLS");
sslContext.init(keyManagerFactory.getKeyManagers(), new TrustManager[] { trustManager }, new SecureRandom());
SSLSocketFactory socketFactory = sslContext.getSocketFactory();
SSLSocket socket = (SSLSocket) socketFactory.createSocket(new Socket(ipAddress, port), ipAddress, port, false);
socket.startHandshake();

DataInputStream in = new DataInputStream(new BufferedInputStream(socket.getInputStream()));
... 

int toRead = xxxx; //received from server response
List<Byte> bytes = new ArrayList<>();
while(toRead > 0) {
    byte b = in.readByte();
    bytes.add(b);
    toRead--;
}

问题在于,有时我会从服务器获取所有字节,但有时我只获得部分字节,并且不再有数据,例如服务器发送文件大小= 1500,我的应用程序试图从套接字获取它,但只有1100字节,其他时间有1200,其他时间1500。

你可以说 - 这是一个服务器问题。但是我用Python编写了具有相同功能的程序,它总能正常工作!

这里的python代码:

def recv(sock, toread):
    buf = bytearray(toread)
    view = memoryview(buf)
    while toread:
        nbytes = sock.recv_into(view, toread)
        if nbytes == 0:
            sock.close()
            raise Disconnected
        view = view[nbytes:]
        toread -= nbytes
    return buf

plainsock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
sock = ssl.wrap_socket(plainsock, cert_reqs=ssl.CERT_NONE, ssl_version=ssl.PROTOCOL_TLSv1)
sock.connect(someIP, somePort)

...

toRead = xxxx //received from server response

data = recv(sock, toRead)

我对Java中的套接字没有多少经验。我有什么不对的吗?

0 个答案:

没有答案