需要服务器和链接列表帮助

时间:2010-02-07 10:40:52

标签: java sockets

基本上我已经构建了一个多个客户端可以连接的套接字服务器,当它们向服务器发送消息时,它被发送到每个其他客户端。问题是它还没有运作。我需要整理出“SingletonClients”和“getClients”,这样他们就可以返回所有已连接的用户,以便我向他们发送消息。这只是一个基本问题,但我根本不知道怎么做,这是我正在做的学生项目的最后一部分(主要部分是Obj-C客户端而不是Java服务器)。如果有人能为我做,那么我会永远感激。

到目前为止,这是代码:

import java.awt.Color;
import java.awt.BorderLayout;
import java.awt.event.*;
import javax.swing.*;
import java.util.LinkedList;
import java.io.*;
import java.net.*;

class ClientWorker implements Runnable {
    private Socket client;
    private JTextArea textArea;
    BufferedReader in = null;
    PrintWriter out;

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

        String line = in.readLine();
        LinkedList<ClientWorker> clients = SingletonClients.getClients();
        for(int i = 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);
        }

    }

    public void writeString(String s) {
        try {
            out.println(s);
        } catch(IOException ex) {
        }
    }

    public void run(){
        String line;
        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();
    }
}

提前致谢!

2 个答案:

答案 0 :(得分:1)

LinkedList<ClientWorker> clients = SingletonClients.getClients();

由于您似乎需要返回ClientWorker集合的内容,因此我建议您查看代码以查找创建ClientWorkers的位置并尝试将它们放入集合中。

这有意义吗?

答案 1 :(得分:0)

您需要注意ClientWorker课程的开头部分。在您的字段声明部分中,您声明了一些实例成员,如:

BufferedReader in = null;
PrintWriter out;

但是在构造函数中,您尝试使用它们而不首先初始化它们:

    String line = in.readLine(); //will throw a NullPointerException
    LinkedList<ClientWorker> clients = SingletonClients.getClients();
    for(int i = 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); //calls out.println, will throw a NullPointerException
    }

关于你的SingletonWorker,如果这是项目的一部分,你可能会被要求用Java制作一个单身人士。这不是什么大问题,但显然有一点需要确保 - 只允许在进程的生命周期中创建一个Singleton实例。看看here的一些想法。另一方面,如果SingletonWorker是你设计的帮助者,你可能最好关注@ willcodejavaforfood的领导并制作一个类型安全的LinkedList。

相关问题