Java: один сокет при операции чтения и записи. Полный дуплекс

1

Я должен реализовать отправку данных с определенным исходным портом и в то же время прослушивать этот порт. Полный дуплекс. Кто-нибудь знает, как реализовать его на java. Я попытался создать отдельный поток для прослушивания во входном потоке сокета, но он не работает. Я не могу связать серверный сокет и клиентский сокет с одним и тем же исходным портом и тем же самым с netty. Это там какое-то решение для тупых дуплексов?

    init(){
    socket = new Socket(InetAddress.getByName(Target.getHost()), Target.getPort(), InetAddress.getByName("localhost"), 250);
    in = new DataInputStream(socket.getInputStream());
    out = new DataOutputStream(socket.getOutputStream());
    }

     private static void writeAndFlush(OutputStream out, byte[] b) throws IOException {
        out.write(b);
        out.flush();
      }


    public class MessageReader implements Runnable {

        @Override
        public void run() {
//this method throw exception EOF
          read(in);

          }
private void read(DataInputStream in){
 while (isConnectionAlive()) {
          StringBuffer strBuf = new StringBuffer();
          byte[] b = new byte[1000];
          while ((b[0] = bufferedInputStream.read(b)) != 3) {
            strBuf.append(new String(b));
          }
          log.debug(strBuf.toString());
        }
}
        }
  • 0
    Когда вы пишете на определенный порт, это не your порт ... вы пишете на порт целевой машины, если вы не говорите, что пишете для себя? Начните со Слушателя ...
  • 0
    новый сокет (remoteAddress, remotePort, localAddress, localPort). Мне нужно прослушивать локальный порт и в то же время отправлять сообщения с этого порта. ServerSocket не может отправлять сообщения. Обычная розетка не может слушать или, по крайней мере, я не знаю, как это реализовать
Показать ещё 2 комментария
Теги:
sockets
duplex
socketchannel

3 ответа

1

Я столкнулся с тем же вопросом и решил ответить сам. Я хотел бы поделиться с вами ребятами код репо. Это очень просто, вы можете получить представление о том, как заставить ваши вещи работать. Это сложный пример. Шаги случайно выглядят как решение Ordous.

https://github.com/khanhhua/full-duplex-chat

Не стесняйтесь клонировать! Это моя домашняя работа в выходные.

0

То, что вы пытаетесь сделать, довольно странно: ServerSocket - полностью реализованный сокет, который принимает соединения, обрабатывает свои собственные сообщения, и вы определенно не можете копировать другой сокет поверх него.

Полный дуплекс довольно прост в использовании с NIO:

  1. Создайте Channel для вашего Socket в неблокирующем режиме
  2. Добавить чтение в проценты OP
  3. Сон с помощью метода Selector select()
  4. Прочитайте все прочитанные байты, напишите любые записываемые байты
  5. Если запись выполнена, удалите запись из интереса OPs
  6. GOTO 3.
  7. Если вам нужно написать, добавить байты в буфер, добавить write to interest OPs и запустить селектор. (немного упрощен, но я уверен, что вы можете найти свой путь вокруг Javadoc)

Таким образом, вы будете полностью загружать исходящий буфер каждый раз, когда есть пространство и чтение из входящего в одно и то же время (ну, один поток, но вам не нужно заканчивать запись, чтобы начать чтение и т.д.).

0

Основная тема:

  • Создайте фоновый поток (нити), который будет подключаться к любым целевым машинам.
    • Эти потоки будут подключаться к целевым машинам и передавать данные и умирать
  • Создание бесконечного цикла
    • Слушайте входящие соединения.
      • Отключите любое соединение для обработки ввода/вывода

Классы:

  • сервер
    • Слушает входящие соединения и потоки с объекта Client
  • клиент
    • Этот класс создается на сервере, принимающем входящее соединение, TcpClient или NetClient (я забываю, что его называет java) используется для отправки данных. По завершении он умирает.
  • цель
    • Создается во время запуска и подключается к определенной цели и отправляет данные.
    • как только он закончится, он умирает.
  • 0
    Я не отправляю ответ клиенту. Я должен иметь возможность отправлять сообщения на любой сервер и слушать prt, который я использовал для отправки моего сообщения
  • 0
    хорошо, список серверов, к которым вы подключаетесь и отправляете данные, известен? я предполагаю, что это должно быть
Показать ещё 18 комментариев

Ещё вопросы

Сообщество Overcoder
Наверх
Меню