2016-04-29 8 views
0

I 2 Klassen habenNachricht an bestimmten Client über Sockets

public class ServerStart implements Runnable 
    { 
     @Override 
     public void run() 
     { 
      try 
      { 
       serverSock = new ServerSocket(2101); 
       while (true) 
       { 
        sock = serverSock.accept(); 
        System.out.println(sock); 
        clients.put(sock.getPort(),sock); 
        HandleMultipleClients hmc=new HandleMultipleClients(); 
        hmc.messagetospecificclients(String ipaddress,String choice) 
       } 

2. Klasse ist

public class HandleMultipleClients 
{ 

    Socket soc; 
    ServerSocket serverSock; 
    DataOutputStream dos; 
    DataInputStream dis; 
    public HandleMultipleClients() 
    { 

    } 
    public void messagetospecificclients(String ipaddress,String choice) throws IOException, InterruptedException 
    { 
     System.out.print(ipaddress+"\n"+choice); 
     for (Iterator<Integer> iter = clients.keySet().iterator(); iter.hasNext();) 
     { 
      System.out.print("ok1"); 
      int key = iter.next(); 
      java.net.Socket client = clients.get(key); 
      InetAddress zee = client.getInetAddress(); 
      String s = zee.getHostAddress(); 
      System.out.print(s); 
      if (zee.getHostAddress().equals(ipaddress)) 
      { 
       System.out.print("ok2"); 
       dos =new DataOutputStream(client.getOutputStream()); 
       dos.writeUTF(choice); 
      } 

Wie kann ich für Schleife der 2. Klasse Funktion dh messagetospecificclients (String ipaddress, String Wahl) durchkommen wenn ich Kunden der ersten Klasse hinzufüge, bitte hilf mir. Mein Code sollte so sein, dass ich die Klienten zur ersten Klasse hinzufügen sollte und die for Schleife in der 2. Klasse

Antwort

0

durchlaufen sollte, würde ich den Code umstrukturieren. Trennen Sie den Code für die Mechanik für den Socket-Server und die Manipulation der Rückgabedaten. Der Rückgabecode kann von der Methode messageToSpecificClient gestartet werden. Sie könnten eine ganze Klasse oder was auch immer daraus starten. Ich habe das nicht ausgeführt, aber es sollte laufen. Ein weiterer Vorbehalt zu diesem Code ist, dass es Probleme mit einigen Unicode geben wird. Also, wenn das in Ihren Anforderungen ist, müssen einige geändert werden.

import java.io.IOException; 
import java.io.InputStream; 
import java.io.PrintStream; 
import java.net.InetAddress; 
import java.net.ServerSocket; 
import java.net.Socket; 

public class MultiThreadServer implements Runnable 
{ 
    Socket csocket; 

    MultiThreadServer(Socket csocket) 
    { 
     this.csocket = csocket; 
    } 

    public static void main(String args[]) throws Exception 
    { 
     ServerSocket ssock = new ServerSocket(1234); 
     System.out.println("Listening"); 
     while (true) 
     { 
      Socket sock = ssock.accept(); 
      System.out.println("Connected"); 
      new Thread(new MultiThreadServer(sock)).start(); 
     } 
    } 

    public void run() 
    { 
     PrintStream pstream = null; 
     InputStream input = null; 
     try 
     { 
      pstream = new PrintStream(csocket.getOutputStream()); 
      input = csocket.getInputStream(); 
      String stringFromClient = readFromInputStream(input); 
      String response = messageTosSpecificClients(stringFromClient); 
      pstream.write(response.getBytes()); 
     } 
     catch (IOException e) 
     { 
      System.out.println(e); 
     } 
     finally 
     { 
      if (pstream != null) 
       try 
       { 
        pstream.close(); 
       } 
       catch (Throwable t) 
       { 
       } 
      if (input != null) 
       try 
       { 
        input.close(); 
       } 
       catch (Throwable t) 
       { 
       } 
      if (csocket != null) 
       try 
       { 
        csocket.close(); 
       } 
       catch (Throwable t) 
       { 
       } 
     } 
    } 

    String readFromInputStream(InputStream inputStream) throws IOException 
    { 
     int ch; 
     StringBuilder sb = new StringBuilder(); 
     while ((ch = inputStream.read()) != -1) 
      sb.append((char) ch); 
     return sb.toString(); 
    } 

    public String messageTosSpecificClients(String choice) throws IOException 
    { 
     String ipaddress = "127.0.0.1"; 

     String retData = "General Return String"; 
     System.out.print(ipaddress + "\n" + choice); 
     InetAddress zee = csocket.getInetAddress(); 
     String s = zee.getHostAddress(); 
     System.out.print(s); 
     if (zee.getHostAddress().equals(ipaddress)) 
     { 
      retData = "Specific Return String"; 
     } 
     return retData; 
    } 
} 
Verwandte Themen