Java服务器帮助!

标签 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 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() 中)。然后,每当新数据到达时,服务器应遍历列表并将数据分派(dispatch)给每个线程/客户端(在您的主循环中)。

关于Java服务器帮助!,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2200036/

相关文章:

java - hazelcast IMap 只能用于锁定目的吗?

java - HashSet 迭代器检查字母

java - 如何使用Sockets TCP在java和android之间正确传递对象?

python - 将 BaseHTTPRequestHandler 与 UnixStreamServer 一起使用会导致异常

python - 为什么我的代码在函数中连接服务器时不起作用,但当我使用 __init__ 调用连接时却工作正常?

java - Hibernate & Tomcat - 不会关闭套接字

java - 在 Solaris SPARC 上安装 Jenkins

java - JVM迁移到jdk1.8.0_74后挂了

java - 升级到 Java 11 后 JAXBContext 上的 ClassCastException

php - 我的PHP脚本无法连接到IRC服务器