Using Sockets to send and receive data

前端 未结 3 1489
刺人心
刺人心 2020-12-04 11:27

I am using sockets to connect my Android application (client) and a Java backend Server. From the client I would like to send two variables of data each time I communicate w

相关标签:
3条回答
  • 2020-12-04 11:55

    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 socket
    DataOutputStream dOut = new DataOutputStream(socket.getOutputStream());
    
    // Send first message
    dOut.writeByte(1);
    dOut.writeUTF("This is the first type of message.");
    dOut.flush(); // Send off the data
    
    // Send the second message
    dOut.writeByte(2);
    dOut.writeUTF("This is the second type of message.");
    dOut.flush(); // Send off the data
    
    // Send the third message
    dOut.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 message
    dOut.writeByte(-1);
    dOut.flush();
    
    dOut.close();
    

    Server:

    Socket socket = ... // Set up receive socket
    DataInputStream 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.

    0 讨论(0)
  • 2020-12-04 12:00

    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".

    0 讨论(0)
  • 2020-12-04 12:01
        //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);
            }
            }           
        }
    
    
    
    
    
    //Server
    
    
    
    
    import 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);
        }
        }
    }
    
    0 讨论(0)
提交回复
热议问题