2015-01-12 2 views
1

Вот мой код:Java EchoTCPServer - Отправить всем клиентам

SERVER:

package com.murplyx.server; 

public class Main { 
    public static void main(String args[]) { 
     new EchoServer(9000); 
    } 
} 

+

package com.murplyx.server; 

import java.io.BufferedReader; 
import java.io.InputStreamReader; 
import java.io.PrintWriter; 
import java.net.ServerSocket; 
import java.net.Socket; 

public class EchoServer { 
    private ServerSocket server; 

    public EchoServer(int port) { 
     try { 
      server = new ServerSocket(port); 

      while (true) { 
       Socket socket = server.accept(); 

       BufferedReader in = new BufferedReader(new InputStreamReader(socket.getInputStream())); 
       PrintWriter out = new PrintWriter(socket.getOutputStream(), true); 

       out.println(in.readLine() + " | MOD"); 

       socket.close(); 
      } 
     } catch(Exception err) { 
      err.printStackTrace(); 
     } 
    } 
} 

КЛИЕНТ:

package com.murplyx.client; 

import java.io.BufferedReader; 
import java.io.InputStreamReader; 
import java.io.PrintWriter; 
import java.net.Socket; 

public class Main { 
    public static void main(String args[]) { 
     try { 
      while (true) { 
       Socket socket = new Socket("localhost", 9000); 

       BufferedReader in = new BufferedReader(new InputStreamReader(socket.getInputStream())); 
       PrintWriter out = new PrintWriter(socket.getOutputStream(), true); 

       BufferedReader input = new BufferedReader(new InputStreamReader(System.in)); 

       out.println(input.readLine()); 

       System.out.println(in.readLine()); 

       socket.close(); 
      } 
     } catch (Exception err) { 
      System.out.println(err); 
     } 
    } 
} 

Он работает все как надо , за исключением того, что я хочу, когда сервер отправляет "сообщение" + "| MOD "для клиента, я хочу, чтобы сервер отправил это всем клиентам, как я могу это сделать?

Я новичок в Java, но не для кодирования, поэтому, пожалуйста, помогите мне, если я сделал некоторые неправильные вещи, которые можно сделать проще и лучше.

Пожалуйста, помогите.

Большое спасибо.

ответ

0

Вы должны взглянуть на многопоточном чат-сервера. Каждый клиент которым подключается получает свой собственный поток.

Здесь идеальный ответ на ваш вопрос:

multithread client-server chat, using sockets

удачи мат!

1

Что вы можете сделать, это сохранить клиентские сокеты в массиве, а затем использовать цикл for для отправки в каждый сокет.

Сначала объявите массив clientSocket; обратите внимание, что 5 - это просто произвольный размер, используемый для тестирования. Также объявите счетчик int.

public Socket clientSocket[] = new Socket[5]; 
public int intLastSocket = 0; 

// this should be placed where you're waiting to accept connections 
while (true) { 
    printTCP("Ready to accept welcome socket"); 

    clientSocket[intLastSocket] = welcomeSocket.accept(); 

    intLastSocket++; 
} 

// on the server, call this to send. s is a reference to the server object 
public void sendToAllTCP(TCPServer s, String message) { 
    for (Socket z : s.clientSocket) { 
     if (z != null) { 
      PrintStream outToClient = null; 
      try { 
       outToClient = new PrintStream(z.getOutputStream()); 
       outToClient.println(message); 
      } catch (IOException e) { 
       TCPServer.printTCP("Caught an IO exception trying " 
         + "to send to TCP connections"); 
       e.printStackTrace(); 
      } 
     } 
    } 
} 

В коде:

пакет com.murplyx.server;

import java.io.BufferedReader; 
import java.io.InputStreamReader; 
import java.io.PrintWriter; 
import java.net.ServerSocket; 
import java.net.Socket; 

public class EchoServer { 
    private ServerSocket server; 
    // use the clientSocket Array to save each new connection 
    public Socket clientSocket[] = new Socket[5]; 

    public EchoServer(int port) { 
     try { 
      server = new ServerSocket(port); 

      // this should be placed where you're waiting to accept connections 
      while (true) { 
       System.out.println("Ready to accept welcome socket"); 

       clientSocket[intLastSocket] = server.accept(); 

       intLastSocket++; 

       //send your message here, note that putting 
       //it here will send it each time u add a new connection 
       sendToAllTCP(/*the message you want to send */); 
      } 
     } catch(Exception err) { 
      err.printStackTrace(); 
     } 
    } 

    public void sendToAllTCP(String message) { 
     // this is an enchanced for loop, i don't know if it's in other languages 
     // but in java it's supposed to let you loop through 
     //each object in any iterable list 
     // such as array, arraylist, linkedlist, etc 
     for (Socket z : clientSocket) { 
      if (z != null) { 
       //basically this chunk of code declares output and input streams 
       //for each socket in your array of saved sockets 
       PrintStream outToClient = null; 
       try { 
        outToClient = new PrintStream(z.getOutputStream()); 
        outToClient.println(message); 
       } catch (IOException e) { 
        System.out.println("Caught an IO exception trying " 
          + "to send to TCP connections"); 
        e.printStackTrace(); 
       } 
      } 
     } 
    } 
} 

В зависимости от того, когда вы хотите отправить сообщение, вы можете использовать консоль и sys.in, чтобы отправить его. Например, если вы прочитали строку от sys.in и ее .equals("sendMsg"), то вы можете позвонить по телефону sendToAllTCP(yourmessage)

+0

Не могли бы вы поместить это в мой код? Тогда это будет намного легче понять. – super

+0

@Murplyx Отредактировано. – Aify

+0

Если вы хотите отправить обратно измененную версию строки, в которую вы вошли, я бы рекомендовал создать поток прослушивателя. Метод .accept() блокируется, поэтому, если я правильно помню, вы не сможете принимать какие-либо данные от подключенного клиента. – Aify

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