Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/sockets/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java服务器帮助!_Java_Sockets - Fatal编程技术网

Java服务器帮助!

Java服务器帮助!,java,sockets,Java,Sockets,我按照一个教程创建了下面的套接字服务器,它允许多个用户连接,如果他们向它发送一些数据,它会将数据返回给他们 import java.awt.Color; import java.awt.BorderLayout; import java.awt.event.*; import javax.swing.*; import java.io.*; import java.net.*; class ClientWorker implements

我按照一个教程创建了下面的套接字服务器,它允许多个用户连接,如果他们向它发送一些数据,它会将数据返回给他们

   import java.awt.Color;
    import java.awt.BorderLayout;
    import java.awt.event.*;
    import javax.swing.*;

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

    class ClientWorker implements Runnable {
      private Socket client;
      private JTextArea textArea;

      ClientWorker(Socket client, JTextArea textArea) {
       this.client = client;
       this.textArea = textArea;   
      }

      public void run(){
        String line;
        BufferedReader in = null;
        PrintWriter out = null;
        try{
          in = new BufferedReader(new InputStreamReader(client.getInputStream()));
          out = new PrintWriter(client.getOutputStream(), true);
        } catch (IOException e) {
          System.out.println("in or out failed");
          System.exit(-1);
        }

        while(true){
          try{
            line = in.readLine();
    //Send data back to client
             out.println(line);
             textArea.append(line);
           } catch (IOException e) {
             System.out.println("Read failed");
             System.exit(-1);
           }
        }
      }
    }



----------


    class SocketThrdServer extends JFrame{

       JLabel label = new JLabel("Text received over socket:");
       JPanel panel;
       JTextArea textArea = new JTextArea();
       ServerSocket server = null;

       SocketThrdServer(){ //Begin Constructor
         panel = new JPanel();
         panel.setLayout(new BorderLayout());
         panel.setBackground(Color.white);
         getContentPane().add(panel);
         panel.add("North", label);
         panel.add("Center", textArea);
       } //End Constructor

      public void listenSocket(){
        try{
          server = new ServerSocket(4444); 
        } catch (IOException e) {
          System.out.println("Could not listen on port 4444");
          System.exit(-1);
        }
        while(true){
          ClientWorker w;
          try{
            w = new ClientWorker(server.accept(), textArea);
            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){
            SocketThrdServer frame = new SocketThrdServer();
        frame.setTitle("Server Program");
            WindowListener l = new WindowAdapter() {
                    public void windowClosing(WindowEvent e) {
                            System.exit(0);
                    }
            };
            frame.addWindowListener(l);
            frame.pack();
            frame.setVisible(true);
            frame.listenSocket();
      }
    }
但是我需要它,所以如果数据被发送到服务器而不是简单地返回,它会将数据发送给连接到服务器的每个人。如果有人帮我解决这个问题,我将永远感激你!这意味着我将能够完成我的学校项目


提前感谢:)

好吧。。。我从哪里开始?首先,您可能希望了解数组或列表等动态结构。然后,您应该处理每个新的客户端请求,以便将客户端交给线程,然后添加到列表中(在
listenSocket()
中)。然后,每当新数据到达时,服务器应迭代列表并将数据发送到每个线程/客户机(在主循环中)。

那么。。。我从哪里开始?首先,您可能希望了解数组或列表等动态结构。然后,您应该处理每个新的客户端请求,以便将客户端交给线程,然后添加到列表中(在
listenSocket()
中)。然后,每当新数据到达时,服务器应迭代列表并将数据发送到每个线程/客户机(在主循环中)。

您需要跟踪数据结构(如
列表)中的所有客户机连接。然后,当服务器接收到输入时,它应该遍历所有客户端连接并输出它接收到的消息。

您需要在数据结构(如
列表)中跟踪所有客户端连接。然后,当服务器接收到输入时,它应该循环所有客户端连接并输出它接收到的消息。

这是您的问题:

//Send data back to client
out.println(line);
正如其他人所说,使用列表来跟踪所有客户。 具体来说,您需要一个ClientWorkers列表

我使用一个简单的单例类来保存列表。这样,当一个新客户机连接时,它将自己添加到列表中,而其他客户机不需要做任何事情就可以看到有一个新客户机。并向ClientWorker类添加一个类似writeString(String)的方法,以便更容易地向每个客户机写出内容

在ClientWorker中应该有这样一个非常基本的循环:

String line = in.readLine();
LinkedList<ClientWorkers> clients = SingletonClients.getClients();
for(int = 0; i < clients.size(); i++) {
    ClientWorker c = clients.get(i);
    //The client doesn't need to get it's own data back.
    if(c == this)
        continue;

    c.writeString(line);
}
这就是你的问题:

//Send data back to client
out.println(line);
正如其他人所说,使用列表来跟踪所有客户。 具体来说,您需要一个ClientWorkers列表

我使用一个简单的单例类来保存列表。这样,当一个新客户机连接时,它将自己添加到列表中,而其他客户机不需要做任何事情就可以看到有一个新客户机。并向ClientWorker类添加一个类似writeString(String)的方法,以便更容易地向每个客户机写出内容

在ClientWorker中应该有这样一个非常基本的循环:

String line = in.readLine();
LinkedList<ClientWorkers> clients = SingletonClients.getClients();
for(int = 0; i < clients.size(); i++) {
    ClientWorker c = clients.get(i);
    //The client doesn't need to get it's own data back.
    if(c == this)
        continue;

    c.writeString(line);
}

嘿,我们不是免费做的,你知道这不好笑。我正在尽我最大的努力来解决这个问题。嘿,我们不是免费做的,你知道这不好笑。我正在尽我最大的努力来解决这个问题。太好了!唯一让我有点困惑的是singleton类。你能详细说明一下吗?干杯:我不想解释Singleton,但是Wikipedia有关于它的信息,它有一个Java的例子。完美的唯一让我有点困惑的是singleton类。你能详细说明一下吗?干杯:我不想解释Singleton,但是Wikipedia有关于它的信息,它有一个Java的例子。