Using Sockets to send and receive data Using Sockets to send and receive data android android

Using Sockets to send and receive data


I assume you are using TCP sockets for the client-server interaction? One way to send different types of data to the server and have it be able to differentiate between the two is to dedicate the first byte (or more if you have more than 256 types of messages) as some kind of identifier. If the first byte is one, then it is message A, if its 2, then its message B. One easy way to send this over the socket is to use DataOutputStream/DataInputStream:

Client:

Socket socket = ...; // Create and connect the socketDataOutputStream dOut = new DataOutputStream(socket.getOutputStream());// Send first messagedOut.writeByte(1);dOut.writeUTF("This is the first type of message.");dOut.flush(); // Send off the data// Send the second messagedOut.writeByte(2);dOut.writeUTF("This is the second type of message.");dOut.flush(); // Send off the data// Send the third messagedOut.writeByte(3);dOut.writeUTF("This is the third type of message (Part 1).");dOut.writeUTF("This is the third type of message (Part 2).");dOut.flush(); // Send off the data// Send the exit messagedOut.writeByte(-1);dOut.flush();dOut.close();

Server:

Socket socket = ... // Set up receive socketDataInputStream dIn = new DataInputStream(socket.getInputStream());boolean done = false;while(!done) {  byte messageType = dIn.readByte();  switch(messageType)  {  case 1: // Type A    System.out.println("Message A: " + dIn.readUTF());    break;  case 2: // Type B    System.out.println("Message B: " + dIn.readUTF());    break;  case 3: // Type C    System.out.println("Message C [1]: " + dIn.readUTF());    System.out.println("Message C [2]: " + dIn.readUTF());    break;  default:    done = true;  }}dIn.close();

Obviously, you can send all kinds of data, not just bytes and strings (UTF).

Note that writeUTF writes a modified UTF-8 format, preceded by a length indicator of an unsigned two byte encoded integer giving you 2^16 - 1 = 65535 bytes to send. This makes it possible for readUTF to find the end of the encoded string. If you decide on your own record structure then you should make sure that the end and type of the record is either known or detectable.


the easiest way to do this is to wrap your sockets in ObjectInput/OutputStreams and send serialized java objects. you can create classes which contain the relevant data, and then you don't need to worry about the nitty gritty details of handling binary protocols. just make sure that you flush your object streams after you write each object "message".


    //Client    import java.io.*;    import java.net.*;    public class Client {        public static void main(String[] args) {        String hostname = "localhost";        int port = 6789;        // declaration section:        // clientSocket: our client socket        // os: output stream        // is: input stream            Socket clientSocket = null;              DataOutputStream os = null;            BufferedReader is = null;        // Initialization section:        // Try to open a socket on the given port        // Try to open input and output streams            try {                clientSocket = new Socket(hostname, port);                os = new DataOutputStream(clientSocket.getOutputStream());                is = new BufferedReader(new InputStreamReader(clientSocket.getInputStream()));            } catch (UnknownHostException e) {                System.err.println("Don't know about host: " + hostname);            } catch (IOException e) {                System.err.println("Couldn't get I/O for the connection to: " + hostname);            }        // If everything has been initialized then we want to write some data        // to the socket we have opened a connection to on the given port        if (clientSocket == null || os == null || is == null) {            System.err.println( "Something is wrong. One variable is null." );            return;        }        try {            while ( true ) {            System.out.print( "Enter an integer (0 to stop connection, -1 to stop server): " );            BufferedReader br = new BufferedReader(new InputStreamReader(System.in));            String keyboardInput = br.readLine();            os.writeBytes( keyboardInput + "\n" );            int n = Integer.parseInt( keyboardInput );            if ( n == 0 || n == -1 ) {                break;            }            String responseLine = is.readLine();            System.out.println("Server returns its square as: " + responseLine);            }            // clean up:            // close the output stream            // close the input stream            // close the socket            os.close();            is.close();            clientSocket.close();           } catch (UnknownHostException e) {            System.err.println("Trying to connect to unknown host: " + e);        } catch (IOException e) {            System.err.println("IOException:  " + e);        }        }               }//Serverimport java.io.*;import java.net.*;public class Server1 {    public static void main(String args[]) {    int port = 6789;    Server1 server = new Server1( port );    server.startServer();    }    // declare a server socket and a client socket for the server    ServerSocket echoServer = null;    Socket clientSocket = null;    int port;    public Server1( int port ) {    this.port = port;    }    public void stopServer() {    System.out.println( "Server cleaning up." );    System.exit(0);    }    public void startServer() {    // Try to open a server socket on the given port    // Note that we can't choose a port less than 1024 if we are not    // privileged users (root)        try {        echoServer = new ServerSocket(port);        }        catch (IOException e) {        System.out.println(e);        }       System.out.println( "Waiting for connections. Only one connection is allowed." );    // Create a socket object from the ServerSocket to listen and accept connections.    // Use Server1Connection to process the connection.    while ( true ) {        try {        clientSocket = echoServer.accept();        Server1Connection oneconnection = new Server1Connection(clientSocket, this);        oneconnection.run();        }           catch (IOException e) {        System.out.println(e);        }    }    }}class Server1Connection {    BufferedReader is;    PrintStream os;    Socket clientSocket;    Server1 server;    public Server1Connection(Socket clientSocket, Server1 server) {    this.clientSocket = clientSocket;    this.server = server;    System.out.println( "Connection established with: " + clientSocket );    try {        is = new BufferedReader(new InputStreamReader(clientSocket.getInputStream()));        os = new PrintStream(clientSocket.getOutputStream());    } catch (IOException e) {        System.out.println(e);    }    }    public void run() {        String line;    try {        boolean serverStop = false;            while (true) {                line = is.readLine();        System.out.println( "Received " + line );                int n = Integer.parseInt(line);        if ( n == -1 ) {            serverStop = true;            break;        }        if ( n == 0 ) break;                os.println("" + n*n );             }        System.out.println( "Connection closed." );            is.close();            os.close();            clientSocket.close();        if ( serverStop ) server.stopServer();    } catch (IOException e) {        System.out.println(e);    }    }}