在Java套接字中将对象从服务器发送到客户端

时间:2019-01-08 15:10:40

标签: java sockets object objectoutputstream

我想在Java套接字中将对象从服务器发送到客户端。我可以将它们从客户端发送到服务器,但是我正努力将它们从服务器发送到客户端。我是Java新手,因此仍在学习基础知识。我知道这是我需要做的相对较小的事情,但是目前我正为此而苦苦挣扎。有人可以添加我缺少的代码吗?

3 个答案:

答案 0 :(得分:1)

在另一个线程中打开另一个连接,并让客户端成为服务器,而服务器成为客户端。因此,在一个线程中,您发送A-> B,在另一个线程中,您打开另一个套接字并开始发送b B-> A。

低级别套接字的问题在于,如果一侧正在写,则另一侧正在监听。这意味着您必须实现命令查询协议,这是一项繁重的任务。因此,根据我的建议,您将使用两个端口,但您知道将有2条数据流管道。

A --8888--> B
A <--8889-- B

如果您只是从套接字开始,那会更容易。

答案 1 :(得分:0)

您可以使用 ObjectOutputStream 通过套接字发送对象,并使用 ObjectInputStream 接收对象:

private ObjectOutputStream oos; 
private ObjectInputStream ois;

public SocketHandler(Socket cs) {
    this.oos = new ObjectOutputStream(cs.getOutputStream());
    this.ois = new ObjectInputStream(cs.getInputStream());
}

public void sendObject(Object o) {
    this.oos.writeObject(o);
    this.oos.flush();
}

public Object receiveObject() {
    return this.ois.readObject();
}

那是假设您要发送和接收对象。您还可以使用 PrintWriter BufferedReader 来发送和接收String消息,并在解析之后:

private PrintWriter pw;
private BufferedReader br;

public SocketHandler(Socket cs) {
    this.pw = new PrintWriter(cs.getOutputStream());
    this.br = new BufferedReader(new InputStreamReader(cs.getInputStream()));
}

public void sendMsg(String msg) {
    this.pw.println(msg);
    this.pw.flush();
}

public String receiveMsg() {
    return this.br.readLine();
}

答案 2 :(得分:0)

下面有一个我在应用程序中使用过的一些服务器端代码的示例,然后我将向您解释这里发生的事情:

首先,您需要创建ServerSocket才能接受客户端请求(如您所知):

ServerSocket serverSocket = new ServerSocket(1002);
        while(true) {

然后,您需要进入while循环,以便在服务器程序处于活动状态时接收请求

Socket clientSocket = serverSocket.accept();
System.out.println("Connection made to: " + clientSocket);
BufferedReader br = new BufferedReader(new InputStreamReader(clientSocket.getInputStream()));
PrintWriter out = new PrintWriter(clientSocket.getOutputStream(), true);
String messageString = "";
String line;
System.out.println("Enter while loop to retrieve client message...");
while((line = br.readLine()) != null) {
        String clientRequestLine = line;
        if(clientRequestLine.contains("check return user credentials")) {
        String userNamePassWord = clientRequestLine.replace("check return user credentials", "");
        userNamePassWord = userNamePassWord.trim();
        String[] userNamePassWordSplitter = userNamePassWord.split(" ");
        String userName = userNamePassWordSplitter[0];
        String passWord = userNamePassWordSplitter[1];
        System.out.println("Username: " + userName + "\nPassword: " + passWord);
            boolean isValidUserNamePassWord = ReturnPatientCredentials.checkUserNamePassWord(userName, passWord);
        if(isValidUserNamePassWord) {
                System.out.println("valid");
                out.println("valid");
                    }
        else {
                System.out.println("invalid");
                out.println("invalid");
                    }
                }

上面,您需要启动BufferedReader以便从客户端套接字存储InputStream(数据)。您还需要创建一个PrintWriter,以便可以将数据发送到OutputStream,并且需要将clientSocket作为OutputStream的参数传递。接下来,您将创建变量以从客户端获取消息和日期的“行”,并进入while循环。然后,您可以将行存储在变量中,并读取数据或您需要执行的任何操作。我们使用PrintWriter(out)通过println()方法将数据发送回去,然后在需要时可以跳出循环。