Can';t向所有Java客户端发送消息

Can';t向所有Java客户端发送消息,java,client,server,Java,Client,Server,我正在使用一个服务器,它可以接收来自所有客户端的消息并将它们发送给其他客户端。我可以接收消息,但我不能发送给所有客户,尽管我从所有客户那里获得了正确的输出流 这是我的密码 如果要测试,请使用cmd->telnet localhost端口号 import java.io.*; import java.util.*; import java.net.*; public class Server { private ServerSocket s; private Hashtabl

我正在使用一个服务器,它可以接收来自所有客户端的消息并将它们发送给其他客户端。我可以接收消息,但我不能发送给所有客户,尽管我从所有客户那里获得了正确的输出流

这是我的密码 如果要测试,请使用cmd->telnet localhost端口号

import java.io.*;
import java.util.*;
import java.net.*;

public class Server 
{

    private ServerSocket s;
    private Hashtable saveOutputStreams =  new Hashtable(500,80);

    //Constructor
    public Server(int port) throws IOException
    {
        listen(port);
    }
    //Listen method
    public void listen(int port) throws IOException
    {
        s = new ServerSocket(port);

        while(true)
        {
            Socket incoming = s.accept();

            OutputStream sout = incoming.getOutputStream();

            saveOutputStreams.put(incoming, sout);
            Runnable r = new ThreadHandler(this,incoming);
            Thread t = new Thread(r);
            t.start();
        }
    }
    // Create a table of streams to process in for loop of senToAll method
    Enumeration getOutputStreams()
    {
        return saveOutputStreams.elements();
    }
    // Send message to all clients
    public void sendToAll(String message)
    {
        synchronized(saveOutputStreams)
        {
            for(Enumeration e = getOutputStreams();e.hasMoreElements();)
            {

                OutputStream getOut = (OutputStream)e.nextElement();
                PrintWriter outp  = new PrintWriter(getOut);

                try
                {
                    outp.println("sent"+ message);
                    System.out.println("Stream: "+getOut);
                    System.out.println("PrinWriter "+outp);

                }
                catch(Exception ie)
                {
                    ie.printStackTrace();
                    System.out.println("Error");
                }

                finally
                {
                    System.out.println("done sen To All");
                }
            }
        }
    }
    // Main
    public static void main(String []args) throws IOException
    {
        new Server(8015);
    }
}

class ThreadHandler implements Runnable
{
    private Socket incoming;
    private Server serverP;

    public ThreadHandler(Server server, Socket socket)
    {
        serverP = server;
        incoming = socket;
    }

    public synchronized void run()
    {
        try
        {
            try
            {

                InputStream inStream = incoming.getInputStream();
                OutputStream outStream = incoming.getOutputStream();

                Scanner in = new Scanner(inStream);
                PrintWriter out = new PrintWriter(outStream,true);

                out.println("TungAnh'Server");
                String message = in.nextLine();
                serverP.sendToAll(message);

                out.println("receieve: "+message);
                out.println("done");
                System.out.println("current Stream: "+ outStream);
                System.out.println("PrinWriter "+ out);

            }
            finally
            {
                incoming.close();
            }
        }
        catch(IOException e)
        {
            e.printStackTrace();
        }
    }
}

