3

I have an android app which will send a string to a server using the following code:

package com.example.testapp;


import java.io.BufferedWriter;
import java.io.ByteArrayInputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStreamWriter;
import java.io.PrintWriter;
import java.net.InetAddress;
import java.net.Socket;
import java.net.UnknownHostException;

import android.app.Activity;
import android.os.Bundle;
import android.view.View;
import android.widget.EditText;

public class MainActivity extends Activity {

    private Socket socket;

    private static final int SERVERPORT = 5000;
    private static final String SERVER_IP = "192.168.1.125";

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

        new Thread(new ClientThread()).start();
    }

    public void onClick(View view) {
        try {
            EditText et = (EditText) findViewById(R.id.EditText01);
            String str = et.getText().toString();
            PrintWriter out = new PrintWriter(new BufferedWriter(
                    new OutputStreamWriter(socket.getOutputStream())),
                    true);
            out.println(str);
        } catch (UnknownHostException e) {
            e.printStackTrace();
        } catch (IOException e) {
            e.printStackTrace();
        } catch (Exception e) {
            e.printStackTrace();
        }
    }

    class ClientThread implements Runnable {

        @Override
        public void run() {

            try {
                InetAddress serverAddr = InetAddress.getByName(SERVER_IP);

                socket = new Socket(serverAddr, SERVERPORT);

            } catch (UnknownHostException e1) {
                e1.printStackTrace();
            } catch (IOException e1) {
                e1.printStackTrace();
            }

        }

    }
}

In server side I am running a java program like the follows:

import java.io.IOException;
import java.io.ObjectInputStream;
import java.io.ObjectOutputStream;
import java.lang.ClassNotFoundException;
import java.net.ServerSocket;
import java.net.Socket;

public class SocketServerExample {

    //static ServerSocket variable
    private static ServerSocket server;
    //socket server port on which it will listen
    private static int port = 5000;

    public static void main(String args[]) throws IOException, ClassNotFoundException{
        //create the socket server object
        server = new ServerSocket(port);
        //keep listens indefinitely until receives 'exit' call or program terminates
        while(true){
            System.out.println("Waiting for client request");
            //creating socket and waiting for client connection
            Socket socket = server.accept();
            //read from socket to ObjectInputStream object
            ObjectInputStream ois = new ObjectInputStream(socket.getInputStream());
            //convert ObjectInputStream object to String
            String message = (String) ois.readObject();
            System.out.println("Message Received: " + message);
            //create ObjectOutputStream object
            ObjectOutputStream oos = new ObjectOutputStream(socket.getOutputStream());
            //write object to Socket
            oos.writeObject("Hi Client "+message);
            //close resources
            ois.close();
            oos.close();
            socket.close();
            //terminate the server if client sends exit request
            if(message.equalsIgnoreCase("exit")) break;
        }
        System.out.println("Shutting down Socket server!!");
        //close the ServerSocket object
        server.close();
    }

}

But it is not reading the String which I send from the android app. Instead when I submit from app, the java program shows the following errors:

Exception in thread "main" java.io.StreamCorruptedException: invalid stream header: 54657374
    at java.io.ObjectInputStream.readStreamHeader(ObjectInputStream.java:803)
    at java.io.ObjectInputStream.<init>(ObjectInputStream.java:298)
    at SocketServerExample.main(SocketServerExample.java:29)

How can I fix this. Where is my error lays?? Is it on Server side or client side?? Please help me guys.

1
  • Are you able to telnet/ping/curl the server ? Commented Apr 24, 2014 at 8:58

3 Answers 3

2

PROBLEM ANALYSIS:

You use a PrintWriter for sending from the client, but you use an ObjectInputStream on the receiving side of the server. These two are not compatible.

You have to use a pair of Writer and Reader together or a pair of ObjectOutputStream and ObjectInputStream, but you can't mix them.

SOLUTION:

We're going to use pairs of Writer and Reader. The client side already uses a Writer and a Reader, so we only need to change the server side.

On the server side, instead of the ObjectInputStream, use a BufferedReader:

BufferedReader reader = new BufferedReader(new InputStreamReader(socket.getInputStream()));
reader.readLine();

Moreover, use a PrintWriter instead of the ObjectOutputStream on the server side for sending back to the client:

PrintWriter writer = new PrintWriter(new BufferedWriter(
                new OutputStreamWriter(socket.getOutputStream())),
                true);
writer.println(str);

Alltogether, then the server side looks like this:

import java.io.IOException;
import java.io.BufferedWriter;
import java.io.BufferedReader;
import java.io.OutputStreamWriter;
import java.io.InputStreamReader;
import java.io.PrintWriter;
import java.lang.ClassNotFoundException;
import java.net.ServerSocket;
import java.net.Socket;

public class SocketServerExample {

    //static ServerSocket variable
    private static ServerSocket server;
    //socket server port on which it will listen
    private static int port = 5000;

    public static void main(String args[]) throws IOException, ClassNotFoundException{
        //create the socket server object
        server = new ServerSocket(port);
        //keep listens indefinitely until receives 'exit' call or program terminates
        while(true){
            System.out.println("Waiting for client request");
            //creating socket and waiting for client connection
            Socket socket = server.accept();

            // //read from socket to ObjectInputStream object
            // ObjectInputStream ois = new ObjectInputStream(socket.getInputStream());
            // //convert ObjectInputStream object to String
            // String message = (String) ois.readObject();
            // System.out.println("Message Received: " + message);

            BufferedReader reader = new BufferedReader(new InputStreamReader(socket.getInputStream()));
            String message = reader.readLine();
            System.out.println("Message Received: " + message);

            // //create ObjectOutputStream object
            // ObjectOutputStream oos = new ObjectOutputStream(socket.getOutputStream());
            // //write object to Socket
            // oos.writeObject("Hi Client "+message);

            PrintWriter writer = new PrintWriter(new BufferedWriter(
                new OutputStreamWriter(socket.getOutputStream())),
                true);
            writer.println("Hi Client "+message);

            //close resources
            reader.close();
            writer.close();
            socket.close();
            //terminate the server if client sends exit request
            if(message.equalsIgnoreCase("exit")) break;
        }
        System.out.println("Shutting down Socket server!!");
        //close the ServerSocket object
        server.close();
    }

}
Sign up to request clarification or add additional context in comments.

4 Comments

It is sending a string str. you can see in that android Activity, but in Socket it is not recieving. Can you suggest what changes needed to made?
Can suggest how can I correct this, I am new to this
I put instead of BufferedReader reader = new BufferedReader(new InputStreamReader(socket.getInputStream())); reader.readLine(); ObjectOutputStream oos = new ObjectOutputStream(socket.getOutputStream()); //write object to Socket oos.writeObject("Hi Client "+message); Still same error BufferedReader reader = new BufferedReader(new InputStreamReader(socket.getInputStream())); reader.readLine();
Thank you very much for help dude, it works good, you are awsome!!\
1

Use this on the client:

 PrintWriter out = new PrintWriter(socket.getOutputStream(), true);

Use this on the server:

BufferedReader is = new BufferedReader(new InputStreamReader(clientSocket.getInputStream()));
String message = is.readLine();

Comments

0

Use flush() after sending anything.

out.println(str);
out.flush();

1 Comment

He has autoflush on true, so he doesn't need to flush manually.

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service and acknowledge you have read our privacy policy.

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.