我的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中的套接字没有多少经验。我有什么不对的吗?