[java] Передача данных через Socket

koly

Возникают ошибки при передаче данных через сокеты.
Программа - это клиент-серверное приложение. Клиент пытается подключиться к серверу и скачать патч. Сервер соответственно принимает соединения и обслуживает клиентов.
Клиент:

Socket client = new Socket(Config.UPDATE_SERVER, Config.UPDATE_SERVER_PORT);
update.setSoTimeout(0);
update.setSoLinger(true, 10);
update.setKeepAlive(true);
update.setTcpNoDelay(true);
....
DataInputStream dis = new DataInputStream(update.getInputStream;
....
int patchLength = dis.readInt;
byte [] patch = new byte[patchLength];
dis.readFully(patch);
.....
update.close;

Сервер:
 
ServerSocket socket = new ServerSocket(Config.UPDATE_SERVER_PORT, 100,
InetAddress.getByName(Config.UPDATE_SERVER;
....
final Socket client = socket.accept;
client.setSoTimeout(1000 * 60 * 5);
client.setSoLinger(true, 10);
client.setKeepAlive(true);
client.setTcpNoDelay(true);
...
DataOutputStream dos = new DataOutputStream(client.getOutputStream;
dos.writeInt(patch.length);
client.getOutputStream.write(patch, 0, patch.length);
....

Ошибки со стороны сервера:
 
java.net.SocketException: Software caused connection abort: socket write error
at java.net.SocketOutputStream.socketWrite0(Native Method)
at java.net.SocketOutputStream.socketWrite(Unknown Source)
at java.net.SocketOutputStream.write(Unknown Source)
java.net.SocketException: Connection reset by peer: socket write error
at java.net.SocketOutputStream.socketWrite0(Native Method)
at java.net.SocketOutputStream.socketWrite(Unknown Source)
at java.net.SocketOutputStream.write(Unknown Source)

Какие ошибки соответствуют этим на стороне клиента - не знаю.
Частота возникновения ошибок зависит от удаленности компьютеров внутри локальной сети (возможно, скорости передачи данных) и от размера передаваемых данных. В сети ГЗ ошибки появляются в половине попыток переслать файл 14MB. Ошибки возникают только при связи с определенными хостами клиентов. (т. е. если один раз связался и передал файл, то и в следующий раз проблем не будет - и наоборот)
В чем могут быть проблемы? Неправильные настройки или дефекты реализации сокетов?

koly

При чтении больших строк с указанными выше настройками сокетов часто возникают такие ошибки:

java.net.SocketTimeoutException: Read timed out
at java.net.SocketInputStream.socketRead0(Native Method)
at java.net.SocketInputStream.read(Unknown Source)
at java.net.SocketInputStream.read(Unknown Source)
at java.io.DataInputStream.readUnsignedShort(Unknown Source)
at java.io.DataInputStream.readUTF(Unknown Source)
at java.io.DataInputStream.readUTF(Unknown Source)
java.io.EOFException
at java.io.DataInputStream.readUnsignedShort(Unknown Source)
at java.io.DataInputStream.readUTF(Unknown Source)
at java.io.DataInputStream.readUTF(Unknown Source)

kokoc88

client.setTcpNoDelay(true);
Сейчас нет при себе документации, но если в этой строке ты делаешь неблокирующий сокет, то у тебя возникает исключение по причине того, что программа не успевает отослать данные по сети и запись в сокет должна вызывать блокирование.

sergey_m

TcpNoDelay это совсем не означает неблокирующийся сокет.

kokoc88

Угу, уже прочитал документацию. Тогда может быть всё, что угодно. Вплоть до NullPointerException на стороне клиента.
Оставить комментарий
Имя или ник:
Комментарий: