У меня небольшая проблема. Я пытаюсь использовать метод в другом классе для отправки объекта на сервер, который у меня есть. Я использую Java с сокетами.
Метод:
public void sendMessageToServer(String message) {
if (message != null) {
try {
serverComManager.outputStream.writeObject(message);
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
Класс пытается использовать метод:
sendMessage.sendMessageToServer("Hello");
Ошибка выводится на строку:
serverComManager.outputStream.writeObject(message);
Заранее спасибо! ~ Rane
EDIT: по запросу я добавил объявление serverComManager, а также код для этого класса. Я также включил полную ошибку. Надеюсь, это поможет вам понять мою проблему.
Декларация:
ServerCommunicationManager serverComManager = new ServerCommunicationManager();
Код для ServerCommunicationManager:
boolean connected;
//Setup
Socket clientSocket;
ObjectOutputStream outputStream;
ObjectInputStream inputStream;
public boolean connectToHost() throws UnknownHostException, IOException{
clientSocket = new Socket("localhost", 2444);
setupStreams(clientSocket);
if(clientSocket.isConnected()){
connected = true;
}else{
connected = false;
}
return connected;
}
private void setupStreams(Socket s) throws IOException{
outputStream = new ObjectOutputStream(s.getOutputStream());
inputStream = new ObjectInputStream(s.getInputStream());
}
Ошибка:
Exception java.lang.NullPointerException
at SendToServer.sendMessageToServer(SendToServer.java:16)
at DissconnectClient.dissconnectFromServer(DissconnectClient.java:15)
Строки ошибок:
DissconnectClient 15: sendMessage.sendMessageToServer(abortConnectionKeyword);
SendToServer 16: serverComManager.outputStream.writeObject(message);
ПРИМЕЧАНИЕ. DisconnectClient - один из классов, с которыми я пишу. Вот код класса:
public class DissconnectClient {
//Variables
private final String keyword = "DISSCONNECT";
//Setup
SendToServer sendMessage = new SendToServer();
public void dissconnectFromServer(){
sendMessage.sendMessageToServer(keyword);
}
}
Я не вижу, где вы назначаете значение "serverComManager" или где вы создаете isntance этого. Возможно, в методе конструктора класса, который имеет метод "sendMessageToServer", вы делаете что-то вроде this.serverComManager = (...). Я не уверен, как вы обрабатываете логику "serverComManager", но до сих пор мой подход к решению проблемы был следующим (если я пишу клиент, который отправляет сообщение на сервер). И учитывая, что для вашего "serverConnManager" не предусмотрен код, возможно, вы могли бы идентифицировать что-то, отсутствующее в вашей текущей реализации.
public void sendMessageToServer(String message) {
if (message != null) {
try {
//Assume I already have an instance of client Socket:
//Socket outgoingConn = new Socket(host, port)
//1. I get the OutputStream of my outgoing connection
OutputStream outStream = outgoingConn.getOutputStream();
//2. Create an object output stream
ObjectOutputStream objectWriter = new ObjectOutputStream(outStream);
//3. Write the object
objectWriter.writeObject(message);
//Close the io if required (would recommend try-with-resources if using jdk7)
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
Если вы работаете только со строковыми сообщениями, BufferedWriter orBufferedReadr будет достаточно, если вы попытаетесь обработать сложные объекты, которые могут быть как "beans", так и Strings, лучше, если вы создадите что-то вроде:
public class MessageBean implements Serializable {
private MessageType type;
private Object param;
//Getters/Setters
}
MessageType может быть перечислением, указывающим тип поддерживаемых объектов, поскольку поле param - это объект, который вы можете обрабатывать как String или как bean-компонент. Затем работайте на основе MessageType или с помощью "instanceof". Но, это всего лишь предложение, если вы хотите попробовать что-то еще.
Надеюсь, поможет. Счастливое кодирование!
С уважением.