簡體   English   中英

在Java套接字中將對象從服務器發送到客戶端

[英]send objects from server to client in java sockets

我想在Java套接字中將對象從服務器發送到客戶端。 我可以將它們從客戶端發送到服務器,但是我正努力將它們從服務器發送到客戶端。 我是Java新手,因此仍在學習基礎知識。 我知道這是我需要做的相對較小的事情,但是目前我正為此而苦苦掙扎。 有人可以添加我缺少的代碼嗎?

在另一個線程中打開另一個連接,讓客戶端成為服務器,而服務器成為客戶端。 因此,在一個線程中發送A-> B,在另一個線程中打開另一個套接字並開始發送b B->A。

低級別套接字的問題在於,如果一側正在寫,另一側正在監聽。 這意味着您必須實現命令查詢協議,這是一項繁重的任務。 因此,根據我的建議,您將使用兩個端口,但您知道將有2條數據流管道。

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

如果您只是從套接字開始,那會更容易。

您可以使用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();
}

那是假設您要發送和接收一個對象。 您還可以使用PrintWriterBufferedReader來發送和接收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();
}

下面是一個示例,其中有一些我之前在應用程序中使用過的服務器端代碼的示例,然后我將向您解釋此處的情況:

首先,您需要創建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()方法將數據發送回去,然后在需要時可以跳出循環。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM