2015-01-14 2 views
-4

Я пытаюсь изучить чат-сервер с несколькими клиентами. Поскольку я новичок в Java, я не могу запустить эти два .java-файла в Net beans. У меня есть два java-проекта и поместил в них эти файлы. Проект Сервер работает успешно, но проект клиент показывает:Как исправить этот индекс массива из исключения Bounds?

Exception in thread "main" java.lang.ArrayIndexOutOfBoundsException: 0 
at chatClient.main(chatClient.java:73) 

Заказчик проекта

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

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", 5217); 

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

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

    } 

    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(); 
    } 

    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 Client1 = new chatClient(args[0],args[1]); 
     Client1.setup(); 
    } 

    public void run() { 
     while (true) { 
      try { 
       ta.append("\n" + sendTo + " Says :" + din.readUTF()); 

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

Project Server

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

class chatServer { 

    static Vector ClientSockets; 
    static Vector LoginNames; 

    chatServer() throws Exception { 
     ServerSocket soc = new ServerSocket(5217); 
     ClientSockets = new Vector(); 
     LoginNames = new Vector(); 

     while (true) { 
      Socket CSoc = soc.accept(); 
      AcceptClient obClient = new AcceptClient(CSoc); 
     } 
    } 

    public static void main(String args[]) throws Exception { 

     chatServer ob = new chatServer(); 
    } 

    class AcceptClient extends Thread { 

     Socket ClientSocket; 
     DataInputStream din; 
     DataOutputStream dout; 

     AcceptClient(Socket CSoc) throws Exception { 
      ClientSocket = CSoc; 

      din = new DataInputStream(ClientSocket.getInputStream()); 
      dout = new DataOutputStream(ClientSocket.getOutputStream()); 

      String LoginName = din.readUTF(); 

      System.out.println("User Logged In :" + LoginName); 
      LoginNames.add(LoginName); 
      ClientSockets.add(ClientSocket); 
      start(); 
     } 

     public void run() { 
      while (true) { 

       try { 
        String msgFromClient = new String(); 
        msgFromClient = din.readUTF(); 
        StringTokenizer st = new StringTokenizer(msgFromClient); 
        String Sendto = st.nextToken(); 
        String MsgType = st.nextToken(); 
        int iCount = 0; 

        if (MsgType.equals("LOGOUT")) { 
         for (iCount = 0; iCount < LoginNames.size(); iCount++) { 
          if (LoginNames.elementAt(iCount).equals(Sendto)) { 
           LoginNames.removeElementAt(iCount); 
           ClientSockets.removeElementAt(iCount); 
           System.out.println("User " + Sendto + " Logged Out ..."); 
           break; 
          } 
         } 

        } else { 
         String msg = ""; 
         while (st.hasMoreTokens()) { 
          msg = msg + " " + st.nextToken(); 
         } 
         for (iCount = 0; iCount < LoginNames.size(); iCount++) { 
          if (LoginNames.elementAt(iCount).equals(Sendto)) { 
           Socket tSoc = (Socket) ClientSockets.elementAt(iCount); 
           DataOutputStream tdout = new DataOutputStream(tSoc.getOutputStream()); 
           tdout.writeUTF(msg); 
           break; 
          } 
         } 
         if (iCount == LoginNames.size()) { 
          dout.writeUTF("I am offline"); 
         } else { 

         } 
        } 
        if (MsgType.equals("LOGOUT")) { 
         break; 
        } 

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

      } 
     } 
    } 
} 

Спасибо заранее.

+0

Возможно, вы, вероятно, не указывайте аргументы 'args [0], args [1]', поэтому вы получаете исключение, потому что 'args' пуст. – t3chb0t

+0

как отмечено в @ t3chb0t, вы можете проверить' args.length' перед тем, как читать это –

+0

Какая строка является строкой '73' в' chatClient'? – Jens

ответ

1

Если вы посмотрите на конструкторе вашего клиента, вы увидите, что он требует два аргумента:

chatClient(String LoginName, String chatwith) 

логина и с кем общаться.

Я думаю, что вы не задаете их так следующая строка вызывает исключение, потому что их нет и args пуст:

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

Вы можете запустить ее из командной строки, чтобы получить аргументы – CaffeineToCode

+0

Вы также можете прочитать что-то о [Использование аргументов командной строки в среде IDE NetBeans] (http://netbeanside61.blogspot.de/2009/02/using-command-line-arguments-in.html) – t3chb0t

0

Аргументы Java вы проходите из командной строки, на самом деле массив строки. Если вы не вводите ничего в командную строку (или эквивалент NetBeans, вы получите исключение ArrrayIndexOutOfBoundsException, поэтому вы получите исключение, потому что пытаетесь передать массив строк в метод chatClient без фактических аргументов.