- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我正在尝试使用 jetty 构建服务器客户端应用程序。我已经设置了一个jetty服务器并配置了websockets。在客户端和服务器之间发送文本消息工作正常。但是如何从客户端端点发送二进制数据作为输入流。我找不到任何有关 websocket 客户端的片段。以下是我尝试过的
服务器端点:
@OnMessage
public void handleBinaryMessage(InputStream input, Session session) {
logger.info("onMessage::inputstream");
try {
byte[] buffer = new byte[2048];
try (OutputStream output = session.getBasicRemote().getSendStream())
{
int read;
while ((read = input.read(buffer)) >= 0)
output.write(buffer, 0, read);
}
} catch (IOException e) {
e.printStackTrace();
}
客户端端点:
@OnOpen
public void onOpen(Session s) throws IOException {
logger.info("Client Connected ... " + s.getId());
this.session=s;
session.getBasicRemote().sendText("Ping from client");
// size of the file 200~500MB
File source= new File("/tmp/Setup.exe");
try(InputStream input = new FileInputStream(source)) {
session.getAsyncRemote().sendObject(input);
}
}
感谢任何帮助
编辑:
我修改了 clientendpoint 和 serverendpoint。尝试将数据作为 block 发送,但 zip 文件是部分的,有时甚至比源文件小得多。
源大小:1.5GB使用流从缓冲区写入数据后:20kb
@ClientEndpoint
private static void sendFileToRemote(File source) throws FileNotFoundException, IOException {
// TODO Auto-generated method stub
Session session=null;
final WsClient wc = new WsClient("ws://localhost:2714/events/","test");
session=wc.getSession();
try (
InputStream inputStream = new FileInputStream(source);
) {
byte[] chunk = new byte[102400];
int chunkLen = 0;
while ((chunkLen = inputStream.read(chunk)) != -1) {
session.getAsyncRemote().sendBinary(ByteBuffer.wrap(chunk, 0, chunkLen));
}
} catch (IOException ex) {
ex.printStackTrace();
}
}
@serverendpoint
@ServerEndpoint("/events/")
public class EventListener {
static Logger logger = Logger.getLogger(Initservice.class.getName());
private OutputStream os=null;
@OnOpen
public void Init(Session session) throws FileNotFoundException {
this.user_session = session;
logger.info("onOpen:: server" + session.getId());
this.os = new FileOutputStream(new File("/tmp/silicon_test.zip"));
logger.info("instantiate zip files");
}
@OnMessage
public void onMessage(Session session, ByteBuffer byteBuffer) throws IOException {
try {
os.write(byteBuffer.get());
} catch(Exception e) {
close();
logger.log(Level.SEVERE,"Exception occured in onMessage :: ", e);
throw e;
}
}
}
最佳答案
ServerEndpoint 中的代码看起来应该可以正常工作,但是在 ClientEndpoint 中,您仅将文本数据发送到 ServerEndpoint,并且只能由配置为接收文本消息的服务器 onMessage 方法读取。
您应该使用方法 session.getRemoteEndpoint().sendBinary(...)
,而不是使用 session.getRemoteEndpoint().sendText(...)
。这将以二进制帧而不是文本帧的形式发送数据,您将能够在服务器的 handleBinaryMessage
方法中接收它。
对于 session.getAsyncRemote().sendObject(input)
,要实现此功能,您还需要提供 Encoder.Binary
或 Encoder .BinaryStream
以便将对象作为二进制数据发送。
编辑:
WebSocket 是一种基于消息的协议(protocol),您通过多个 WebSocket 消息从文件发送数据。您可以使用 session.getBasicRemote().sendBinary(ByteBuffer, boolean)
发送部分消息并在同一消息中发送所有数据。
或者您可以尝试类似这样的代码,这可能会更简单。
try (InputStream inputStream = new FileInputStream(source))
{
try (OutputStream sendStream = session.getBasicRemote().getSendStream())
{
inputStream.transferTo(sendStream);
}
}
关于javax.websocketclient : how to send large binary data from clientendpoint to serverendpoint,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/61549428/
我使用 GF 4 作为 JavaEE 服务器。 这就是我对 servlet 处理的理解:有一个线程池,当请求到来时,这个池中的一个线程被用来处理请求。之后,线程被放回池中。 根据上面的信息,我想(我不
你好吗?我有一个问题,我一直在寻找明确的答案,但没有成功,因此我来这里寻求您的帮助! 一些信息:Java Web 项目,使用 JAVA 8、Tomcat 8.5.23 和 IntelliJ 作为我的
我正在使用 WebSockets 开发一个简单的应用程序。客户端可以发送输入文本,而服务器端是通过注释为 ServerEndpoint 的 Java 类实现的。在这里,接收到的输入文本被解码并发送到所
如何将字段自动连接到@ServerEndpoint。以下不起作用。 @Component @ServerEndpoint("/ws") public class MyWebSocket {
我可以将 websocket 端点映射到一组静态上下文或带有 uri 变量的上下文:@ServerEndpoint("/{name}") 它将匹配/anything 但不匹配/any/thing。如何
灵感来自 this thread我正在尝试这样做: @ServerEndpoint(... configurator = GetHttpSessionConfigurator.class) 没有@Se
很多人认为我使用 IDE,所以现在让我声明一下:我不使用任何 IDE。 我获取了以下 Java 源代码,将其编译为 Echo.class,然后通过编写 jar -cvf Echo.war Echo 创
我有一些 Soap、REST servlet,现在有一个 WebSocket: @ServerEndpoint("/game") public class WebSocketgame{ ... } 我
单个 ServerEndpoints 线程安全还是属于在给定时间与其交互的所有客户端? 或者用另一种方式问同样的问题: ServerEndpoint 类中的全局对象是否存在产生并发问题的危险,like
我有一个嵌入式 tomcat 正在运行,我正在尝试以编程方式设置 websockets,不能使用注释,因为我动态获取上下文路径列表。使用 Java 8 和 Tomcat 7。 下面是我使用的代码, 嵌
我已经创建了一个 websocket ServerEndPoint。websocket 服务器工作正常。如何在 Tomcat 启动时调用 websocket ServerEndPoint 类。这是为了
比如我有一个房间 public class Room { private int id; private Set users; } 所以我希望它成为我的 websocket 应用程序的端点
我有一个网络套接字@ServerEndpoint,它有一个我的过滤器监听的注释。但我的过滤器从未被调用(我的过滤器在普通 JAX-RS 资源上调用) 如何让我的过滤器被 Web 套接字端点调用? @S
意味着,它将从本地网络中的许多用户那里获得连接。我怎样才能获得每个连接的IP地址?我使用 JSR356。 @ServerEndpoint(value = "/ws/example") public c
我刚刚遇到以下问题,但无法找到答案: @ServerEndpoint("/websocket/server") public class ServerUpdateEndpoint implements
我正在尝试在 @ServerEndpoint 类中注入(inject)由 @Repository 类注释的内容。但是当我尝试调用存储库方法时,它返回 null。该包中的另一个注入(inject)的 b
我需要访问 HttpServletRequest 属性以获取 javax.servlet.request.X509Certificate,其中包含用于 TLS 的 X509Certificate 证书
当我使用 jersey 开发一个 rest api 应用程序时,我发现我需要为特定的业务逻辑片段实现一个 websocket 端点。 我在我的项目中使用maven,所以我添加了javax:javaee
我在循环中使用 RemoteEndpoint.Async 的 sendText() 方法将一些数据发送到 ClientEndPoint。由于数据是从 ServerEndpoint 异步发送的,因此 C
问题:@ServerEndpoint 类中的@Autowired beans 为空 如何确保下面的这个 WebSocketController 类将被注入(inject) bean,即如何让它由 Sp
我是一名优秀的程序员,十分优秀!