Java聊天系统

Java聊天系统,java,sockets,chat,Java,Sockets,Chat,我在广播每个客户端发送的消息时遇到问题。服务器可以从多个客户端接收每条消息,但不能广播。错误消息说连接被拒绝 客户: 服务器: import java.io.*; import java.net.*; import java.util.*; public class RelayChatServer { public static int port = 44442; ServerSocket server; public void listenSocket(){ try{ serve

我在广播每个客户端发送的消息时遇到问题。服务器可以从多个客户端接收每条消息,但不能广播。错误消息说连接被拒绝 客户:

服务器:

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

public class RelayChatServer {
public static int port = 44442;
ServerSocket server;
public void listenSocket(){
  try{
    server = new ServerSocket(port);
  } catch (IOException e) {
    System.out.println("Could not listen on port 4444");
    System.exit(-1);
  }
  while(true){
    ClientWorker w;
    try{
//server.accept returns a client connection
      w = new ClientWorker(server.accept());
      Thread t = new Thread(w);
      t.start();
    } catch (IOException e) {
      System.out.println("Accept failed: 4444");
      System.exit(-1);
    }
  }
}

protected void finalize(){
    //Objects created in run method are finalized when
    //program terminates and thread exits
         try{
            server.close();
        } catch (IOException e) {
            System.out.println("Could not close socket");
            System.exit(-1);
        }
      }

public static void main(String[] args) {
    new RelayChatServer().listenSocket();
}
}


异常开始:

java.net.ConnectException: Connection refused: connect
扩展的输出如下所示:


我有点困惑,为什么您试图根据从文件中读取的字符串打开一个新套接字(是否打算将其发送回客户端?)。或许

s = new Socket(strLine, 44441);
prnt = new PrintWriter(s.getOutputStream(),true);
应该是:

prnt = new PrintWriter(client.getOutputStream(),true);
目前,我看不到您将向客户端发送任何内容

编辑:确定尝试以下操作:

static final ArrayList<ClientWorker> connectedClients = new ArrayList<ClientWorker>();
class ClientWorker implements Runnable {

    private Socket socket;
    private PrintWriter writer;

    ClientWorker(Socket socket) {
        this.socket = socket;
        try {
            this.writer = new PrintWriter(socket.getOutputStream(), true);
        } catch (IOException ex) { /* do something sensible */ }
    }

    public void run() {
        synchronized(connectedClients) {
            connectedClients.add(this);
        }

        BufferedReader in = null;
        try {
            in = new BufferedReader(new InputStreamReader(socket.getInputStream()));
        } catch (IOException e) { /* do something sensible */ }

        while (true) {
            try {
                String line = in.readLine();
                if (line != null && line != "") {
                    synchronized (connectedClients) {
                        for (int i = 0; i < connectedClients.size(); ++i){
                            ClientWorker client = connectedClients.get(i);
                            client.writer.println(line);
                        }
                    }
                }
            } catch (IOException e) { /* do something sensible */ }
        }
    }
}
static final ArrayList connectedClients=new ArrayList();
类ClientWorker实现Runnable{
专用插座;
私人版画作家;
客户工人(插座){
this.socket=socket;
试一试{
this.writer=新的PrintWriter(socket.getOutputStream(),true);
}catch(IOException ex){/*做点明智的事*/}
}
公开募捐{
已同步(已连接客户端){
已连接的客户端。添加(此);
}
BufferedReader in=null;
试一试{
in=新的BufferedReader(新的InputStreamReader(socket.getInputStream());
}捕获(IOE){/*做一些明智的事情*/}
while(true){
试一试{
String line=in.readLine();
if(line!=null&&line!=“”){
已同步(已连接客户端){
对于(int i=0;i
错误消息显示连接被拒绝客户端:您能提供堆栈跟踪吗?@jayp:注意,从命令行复制/粘贴要比包含相同的映像有用得多。您知道如何从Windows CLI复制吗?嗯。。好。请注意,您可以随时编辑问题以包含该信息。请随意覆盖我转录输出第1行的编辑。(提示大提示)我忘了说,我有一个文件。它有连接到服务器的客户端的主机地址,我将套接字连接到每个客户端以广播消息。如果我将其设置为client.getOutputStream(),我认为它会将消息发送到它自己OK,如果客户端安装了防火墙,则创建新的连接回客户端可能会有问题。这可能就是您看到连接被拒绝错误的原因。相反,当连接被接受时,您会希望为每个客户端使用套接字对象。对不起,我只是个初学者。@我的客户端正在等待服务器发送一些东西。如果我没有设置新连接,那么我只能将消息发送给发件人,而不能发送给其他人。我很困惑@改为多播更好吗?@@我会避免多播。看看我上面的编辑,它可能会为你提供一些关于如何使用你当前的课程来实现这一点的想法。。。
prnt = new PrintWriter(client.getOutputStream(),true);
static final ArrayList<ClientWorker> connectedClients = new ArrayList<ClientWorker>();
class ClientWorker implements Runnable {

    private Socket socket;
    private PrintWriter writer;

    ClientWorker(Socket socket) {
        this.socket = socket;
        try {
            this.writer = new PrintWriter(socket.getOutputStream(), true);
        } catch (IOException ex) { /* do something sensible */ }
    }

    public void run() {
        synchronized(connectedClients) {
            connectedClients.add(this);
        }

        BufferedReader in = null;
        try {
            in = new BufferedReader(new InputStreamReader(socket.getInputStream()));
        } catch (IOException e) { /* do something sensible */ }

        while (true) {
            try {
                String line = in.readLine();
                if (line != null && line != "") {
                    synchronized (connectedClients) {
                        for (int i = 0; i < connectedClients.size(); ++i){
                            ClientWorker client = connectedClients.get(i);
                            client.writer.println(line);
                        }
                    }
                }
            } catch (IOException e) { /* do something sensible */ }
        }
    }
}