Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/382.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
服务器端Java错误_Java_Mobile - Fatal编程技术网

服务器端Java错误

服务器端Java错误,java,mobile,Java,Mobile,我制作了一个程序,从手机(JavaME)向服务器发送消息“test”。但是我在尝试调用服务器端的closeCrap()方法时出错 错误日志: 线程“main”java.lang.NullPointerException中出现异常 在server.closeCrap(server.java:106) 在server.startRunning(server.java:55) 在pagr.main(pagr.java:7) server.java import java.io.*; import ja

我制作了一个程序,从手机(JavaME)向服务器发送消息“test”。但是我在尝试调用服务器端的
closeCrap()
方法时出错

错误日志:

线程“main”java.lang.NullPointerException中出现异常
在server.closeCrap(server.java:106)
在server.startRunning(server.java:55)
在pagr.main(pagr.java:7)

server.java

import java.io.*;
import java.net.*;
import java.awt.*;
import java.awt.event.*;
import javax.swing.*;
public class server extends JFrame{
  private static final long serialVersionUID = 1L;
  private JTextField userText;
  private JTextArea chatWindow;
  private ObjectOutputStream output;
  private ObjectInputStream input;
  private ServerSocket server;
  private Socket connection;
  // constructor
  public server(){
    super("CP Chat");
    userText = new JTextField();
    userText.setEditable(false);
    userText.addActionListener(
      new ActionListener(){
        public void actionPerformed(ActionEvent event){
          sendMessage(event.getActionCommand());
          // nusius teksta ivesta
          userText.setText("");
        }
      }
    );
    add(userText,BorderLayout.NORTH);
    chatWindow = new JTextArea();
    chatWindow.setEditable(false);
    add(new JScrollPane(chatWindow));
    setSize(300,150);
    setVisible(true);
  }
  // set up and run a server
  public void startRunning(){
    try{
      // 1 arg - jungiasi prie port (gali buti betkoks)
      //2 - backLog (kiek zmoniu gali prisijungti prie port)
      server = new ServerSocket(6789,100);
      while(true){
        try{
          waitForConnection();
          setupStreams();
          whileChatting();
        }catch(EOFException exc){ // end of stream
          showMessage("\n Server ended the connection!");
        }finally{
          closeCrap();
        }
      }
    }catch(IOException ex){
      ex.printStackTrace();
    }
  }
  // wait for connection, then display connection info
  private void waitForConnection() throws IOException{
    showMessage("Waiting for someone to connect... \n");
    connection = server.accept();
    showMessage("Now connected to " + connection.getInetAddress().getHostName());
  }
  // get stream to send and receive data
  private void setupStreams() throws IOException{
    //creating path way to connect to another computer.
    output = new ObjectOutputStream(connection.getOutputStream());
    // flushes any left overs to the other pc while sending messages
    output.flush();
    input = new ObjectInputStream(connection.getInputStream());
    showMessage("\n Streams are now setup!\n");
  }
  //during the chat conversation
  private void whileChatting() throws IOException{
    String message = "You are now connected!";
    sendMessage(message);
    ableToType(true);
    do{
      try{
        // gauna atsiunciama zinute
        message = (String) input.readObject();
        showMessage("\n" + message);
      }catch(ClassNotFoundException notFound){
        showMessage("\n idk wtf that user send!");
      }
    }while(!message.equals("CLIENT - END"));
  }
  //close Streams and Sockets after youre done chatting
  private void closeCrap(){
    showMessage("\n Closing connection... \n");
    ableToType(false);
    try{
      output.close();
      input.close();
      connection.close();
    }catch(IOException except){
      except.printStackTrace();
    }
  }
  private void sendMessage(String message){
    try{
      // sends a message to client
      output.writeObject("SERVER - " + message);
      // if something is left - flush those bytes to the client.
      output.flush();
      showMessage("\n SERVER - " + message);
    }catch(IOException e){
      chatWindow.append("\n ERROR: dude i cant send that message");
    }
  }
  // updates chat window
  private void showMessage(final String text){
    // creates a thread that will update a part of GUI
    SwingUtilities.invokeLater(
      new Runnable(){
        public void run(){
          //add message to the end of the document
          //and it updates the chat window
          chatWindow.append(text);
        }
      }
    );
  }
  // let the user type something in the text field
  // final type - cant be modified
  private void ableToType(final boolean tof){
    SwingUtilities.invokeLater(
      new Runnable(){
        public void run(){
          userText.setEditable(tof);
        }
      }
    );
  }
}
play.java(在手机上)

编辑:我已更改了用户Endox告诉我的内容,但出现了一个错误:

java.net.SocketException: Connection reset by peer: socket write error
    at java.net.SocketOutputStream.socketWrite0(Native Method)
    at java.net.SocketOutputStream.socketWrite(Unknown Source)
    at java.net.SocketOutputStream.write(Unknown Source)
    at java.io.ObjectOutputStream$BlockDataOutputStream.drain(Unknown Source)
    at java.io.ObjectOutputStream$BlockDataOutputStream.setBlockDataMode(Unknown Source)
    at java.io.ObjectOutputStream.<init>(Unknown Source)
    at server.setupStreams(server.java:75)
    at server.startRunning(server.java:50)
    at pagr.main(pagr.java:7)
Exception in thread "main" java.lang.NullPointerException
    at server.closeCrap(server.java:107)
    at server.startRunning(server.java:56)
    at pagr.main(pagr.java:7)
