我想在Java套接字中将对象从服务器发送到客户端。我可以将它们从客户端发送到服务器,但是我正努力将它们从服务器发送到客户端。我是Java新手,因此仍在学习基础知识。我知道这是我需要做的相对较小的事情,但是目前我正为此而苦苦挣扎。有人可以添加我缺少的代码吗?
答案 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()方法将数据发送回去,然后在需要时可以跳出循环。