Ваша проблема в том, что вы используете DataInputStream
/ DataOutputStream
в Java, которая использует специфичный для Java протокол сериализации типа XDR-like.Вы не используете этот протокол на вашей стороне C #.
Переключение на использование необработанного потока ввода-вывода должно быть достаточным (хотя и очень хрупким).Однако обратите внимание, что, поскольку вы отправляете необработанные байты из C #, получателю будет невозможно определить, когда сообщение будет завершено.Было бы лучше послать количество байтов сообщения, за которым следует реальное сообщение (это то, что делает DataInputStream
/ DataOutputStream
, но это связано с дополнительными соображениями, которые вам необходимо правильно реализовать на вашей стороне C #,например, readUTF
/ writeUTF
использует «модифицированный формат UTF-8» вместо обычного UTF-8).
Проблема сейчас в том, что вы отправляете необработанные байты из C #, readUTF()
Метод читает первые два байта как длину, а затем пытается прочитать сообщение этой длины.Например, если C # отправляет «Hello» (кодируется как 0x48, 0x65, 0x6c, 0x6c, 0x6f), то сторона Java будет читать 0x48, 0x65 («He») как «длина сообщения 18533», а затем пытается прочитать 18533 байтав то время как фактические оставшиеся байты - только 3 ("llo").Это приводит к тому, что вход блокирует ожидание оставшихся 18530 байтов, которые никогда не поступают.