java.net.SocketException:peer重置连接:套接字写入错误
位于java.net.SocketOutputStream.socketWrite0(本机方法)
位于java.net.SocketOutputStream.socketWrite(未知源)
位于java.net.SocketOutputStream.write(未知源)
位于java.io.ObjectOutputStream$BlockDataOutputStream.drain(未知源)
位于java.io.ObjectOutputStream$BlockDataOutputStream.setBlockDataMode(未知源)
位于java.io.ObjectOutputStream。(未知源)
在server.setupStreams上(server.java:75)
startRunning(server.java:50)
在pagr.main(pagr.java:7)
线程“main”java.lang.NullPointerException中出现异常
在server.closeCrap(server.java:107)
startRunning(server.java:56)
在pagr.main(pagr.java:7)
EDIT2我在close crap方法中添加了if语句:在关闭输出之前,它会检查该对象是否为NOTNULL。新错误:

java.net.SocketException: Software caused connection abort: recv failed
    at java.net.SocketInputStream.socketRead0(Native Method)
    at java.net.SocketInputStream.read(Unknown Source)
    at java.net.SocketInputStream.read(Unknown Source)
    at java.io.ObjectInputStream$PeekInputStream.read(Unknown Source)
    at java.io.ObjectInputStream$PeekInputStream.readFully(Unknown Source)
    at java.io.ObjectInputStream$BlockDataInputStream.readShort(Unknown Source)
    at java.io.ObjectInputStream.readStreamHeader(Unknown Source)
    at java.io.ObjectInputStream.<init>(Unknown Source)
    at server.setupStreams(server.java:77)
    at server.startRunning(server.java:50)
    at pagr.main(pagr.java:7)
java.net.SocketException:软件导致的连接中止:recv失败
位于java.net.SocketInputStream.socketRead0(本机方法)
位于java.net.SocketInputStream.read(未知源)
位于java.net.SocketInputStream.read(未知源)
位于java.io.ObjectInputStream$PeekInputStream.read(未知源)
在java.io.ObjectInputStream$PeekInputStream.readFully处(未知源)
位于java.io.ObjectInputStream$BlockDataInputStream.readShort(未知源)
位于java.io.ObjectInputStream.readStreamHeader(未知源)
位于java.io.ObjectInputStream。(未知源)
在server.setupStreams上(server.java:77)
startRunning(server.java:50)
在pagr.main(pagr.java:7)
在此循环中:

while(true){
        try{
                waitForConnection();
                setupStreams();
                whileChatting();
        }catch(EOFException exc){ // end of stream
                showMessage("\n Server ended the connection!");
        }finally{
                closeCrap();
        }
}
如果
waitForConnection()
抛出
EOFException
您将直接进入
最终
块(显示消息后)
setupStreams()
没有要调用的更改,因此导致此行出现
NullPointerException
(在
closeCrap()
内):


问题可能是由
Server.java
中的
setUpStreams
方法引起的。线路

output = new ObjectOutputStream(connection.getOutputStream());
根据java规范
ObjectOutputStream
可能引发异常

public ObjectOutputStream(OutputStream out)
                   throws IOException

这可能导致您的
输出为空。

EDIT3:

output = new ObjectOutputStream(connection.getOutputStream());
从跟踪中可以看出,该行抛出了一个
套接字异常
,但我不知道为什么。所以你应该对这部分做些什么。
NullPointerException
是由
SocketException
引起的

EDIT2:
server.java中更改此部分:

try{
   waitForConnection();
   setupStreams();
   whileChatting();
}catch(EOFException exc){ // end of stream
   showMessage("\n Server ended the connection!");
}finally{
   closeCrap();
}
致:

然后将stacktrace粘贴到这里,也许我们可以进行更好的调试。:)

编辑:这与
play.java
有关,但仍然是一个问题

引发了
NullPointer异常
,因为您在这些方法中定义了两个局部变量(连接、输出):

private void connection() throws IOException{
    StreamConnection connection = (StreamConnection)Connector.open("socket://127.0.0.1:6789");
    in = connection.openInputStream();
  }
private void setupStreams() throws IOException{
    PrintStream output = new PrintStream(connection.openOutputStream());
    output.println("Test");
    output.flush();
}
closeCrapi()
方法中,您使用了两个仍然为空引用的类成员:

 public class play extends GameCanvas {
      StreamConnection connection;
      PrintStream output;
      InputStream in;
...
private void closeCrapi(){
    try{
      output.close();
      in.close();
      connection.close();
    }catch(IOException ex){}
  }

因此,无论在
connection()
setupStreams()
方法中发生了什么,在
closeCrapi()
方法中,您尝试调用两个
null
引用(连接、输出)上的方法.

server.java中的第106行是什么?似乎在初始化时应该调用
setupStreams
当我运行它抛出的服务器时:连接到本地主机,然后立即在closeCrap()方法中“关闭连接”。我在主要问题上发布了它。我像你说的那样改变了输出和连接
try{
       waitForConnection();
       setupStreams();
       whileChatting();
    }catch(IOException exc){ // end of stream
       exc.printStackTrace();  
       showMessage("\n Server ended the connection!");
    }finally{
       closeCrap();
    }
private void connection() throws IOException{
    StreamConnection connection = (StreamConnection)Connector.open("socket://127.0.0.1:6789");
    in = connection.openInputStream();
  }
private void setupStreams() throws IOException{
    PrintStream output = new PrintStream(connection.openOutputStream());
    output.println("Test");
    output.flush();
}
 public class play extends GameCanvas {
      StreamConnection connection;
      PrintStream output;
      InputStream in;
...
private void closeCrapi(){
    try{
      output.close();
      in.close();
      connection.close();
    }catch(IOException ex){}
  }