gpt4 book ai didi

java - 成功建立socket连接后,服务器如何主动向客户端发送字符串消息?

转载 作者:行者123 更新时间:2023-12-02 01:25:42 25 4
gpt4 key购买 nike

我正在构建一个服务器。我希望Java服务器和C#客户端连接后,可以从HTML发送信息到Java服务器,然后Java服务器再把这个信息发送到客户端。但是建立成功后却拿不到socket在服务层,所以我的Java服务器只能发送固定的信息给客户端。

我尝试使用 Class object = new Class(); object.setObject(socket);保存socket,但是当我在服务层调用这个对象时,我得到null;我尝试使用(Map)socket.put(“socket”,socket)保存套接字,但是当我在服务层调用此方法时,我得到null。

这是创建套接字的代码。来自 SocketThread.java

    public void run() {
ServerSocket serverSocket = null;
try{
serverSocket = new ServerSocket(5656);
LOGGER.info("socket server start, monitor 5656 port ! ");
Socket socket = serverSocket.accept();
new SocketClientRequest(socket).start();
LOGGER.info("send success ! ");
}catch (Exception ex){
LOGGER.error("send fail ! ");
}

try {
Thread.sleep(5000);
} catch (InterruptedException e) {
LOGGER.error("服务器延时重启失败 ! ");
}
}

这是一种使用socket读取客户端发送的信息并将信息发送给客户端的方法。来自 SocketClientRequest.java

public void run() {
try {
//获取socket中的数据
bufferedInputStream = new
BufferedInputStream(socket.getInputStream());
byte[] clientCharStream = new byte[messageLengthBytes];

bufferedInputStream.read(clientCharStream);
System.out.println(new String(clientCharStream, "utf-8"));

OutputStream out = socket.getOutputStream();
out.write(new String("welcome_send_server!").getBytes());
} catch (IOException e) {
LOGGER.error("read massage error [{}]", e);
}
}

项目启动时创建连接

@EnableScheduling
@SpringBootApplication
public class GzserverApplication {

public static void main(String[] args) {
SpringApplication.run(GzserverApplication.class, args);

SocketServer socketServer = new SocketServer();
socketServer.start();
}

}

到这一步,一切都还好,但关键问题来了。我需要通过我的 Controller 向客户端发送信息。 这是 Controller

    @ResponseBody
@RequestMapping(value = "firstSend)
public SResult<String> firstSend(String uName, String pNum, String time){
try{
return httpService.firstSend(uName, pNum, time);
}catch (Exception ex){
LOGGER.error(ex.getMessage(), ex);
}
return SResult.failure("fail of connect");
}
this is service
    public SResult<String> firstSend(String uName, String pNum, String time) throws Exception {
String token = TokenUtil.sign(uName);
System.out.println("token code : "+token);

SocketObject socketObject = new SocketObject();
Map<String, Socket> socketMap = socketObject.socket();
Socket socket1 = socketMap.get("Socket"); // is null
Socket socket2 = socketObject.getSocket(); // is null

return SResult.success(token);
}

我希望连接创建成功后,在服务层可以使用socket,通过socket向客户端发送信息,但是无论我怎么做,socket在服务层都是null .请给我帮助,非常感谢

最佳答案

如果使用Spring,你不应该处理Socket。 Spring 是一个非常广泛的抽象层,它可以让您避免处理 Socket 引入的讨厌的细节。

在你的 Controller 中,你调用:SocketObject socketObject = new SocketObject();这会创建一个新对象,可能使用null初始化的Socket对象。在此代码中,您没有将套接字对象从 main() 作用域传递到任何其他作用域(例如使用名为 setSocket(Socket socket) 的方法。

但是,我必须强调这一点,您不应该在 Spring 中使用Socket。想想你想要解决什么问题,并问自己(为什么我需要向客户发送信息)。 Spring 可能有一个模块可以以更具可扩展性和可管理性的方式为您完成此任务。

例如,也许您需要在服务器和客户端之间建立2路通信,并且需要定期向客户端发布信息。在这种情况下,WebSocket 协议(protocol)(以及关联的 Spring Websocket 库)可能适合您。

这可能是 XY problem 。如果您编辑问题来说明您尝试实现的功能,可能会更容易提供帮助

关于java - 成功建立socket连接后,服务器如何主动向客户端发送字符串消息?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57587532/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com