TCP客户端和服务器,使用objectstreams

时间:2016-04-17 11:29:32

标签: java multithreading tcp client-server

我有一个客户端文件clientRPC.java和服务器文件serverRPC.java。两者都使用TCP协议进行通信,并使用objectinput和输出流来传输数据。

我的客户档案:

public class clientRPC {

public static void main(String args[]) {

    Socket s = null;

    try {

        int serverPort = 8888;

        s = new Socket("localhost", serverPort);// server name is local host    

        //initializing input and output streams object and referencing them to get input and output
        ObjectInputStream in = null;
        ObjectOutputStream out = null;

        out = new ObjectOutputStream(s.getOutputStream());
        in = new ObjectInputStream(s.getInputStream());

        MathsTutor mt = new MathsTutor();


        out.writeObject(mt);
        out.flush();

        System.out.println("Welcome to Maths Tutor Service. The available maths exercises are:\n"
                + "Addition: Enter 'A' or 'a'\n"
                + "Subtraction: Enter 'S' or 's'\n"
                + "Multiplication: Enter 'M' or 'm'\n"
                + "Division: Enter 'D' or 'd'\n"
                + "Enter 'Q' or 'q' to quit");                       

        //System.out.println();

        MathsTutor mt1 = (MathsTutor) in.readObject();

        String response = in.readUTF();
        System.out.println(response);

    } catch (UnknownHostException e) {
        System.out.println("Socket:" + e.getMessage());
    } catch (EOFException e) {
        System.out.println("EOF:" + e.getMessage());
    } catch (IOException e) {
        System.out.println("readline:" + e.getMessage());
    } catch (ClassNotFoundException ex) {
        ex.printStackTrace();
    } finally {
        if (s != null) {
            try {
                s.close();
            } catch (IOException e) {
                System.out.println("close:" + e.getMessage());
            }
        }
    }
}
}

和我的服务器文件:

public class serverRPC extends Thread {

String request;
String response;

public static void main(String args[]) {

    try {
        int serverPort = 8888;
        ServerSocket listen_socket = new ServerSocket(serverPort);

        while (true) {
            Socket clientSocket = listen_socket.accept();
            Connection c = new Connection(clientSocket);
        }
    } catch (IOException e) {
        System.out.println("Listen socket:" + e.getMessage());
    }

public serverRPC(String s) {
    request = s;
}
}

class Connection extends Thread {

ObjectInputStream in;
ObjectOutputStream out;
Socket clientSocket;

public Connection(Socket aClientSocket) {

    try {
        clientSocket = aClientSocket;
        in = new ObjectInputStream(clientSocket.getInputStream());
        out = new ObjectOutputStream(clientSocket.getOutputStream());
        this.start();
    } catch (IOException e) {
        System.out.println("Connection:" + e.getMessage());
    }
}


public void run() {

    try {

        MathsTutor mt = (MathsTutor) in.readObject();
        InetAddress ip = clientSocket.getInetAddress();

        System.out.println("The Received Message from Client at address:/" + ip.getHostAddress());
        System.out.println("====================================");

        MathsTutor mt1 = new MathsTutor();
        out.writeObject(mt1);

         while(true)  {
            // Read from input
            String command = in.readUTF();
            System.out.println(command);

            }

        //System.out.println();

    } catch (EOFException e) {
        System.out.println("EOF:" + e.getMessage());
    } catch (IOException e) {
        System.out.println("readline:" + e.getMessage());
    } catch (ClassNotFoundException ex) {
        ex.printStackTrace();
    } finally {
        try {
            clientSocket.close();
        } catch (IOException e) {/*close failed*/

        }
    }
}
}

问题是当我在cmd上运行服务器然后运行客户端时,客户端显示欢迎消息并将光标放在另一行上以供用户输入但是,我无法键入任何内容,光标只是闪烁...我知道这可能很简单,但我已经花了3个小时才能完成同样的工作。

标有红色的光标一直闪烁,但不允许我输入任何内容。

image

1 个答案:

答案 0 :(得分:0)

您正在使用writeObject()撰写对象并尝试使用readUTF()阅读该对象。不合逻辑的。

  • 使用writeObject()撰写的readObject()对象必须使用writeUTF()
  • 阅读
  • 使用readUTF()编写的字符串必须使用writeXXX()
  • 阅读 对于大多数X值,
  • 使用readXXX()编写的原语必须使用for读取。