#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.