Java, сокет, отправка сообщений

#java #sockets #client-server #chat

#java #сокеты #клиент-сервер #Чат

Вопрос:

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

у меня есть два файла, «cl.java » является ли клиент , «server.java » это сервер.

ЧТО Я ПЫТАЮСЬ СДЕЛАТЬ?

клиент отправляет сообщение другому клиенту с запросом игры, это начальное сообщение не запускается в моем коде, я думаю, что я не могу использовать clientThread.sendText(un " iWantToPlay"); вне класса ConnectThread

ЧТО ТЫ ДУМАЕШЬ?

ошибка возникает в этом коде:

         public void sendText(String text) {
        try {
            oos.writeObject(text);

        } catch (IOException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }
    }
  

с помощью oos.writeObject(text);

это Server.java

 import java.io.IOException;
import java.io.InputStream;
import java.io.ObjectInputStream;
import java.io.ObjectOutputStream;
import java.io.OutputStream;
import java.net.ServerSocket;
import java.net.Socket;
import java.util.ArrayList;

public class Server {

ServerSocket serverSocket;
ArrayList<ServerThread> allClients = new ArrayList<ServerThread>();

public static void main(String[] args) {
    new Server();

}

public Server() {
    // ServerSocket is only opened once !!!

    try {
        serverSocket = new ServerSocket(6000);

        System.out.println("Waiting on port 6000...");
        boolean connected = true;

        // this method will block until a client will call me
        while (connected) {
            Socket singleClient = serverSocket.accept();
            // add to the list
            ServerThread myThread = new ServerThread(singleClient);
            allClients.add(myThread);
            myThread.start();
        }

        // here we also close the main server socket
        serverSocket.close();
    } catch (IOException e) {
        // TODO Auto-generated catch block
        e.printStackTrace();
    }

}

class ServerThread extends Thread {
    Socket threadSocket;
    String msg;
    boolean isClientConnected;
    InputStream input;
    ObjectInputStream ois;
    OutputStream output;
    ObjectOutputStream oos; // ObjectOutputStream

    public ServerThread(Socket s) {
        threadSocket = s;
    }

    public void sendText(String text) {
        try {
            oos.writeObject(text);
        } catch (IOException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }
    }

    public void run() {

        try {
            input = threadSocket.getInputStream();
            ois = new ObjectInputStream(input);
            output = threadSocket.getOutputStream();
            oos = new ObjectOutputStream(output);

            // get the user name from the client and store
            // it inside thread class for later use
            // msg = (String) ois.readObject();
            msg = (String) ois.readObject();

            for (ServerThread t : allClients)
                t.sendText(msg);

            isClientConnected = true;
            System.out.println("connect ... ");

            // System.out.println(msg);
            // for(ServerThread t:allClients)
            // t.sendText("User has connected...");

            // send this information to all users
            // dos.writeUTF(userName   " has connected..");
            // for(ServerThread t:allClients)
            // t.sendText(msg);

            while (isClientConnected) {

                try {
                    msg = (String) ois.readObject();
                    System.out.println(msg);

                    for (ServerThread t : allClients)
                        t.sendText(msg);
                } catch (Exception e) {

                }
            }
            // close all resources (streams and sockets)
            ois.close();
            oos.close();
            threadSocket.close();

        } catch (Exception e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }
    }
}
  

}

это cl.java

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

public class cl {
public static final String HOST = "127.0.0.1";
public static final int PORT = 6000;

static ConnectThread clientThread;
boolean isConnected;

static boolean isOnline = false;
static Scanner scanner = new Scanner(System.in);
static String msg;
static String un;
static String op = "none";
static int turn = 1;

public static void main(String[] args) {
    boolean running = true;

    System.out.print("Enter a username: ");
    un = scanner.nextLine();

    System.out.print("invite or wait ?");
    msg = scanner.nextLine();

    if (msg.equalsIgnoreCase("invite")) {
        System.out.print("Enter an opponent: ");
        op = scanner.nextLine();
    }

    new cl();

    if (op.equalsIgnoreCase("amjad")) {
        clientThread.sendText(un   " iWantToPlay");
    }


}

public String getWord(String line,int i) {
    String arr[] = line.split(" ", 2);
 return arr[i];

}

public cl() {
    connectUser();
}

public void connectUser() {
    clientThread = new ConnectThread();
    clientThread.start();

}

class ConnectThread extends Thread {
    InputStream input;
    OutputStream output;
    ObjectOutputStream oos;
    Socket s;

    public void sendText(String text) {
        try {
            oos.writeObject(text);

        } catch (IOException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }
    }

    public void run() {
        try {
            s = new Socket(HOST, PORT);
            output = s.getOutputStream();
            oos = new ObjectOutputStream(output);

            isOnline = true;
            isConnected = true;

            new ListenThread(s).start();

/*              while (isOnline) {
                    msg = scanner.nextLine();
                    clientThread.sendText(un   ": "   msg);
                }
*/
        } catch (UnknownHostException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        } catch (IOException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }
    }
}

class ListenThread extends Thread {

    Socket s;
    InputStream input;
    ObjectInputStream ois;

    public ListenThread(Socket s) {
        this.s = s;
        try {
            input = s.getInputStream();
            ois = new ObjectInputStream(input);
        } catch (IOException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }

    }

    public void run() {
        while (isConnected) {
            try {
                final String inputMessage = (String) ois.readObject();
                String user;
                user = getWord(inputMessage,1);
                String message = getWord(inputMessage,2);

                /*if (!user.equals(un)) {
                    System.out.println(inputMessage);
                }*/

                if (message.equalsIgnoreCase("iwanttoplay")) {
                    System.out.println(user   " wants to play, accept? yn");
                    msg = scanner.nextLine();
                    clientThread.sendText(un   " "   msg);
                }
                else if (message.equalsIgnoreCase("yesiwanttoplay")) {
                    System.out.println(un   " accepted invitation, "    un   " against "   user);
                    turn = 1;
                    play(un,user);
                }
                else if (message.equalsIgnoreCase("noidontwanttoplay")) {
                    System.out.println(user   " denied invitation.. ");
                }
                else if (message.equalsIgnoreCase("x") || message.equalsIgnoreCase("o")) {
                    System.out.println(user   " played .. "   message);
                    turn = 1;
                    play(un,user);
                }
            } catch (Exception e) {
                // TODO Auto-generated catch block
                e.printStackTrace();
            }

        }
    }
}

public void play(String me, String him) {
    if (turn == 1) {
        System.out.println("your turn,... play a move..x or o ..");
        msg = scanner.nextLine();
        clientThread.sendText(un   " "   msg);
        turn = 2;
    }
}
  

}

это моя ошибка

 Exception in thread "main" java.lang.NullPointerException
at cl$ConnectThread.sendText(cl.java:68)
at cl.main(cl.java:38)
  

Комментарии:

1. Подсказка: всякий раз, когда вы видите «NullPointerException», это обычно означает, что одна из ваших переменных имеет значение null, и что-то пытается вызвать метод с нулевым значением. В этом случае clientThread.SendText выдает эту ошибку, потому что вы никогда не создавали экземпляр clientThread = new ClientThread();

Ответ №1:

xception в потоке «main» java.lang.Исключение NullPointerException в cl$ConnectThread.SendText(cl.java:68)

Вы должны быть в состоянии понять это самостоятельно. Рассматриваемая строка выглядит следующим образом

 oos.writeObject(text);
  

и так ясно oos , что в этот момент значение равно нулю.

Вам не нужен StackOverflow для сортировки NullPointerExceptions.