为什么我在服务器/客户端聊天室程序中收到这些错误?

时间:2014-09-24 01:13:20

标签: java

我已经在这个程序上工作了几个小时,所以我已经脑子里死了,无法弄清楚为什么我会收到这些错误。对于Java编程来说相当新,对我的情况也没有多大帮助。

On line 27 - "error: method Add in class ClientManager cannot be applied to given types;"
On line 34 - "error: cannot find symbol"
Also line 34 - "error: cannot find symbol"
On line 42 - "error: cannot find symbol"

现在这里是我的代码段的特定行:

Line 27 - CM.Add();
Line 34 - MyClient Client = new MyClient(Socket, CM);
Line 42 - Client.SendToAllClients(S);

这是我的Server类的完整代码。客户端类完美运行。

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

public class Server 
{

    public static void main(String[] args) throws Exception
    {
        new MyServer().start();
    }   
}

class MyServer extends Thread
{
    ServerSocket SS = new ServerSocket(11200);
    Socket S;
    ClientManager CM = new ClientManager();

    public void run()
    {
        while(true)
        {
            S = SS.accept();
            CM.Add();
        }
    }
}

class MyClient extends Thread
{
    MyClient Client = new MyClient(Socket, CM);
    Scanner S;

    public void run()
    {
        while(true)
        {
            S = new Scanner(System.in);
            Client.SendToAllClients(S);
        }
    }

    public void Send(String S)
    {
        PrintWriter.println(S);
    }       
}

class ClientManager
{
    MyClient[] X = new MyClient[15];
    int num = 0;

    public synchronized void Add(MyClient C)
    {
        X[num] = C;
        num++;
        C.start();
    }

    public synchronized void SendToAllClient(String S)
    {
        int i;
        for(i = 0;i < num;i++);
        {
            X[i].Send(S);
        }
    }   
}

更新:我不确定需要在CM.Add();

中输入什么参数

1 个答案:

答案 0 :(得分:1)

我可以告诉你为什么会收到这些错误。您需要了解它,然后根据您的需要进行更改。

Line 27 - CM.Add();

在你的ClientManager类中,方法的签名是public synchronized void Add(MyClient C)所以你可以看到,它需要一个参数,即类MyClient的对象,但是当你调用这个方法时,你没有传递任何参数

MyClient Client = new MyClient(Socket, CM);

在这一行中你试图创建类MyClient的对象并传递两个参数Socket和CM对象但是在你的类MyClient中你没有创建任何这样的构造函数,它将接受两个参数,默认情况下会有只有默认构造函数,如果要传递参数,可以调用类似new MyClient();的构造函数,然后需要创建自己的参数化构造函数。

Client.SendToAllClients(S);

此处Client是类MyClient的对象,方法SendToAllClients(s)出现在ClientManager类中,如果要调用此方法,则需要一个对象ClientManager类,您无法使用MyClient的对象调用它。


除了它,我想告诉你,你没有遵循Java的命名约定。遵循命名约定是一种很好的做法,它可以帮助其他人轻松理解您的代码。 Check this link