0

1.我是java新手,所以我是菜鸟,但我试图让这个聊天服务器和客户端到目前为止服务器将运行但客户端不会并返回标题中的错误请帮助并尝试保持它对菜鸟友好:)

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

@SuppressWarnings("serial")
class chatClient extends Frame implements Runnable
{
Socket soc;    
TextField tf;
TextArea ta;
Button btnSend,btnClose;
String sendTo;
String LoginName;
Thread t=null;
DataOutputStream dout;
DataInputStream din;
chatClient(String LoginName,String chatwith) throws Exception
{
    super(LoginName);
    this.LoginName=LoginName;
    sendTo=chatwith;
    tf=new TextField(50);
    ta=new TextArea(50,50);
    btnSend=new Button("Send");
    btnClose=new Button("Close");
    soc=new Socket("127.0.0.1",5211);

    din=new DataInputStream(soc.getInputStream()); 
    dout=new DataOutputStream(soc.getOutputStream());        
    dout.writeUTF(LoginName);

    t=new Thread(this);
    t.start();

}
@SuppressWarnings("deprecation")
void setup()
{
    setSize(600,400);
    setLayout(new GridLayout(2,1));

    add(ta);
    Panel p=new Panel();

    p.add(tf);
    p.add(btnSend);
    p.add(btnClose);
    add(p);
    show();        
}
@SuppressWarnings("deprecation")
public boolean action(Event e,Object o)
{
    if(e.arg.equals("Send"))
    {
        try
        {
            dout.writeUTF(sendTo + " "  + "DATA" + " " + tf.getText().toString());            
            ta.append("\n" + LoginName + " Says:" + tf.getText().toString());    
            tf.setText("");
        }
        catch(Exception ex)
        {
        }    
    }
    else if(e.arg.equals("Close"))
    {
        try
        {
            dout.writeUTF(LoginName + " LOGOUT");
            System.exit(1);
        }
        catch(Exception ex)
        {
        }

    }

    return super.action(e,o);
}
public static void main(String[] args) throws Exception
{
    chatClient Client=new chatClient(args[0], args[1]);
    Client.setup();                
}    
public void run()
{        
    while(true)
    {
        try
        {
            ta.append( "\n" + sendTo + " Says :" + din.readUTF());

        }
        catch(Exception ex)
        {
            ex.printStackTrace();
        }
    }
}
}
4

3 回答 3

0

实例化 chatClient 对象时,您要从 args 数组中指定两个元素:

chatClient Client=new chatClient(args[0], args[1]);

该数组是从命令行参数填充的。您必须在调用程序时指定它们,否则数组将为空:

java chatClient arg1 arg2

您可以在此处阅读有关指定命令行参数的更多信息。

作为旁注,请考虑重命名您的类,使其遵循命名约定

类名应该是名词,大小写混合,每个内部单词的首字母大写。尽量保持你的类名简单和描述性。使用完整的单词——避免使用首字母缩写词和缩写词(除非缩写词比长格式更广泛地使用,例如 URL 或 HTML)。

于 2013-11-05T20:12:45.533 回答
0

我怀疑你是从以下开始的:

java chatClient

您需要指定登录名以及要与谁聊天,例如

java chatClient fred george

否则args将是一个空数组,因此评估args[0]or args[1]inmain将失败。

我还强烈建议您修复缩进和命名 - 遵循标准Java 命名约定

于 2013-11-05T19:59:43.557 回答
0

程序中唯一的数组似乎argsmain. 如果您不输入任何命令行参数,那么数组将是 length 0,并且没有要访问的元素。

您需要两个参数,因此在访问它之前检查数组的长度。

if (args.length >= 2)
{
    chatClient Client=new chatClient(args[0], args[1]);
    Client.setup();   
}
else
{
    // Handle error.
}
于 2013-11-05T20:00:06.937 回答