ObjectOutputStream抛出异常

huangapple 未分类评论46阅读模式
英文:

ObjectOutputStream throwing Exception

问题

我正在尝试编写一个简单的客户端/服务器程序其中客户端是一个安卓应用服务器是一个树莓派 4我只想实现的是允许客户端输入一条消息然后让树莓派在终端上显示出这条消息然而我的应用程序在`out.writeObject(message_text)`这一行代码处抛出异常位于`sendMessage()`方法中

以下是服务器端的 Java 程序

```java
import java.io.ObjectInputStream;
import java.net.ServerSocket;
import java.net.Socket;

public class RaspPiServer {
    
    private ServerSocket server;

    public RaspPiServer(){
    }

    public static void main(String[] args){
        RaspPiServer server = new RaspPiServer();
        server.runServer();
    }

    public void runServer(){
        try{
            server = new ServerSocket(12345,100);
            while (true){
                new Controller(server.accept()).start();
            }
        } catch(Exception e){
            e.printStackTrace();
        }
    }

    private class Controller extends Thread {

        private Socket socket;
        private ObjectInputStream input;
        private String in;

        public Controller(Socket socket){
            this.socket = socket;
            System.out.println("New client at " + socket.getRemoteSocketAddress());
        }

        @Override
        public void run(){
            try{
                input = new ObjectInputStream(socket.getInputStream());
                while (!(in = (String)input.readObject()).equals("close")){
                    System.out.println(in);
                }
            } catch(Exception e){
                e.printStackTrace();
            } finally {
                closeConnection();
                System.out.println("Connection with client @ " + socket.getRemoteSocketAddress() + " closed");
            }
        }

        private void closeConnection() {
            try {
                input.close();
                socket.close();
            } catch (Exception e) {
                e.printStackTrace();
            }
        }

    }

}

在这里是否有一个简单的修复方法,还是我忽略了更大的问题?


<details>
<summary>英文:</summary>

I&#39;m trying to write a simple client/server program, where the client is an android app and the server is a Raspberry Pi 4. All I want to do is allow the client to type a message and have the Raspberry Pi display the message on the terminal. However, my app keeps throwing an exception at the `out.writeObject(message_text)` line in the `sendMessage()` method.

public class MainActivity extends AppCompatActivity {

private EditText message;
private Button send;
private ObjectOutputStream out;
private Socket socket;
private String raspi_ip = &quot;enter ip here&quot;;
private int raspi_portnum = 12345;
Client client;

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);

    message = findViewById(R.id.message_text);
    send = findViewById(R.id.send_button);

    try{
        client = new Client(raspi_ip,raspi_portnum);
        client.start();

    } catch (Exception e){
        AlertDialog.Builder dialog = new AlertDialog.Builder(MainActivity.this);
        dialog.setTitle(&quot;Error! &quot;).setMessage(&quot;Couldn&#39;t connect to server.&quot;).setNeutralButton(&quot;OK&quot;, null).create().show();
    }

    send.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View v) {
            client.sendMessage();
        }
    });
}

private void closeConnection(){
    try{
        out.close();
        socket.close();
    } catch (Exception e){
        e.printStackTrace();
    }
}

@Override
protected void onStop(){
    super.onStop();
    closeConnection();
}

private class Client extends Thread {
    private String ip_address;
    private int port_number;

    public Client(String ipaddress,int portnum){
        this.ip_address = ipaddress;
        this.port_number = portnum;
    }

    @Override
    public void run() {
        super.run();
        connectToServer(ip_address,port_number);
    }

    public void connectToServer(String ipaddress, int portnum){
        try{
            socket = new Socket(InetAddress.getByName(ipaddress),portnum);
            out = new ObjectOutputStream(socket.getOutputStream());
            out.flush();
        }catch (Exception e){
            AlertDialog.Builder dialog = new AlertDialog.Builder(MainActivity.this);
            dialog.setTitle(&quot;Error! &quot;).setMessage(&quot;Couldn&#39;t connect to server.&quot;).setNeutralButton(&quot;OK&quot;, null).create().show();
        }
    }

    public void sendMessage(){
        String message_text = message.getText().toString();
        try{
            out.writeObject(message_text);
            out.flush();
        } catch (Exception e) {
            AlertDialog.Builder dialog = new AlertDialog.Builder(MainActivity.this);
            dialog.setTitle(&quot;Error! &quot;).setMessage(&quot;IO Exception.&quot;).setNeutralButton(&quot;OK&quot;, null).create().show();
        }
    }
}

}

Here is the server side java program:

import java.io.ObjectInputStream;
import java.net.ServerSocket;
import java.net.Socket;

public class RaspPiServer {

private ServerSocket server;

public RaspPiServer(){
}

public static void main(String[] args){
    RaspPiServer server = new RaspPiServer();
    server.runServer();
}

public void runServer(){
    try{
        server = new ServerSocket(12345,100);
        while (true){
            new Controller(server.accept()).start();
        }
    } catch(Exception e){
        e.printStackTrace();
    }
}

private class Controller extends Thread {

    private Socket socket;
    private ObjectInputStream input;
    private String in;

    public Controller(Socket socket){
        this.socket = socket;
        System.out.println(&quot;New client at &quot; + socket.getRemoteSocketAddress());
    }

    @Override
    public void run(){
        try{
            input = new ObjectInputStream(socket.getInputStream());
            while (!(in = (String)input.readObject()).equals(&quot;close&quot;)){
                System.out.println(in);
            }
        } catch(Exception e){
            e.printStackTrace();
        } finally {
            closeConnection();
            System.out.println(&quot;Connection with client @ &quot; + socket.getRemoteSocketAddress() + &quot; closed&quot;);
        }
    }

    private void closeConnection() {
        try {
            input.close();
            socket.close();
        } catch (Exception e) {
            e.printStackTrace();
        }
    }

}

}

Is there an easy fix here, or am I missing something bigger? 

</details>


huangapple
  • 本文由 发表于 2020年7月23日 22:17:53
  • 转载请务必保留本文链接:https://java.coder-hub.com/63056431.html
匿名

发表评论

匿名网友

:?: :razz: :sad: :evil: :!: :smile: :oops: :grin: :eek: :shock: :???: :cool: :lol: :mad: :twisted: :roll: :wink: :idea: :arrow: :neutral: :cry: :mrgreen:

确定