我稍微改进了您的代码:

  • 奇怪的日志删除
  • 添加了实例管理
  • 添加了一些关闭的流
  • 如果您要使用我的代码,您肯定应该看看同步(我的方法是同步的,但它们应该与相同的锁定对象/类同步)和异常处理。我不能在这个问题上花更多的时间,对此表示抱歉

    结果(对我有效):

    封装测试;
    导入java.io.IOException;
    导入java.io.InputStream;
    导入java.io.OutputStream;
    导入java.io.PrintWriter;
    导入java.net.ServerSocket;
    导入java.net.Socket;
    导入java.util.ArrayList;
    导入java.util.List;
    导入java.util.Scanner;
    公共类服务器
    {
    专用服务器;
    //建造师
    公共服务器(int端口)引发IOException
    {
    监听(端口);
    }
    //倾听法
    公共void侦听(int端口)引发IOException
    {
    s=新服务器套接字(端口);
    while(true)
    {
    套接字传入=s.accept();
    Runnable r=新线程处理程序(此,传入);
    螺纹t=新螺纹(r);
    t、 start();
    }
    }
    //主要
    公共静态void main(字符串[]args)引发IOException
    {
    新服务器(8015);
    }
    }
    类ThreadHandler实现可运行
    {
    专用插座输入;
    私有静态列表实例=new ArrayList();
    公共同步的void addInstance(){
    实例。添加(此);
    }
    公共同步的无效抗议(){
    实例。移除(此);
    }
    公共线程处理程序(服务器、套接字)
    {
    输入=插座;
    附加值();
    }
    public synchronized void sendToAll(字符串msg,ThreadHandler me){
    for(ThreadHandler h:实例){
    如果(h==me)继续;
    OutputStream outStream=null;
    PrintWriter print=null;
    试一试{
    outStream=h.incoming.getOutputStream();
    print=新的PrintWriter(扩展);
    print.println(msg);
    print.flush();
    }捕获(IOE异常){
    //TODO自动生成的捕捉块
    e、 printStackTrace();
    }
    }
    }
    公共同步的无效运行()
    {
    尝试
    {
    尝试
    {
    InputStream inStream=传入的.getInputStream();
    OutputStream outStream=传入的.getOutputStream();
    扫描仪输入=空;
    试一试{
    in=新扫描仪(流内);
    PrintWriter out=新的PrintWriter(超出流,为真);
    println(“Vojta的服务器”);
    while(true){
    试一试{
    String message=in.nextLine();
    sendToAll(消息,此);
    }捕获(例外e){
    }
    }
    }捕获(例外e){
    }
    最后{
    if(in!=null){
    in.close();
    }
    }
    }
    最后
    {
    incoming.close();
    }
    }
    捕获(IOE异常)
    {
    e、 printStackTrace();
    }最后{
    劝诫();
    }
    }
    }
    
    它到底做什么?你到底希望它做什么?但是这行不能工作outp.println(“sent”+message);我打印从客户机流中获得的流:java.net。SocketOutputStream@29e067PrinWriter java.io。PrintWriter@a9dde对所有当前流执行sen:java.net。SocketOutputStream@29e067PrinWriter java.io。PrintWriter@166f45etwo流是相同的,但我不能在上面写你可以在你的计算机上测试cmd->telnet localhost 8015->按Enter键,我经常使用EclipseThank,但是你能告诉我为什么我的代码不能正常工作吗!
    package test;
    
    import java.io.IOException;
    import java.io.InputStream;
    import java.io.OutputStream;
    import java.io.PrintWriter;
    import java.net.ServerSocket;
    import java.net.Socket;
    import java.util.ArrayList;
    import java.util.List;
    import java.util.Scanner;
    
    public class Server 
    {
    
        private ServerSocket s;
    
        //Constructor
        public Server(int port) throws IOException
        {
            listen(port);
        }
        //Listen method
        public void listen(int port) throws IOException
        {
            s = new ServerSocket(port);
    
            while(true)
            {
                Socket incoming = s.accept();
                Runnable r = new ThreadHandler(this,incoming);
                Thread t = new Thread(r);
                t.start();
            }
        }
    
        // Main
        public static void main(String []args) throws IOException
        {
            new Server(8015);
        }
    }
    
    class ThreadHandler implements Runnable
    {
        private Socket incoming;
    
        private static List<ThreadHandler> instances = new ArrayList<ThreadHandler>();
    
        public synchronized void addInstance() {
            instances.add(this);
        }
    
        public synchronized void removeInstance() {
            instances.remove(this);
        }
    
        public ThreadHandler(Server server, Socket socket)
        {
            incoming = socket;
            addInstance();
        }
    
        public synchronized void sendToAll(String msg, ThreadHandler me) {
            for (ThreadHandler h : instances) {
                if (h == me) continue;
    
                OutputStream outStream = null;
                PrintWriter print = null;
                try {
                    outStream = h.incoming.getOutputStream();
                    print = new PrintWriter(outStream);
                    print.println(msg);
                    print.flush();
                } catch (IOException e) {
                    // TODO Auto-generated catch block
                    e.printStackTrace();
                }
            }
        }
    
        public synchronized void run()
        {
            try
            {
                try
                {
    
                    InputStream inStream = incoming.getInputStream();
                    OutputStream outStream = incoming.getOutputStream();
    
                    Scanner in = null;
                    try {
                        in = new Scanner(inStream);
    
                        PrintWriter out = new PrintWriter(outStream,true);
    
                        out.println("Vojta's Server");
    
                        while (true) {
                            try {
                                String message = in.nextLine();
                                sendToAll(message, this);
                            } catch (Exception e) {
    
                            }
    
                        }
    
    
                    } catch (Exception e) {
    
                    }
                    finally {
                        if (in != null) {
                            in.close();
                        }
                    }
                }
                finally
                {
                    incoming.close();
                }
            }
            catch(IOException e)
            {
                e.printStackTrace();
            } finally {
                removeInstance();
            }
        }
    }