2017-02-09 17 views
0

Код ниже успешно создает сервер и принимает входящего клиента.Отправка сообщения с сервера NIO

package socket; 

import java.nio.*; 
import java.nio.channels.*; 
import java.net.*; 
import java.util.*; 
import java.io.IOException; 

public class NonBlockingServer { 

    public static void main(String[] args) throws InterruptedException, IOException { 

     // Create a new Thread 
     Server s = new Server(); 
     new Thread(s).start(); 

     // Give 10 seconds for client to connect 
     Thread.sleep(10000); 

// This Doesn't work? 

     s.Write("Hello, Client!"); 

     System.out.println("Done"); 
    } 
} 

//A class which implements Runnable Interface 
class Server implements Runnable { 

    SocketChannel AcceptedClient; 
    ServerSocketChannel serverChannel; 
    Selector selector; 

    void Write(String s) throws IOException { 
     ByteBuffer buffer = ByteBuffer.allocate(s.length()); 
     buffer.put(s.getBytes()); 

     int numWrite = -1; 
     numWrite = AcceptedClient.write(buffer); 

     while (buffer.hasRemaining()) 
     { 
      numWrite += AcceptedClient.write(buffer); 
     } 

     System.out.println(numWrite); 
    } 

    @Override 
    public void run() 
    { 

     int port = 4041; 

     System.out.println("Listening for connections on port " + port); 

     try { 
      // Bind the port 
      serverChannel = ServerSocketChannel.open(); 
      ServerSocket ss = serverChannel.socket(); 
      InetSocketAddress address = new InetSocketAddress(port); 
      ss.bind(address); 

      // Non-blocking Server 
      serverChannel.configureBlocking(false); 

      // Register with Selector 
      selector = Selector.open(); 
      serverChannel.register(selector, SelectionKey.OP_ACCEPT); 

     } catch (IOException ex) { 
      ex.printStackTrace(); 
      return; 
     } 

     while (true) { 

      try { 

       // Blocks until a 'socket' is ready registered with selector is ready. 
       selector.select(); 

      } catch (IOException ex) { 
       ex.printStackTrace(); 
       break; 
      } 

      Set<SelectionKey> readyKeys = selector.selectedKeys(); 
      Iterator<SelectionKey> iterator = readyKeys.iterator(); 

      while (iterator.hasNext()) { 

       SelectionKey key = iterator.next(); 
       iterator.remove(); 

       try { 

        if (key.isAcceptable()) { 

         ServerSocketChannel server = (ServerSocketChannel) key.channel(); 
         SocketChannel client = server.accept(); 
         System.out.println("Accepted connection from " + client); 
         client.configureBlocking(false); 

         // Client accepted by server can read. 
         SelectionKey key2 = client.register(selector, SelectionKey.OP_READ); 

         AcceptedClient = (SocketChannel) key2.channel(); 

        } 

       } catch (IOException ex) { 
        key.cancel(); 
        try { 
         key.channel().close(); 
        } catch (IOException cex) { 
        } 
       } 
      } 
     } 
    } 
} 

Но когда я пытаюсь отправить сообщение клиенту после того, как он был подключен к серверу, он не работает, т.е. сообщение не получено клиентом.

Каков правильный способ отправить сообщение с сервера конкретному клиенту?

Я просмотрел Интернет и не нашел примеров, на которых сервер отправляет сообщение клиенту.

+0

Вы не выглядели очень тяжело. В Интернете полно примеров отправки и получения NIO. Учебник Java, для начала, не говоря уже об этом сайте. Я ответил на сотни вопросов. – EJP

ответ

1

Вам необходимо указать flip() буфер до write(), и если вы собираетесь его сохранить, вам необходимо будет compact() после этого.

NB Закрытие канала отменяет действие ключа.

+0

Он работал после листания. Спасибо, EJP! Я хочу знать. Если я хочу, чтобы сервер передавал сообщение всем подключенным клиентам, тогда я бы использовал OP_WRITE? – user963241

+0

Более важный вопрос, который у меня возникает сейчас о закрытии ServerSocketChannel. Он имеет потоки, подключенные клиенты к серверу, селектору и самому серверу. Не могли бы вы помочь мне, чтобы начать закрывать вещи, пожалуйста? – user963241

+0

Err, 'ServerSocketChannel.close()', 'SocketChannel.close()' и 'Selector.close()'? Если у вас есть новые вопросы, задайте им новые вопросы. Это не форум. – EJP

Смежные вопросы