2017-02-09 1 views
0

Der folgende Code erstellt erfolgreich einen Server und akzeptiert einen eingehenden Client.Senden einer Nachricht von NIO Server

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) { 
        } 
       } 
      } 
     } 
    } 
} 

Aber wenn ich versuche, eine Nachricht an den Client zu senden, nachdem es mit dem Server verbunden ist, funktioniert es nicht heißt, die Nachricht von Client nicht empfangen wird.

Wie kann eine Nachricht vom Server an einen bestimmten Client gesendet werden?

Ich habe über das Internet geschaut und fand keine Beispiele, in denen Server eine Nachricht an den Client sendet.

+0

Sie sahen nicht sehr schwer. Das Internet ist voll von NIO Senden und Empfangen von Beispielen. Das Java-Tutorial, um diese Site nicht zu erwähnen. Ich habe Hunderte von Fragen dazu beantwortet. – EJP

Antwort

1

Sie müssen flip() der Puffer vor der write(), und wenn Sie es behalten möchten, müssen Sie compact() es danach.

Hinweis: Durch Schließen des Kanals wird die Taste gelöscht.

+0

Es funktionierte nach dem Umdrehen. Danke, EJP! Ich möchte wissen Wenn ich möchte, dass der Server die Nachricht an alle verbundenen Clients sendet, würde ich dann OP_WRITE verwenden? – user963241

+0

Die wichtigere Frage, die ich jetzt habe, ist über das Schließen des ServerSocketChannel. Es hat einen Thread, verbunden Clients mit Server, Selektor und Server selbst. Könntest du mir bitte helfen, mit dem Schließen der Sachen zu beginnen? – user963241

+0

Err, 'ServerSocketChannel.close()', 'SocketChannel.close()' und 'Selector.close()'? Wenn Sie neue Fragen haben, fragen Sie sie als neue Fragen. Dies ist kein Forum. – EJP

Verwandte Themen