Сначала вы должны решить, хотите ли вы использовать TCP или UDP для вашего соединения.
TCP использует класс Socket и ServerSocket и предоставляет вам соединение, по которому вы можете отправлять непрерывный поток байтов (и получать еще один в другом направлении). Протокол TCP гарантирует, что все данные поступают в правильном порядке.
UDP использует класс DatagramSocket и отправляет отдельные пакеты, которые могут или не могут прийти на другую сторону (обычно они поступают, но нет никакой гарантии, и вы не можете узнать, если вы не реализуете подтверждение сам). Если они достигают какого-либо хоста / порта и там не происходит прослушивания процессов, они просто отбрасываются.
Нет смысла смешивать оба, обычно.
Ваша программа использует UDP send
и receive
в одном и том же потоке один за другим, что приведет к тому, что у принимающего сокета не будет возможности прочитать его, поскольку пакет уже был отброшен. Вы должны позвонить на получение в отдельном потоке, и перед отправкой пакета.
Редактировать (после вашего комментария):
Так работает UDP. Для входящих пакетов нет очереди.
Вызов ds.receive(dp);
ожидает новых пакетов, поступающих с этого момента, а не пакетов, которые были отправлены когда-то в прошлом. Так что этот вызов просто заблокируется навсегда (и, кроме того, в потоке отправки событий, что означает, что вы не получите перерисовок или другой обработки событий).
Подобно тому, как вы запускаете метод connect () в новом потоке, также запускаете метод сервера Receive
в новом потоке. (На самом деле, Laccept
вашего сервера ни для чего не используется.)
Кроме этого, ваши две DatagramSockets (клиентская и серверная) связаны с одним и тем же локальным портом, что также может вызвать проблему. Не делай этого.