Java EchoTCPServer - 发送给所有客户

时间:2015-01-12 20:32:42

标签: java tcp

这是我的代码:

SERVER:

package server;

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

+

package 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 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);
        }
    }
}

它可以正常工作,除了我想在服务器向客户端发送“message”+“| MOD”时,我希望服务器将其发送给所有客户端,我该怎么办?

我是Java的新手,但不是编码,所以如果我做了一些可以做得更容易或更好的错误的东西,请帮助我。

请帮忙。

非常感谢。

2 个答案:

答案 0 :(得分: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();
            }
        }
    }
}

在你的代码中:

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;
    // 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)

答案 1 :(得分:0)

你应该看一下multiThreaded聊天服务器。每个连接的客户都会获得它自己的线程。

以下是您问题的完美答案:

multithread client-server chat, using sockets

祝你好运伴侣!