如何使用JavaWebSocket和javafx发送文件
我的服务器端代码是如何使用JavaWebSocket和javafx发送文件,java,websocket,javafx-2,Java,Websocket,Javafx 2,我的服务器端代码是 @ServerEndpoint("/chat/fileTransfer") public class ChatFileTransfer { private static final Set<Session> sessions = Collections.synchronizedSet(new HashSet<Session>()); @OnOpen public void onOpen(Session session) {
@ServerEndpoint("/chat/fileTransfer")
public class ChatFileTransfer {
private static final Set<Session> sessions = Collections.synchronizedSet(new HashSet<Session>());
@OnOpen
public void onOpen(Session session) {
System.out.println("@ onOpen");
sessions.add(session);
}
@OnClose
public void onClose(Session session) {
System.out.println("@ onClose");
sessions.remove(session);
}
@OnMessage
public void onMessage(ByteBuffer byteBuffer) {
System.out.println("@ onMessage");
System.out.println("="+byteBuffer);
for (Session session : sessions) {
try {
session.getBasicRemote().sendBinary(byteBuffer);
} catch (IOException ex) {
ex.printStackTrace();
Logger.getLogger(BinaryWebSocketServer.class.getName()).log(Level.SEVERE, null, ex);
}
}
}
}
我该怎么解决呢?你检查过
文件是否为空吗?顺便问一下,您的客户机中的第125行是什么?是的,我已检查文件是否不为空。第125行是什么?读取一个文件并向他们发送小块。您可以在这里找到
@ClientEndpoint
public class JavaFXBinaryWsClient extends Application {
private static final Logger LOGGER = Logger.getLogger(JavaFXBinaryWsClient.class.getName());
private ImageView imageView;
private Session session;
@OnOpen
public void onOpen(Session session) {
System.out.println("OPEN CALLED CLIENT");
this.session = session;
}
@OnMessage
public void onMessage(InputStream input) {
System.out.println("WebSocket message Received!");
Image image = new Image(input);
System.out.println("image=" + image);
System.out.println("image=" + image.getHeight());
System.out.println("image=");
imageView.setImage(image);
}
@OnClose
public void onClose() {
System.out.println("CLIENT CLOSE CALLED");
connectToWebSocket();
}
@Override
public void start(final Stage primaryStage) {
System.out.println("CLIENT START");
connectToWebSocket();
System.out.println("CLIENT CONNECTED");
Button btn = new Button();
btn.setText("Send Image!");
btn.setPrefSize(400, 27);
btn.setOnAction(new EventHandler<ActionEvent>() {
@Override
public void handle(ActionEvent event) {
selectAndSendImage(primaryStage);
}
});
imageView = new ImageView();
imageView.setFitHeight(400);
imageView.setFitWidth(400);
imageView.setPreserveRatio(true);
imageView.setSmooth(true);
AnchorPane root = new AnchorPane();
AnchorPane.setTopAnchor(btn, 0.0);
AnchorPane.setLeftAnchor(btn, 0.0);
AnchorPane.setRightAnchor(btn, 0.0);
AnchorPane.setTopAnchor(imageView, 27.0);
AnchorPane.setBottomAnchor(imageView, 0.0);
AnchorPane.setLeftAnchor(imageView, 0.0);
AnchorPane.setRightAnchor(imageView, 0.0);
root.getChildren().add(btn);
root.getChildren().add(imageView);
Scene scene = new Scene(root, 400, 427);
primaryStage.setTitle("Image push!");
primaryStage.setScene(scene);
primaryStage.show();
}
public static void main(String[] args) {
launch(args);
}
private void selectAndSendImage(Stage stage) {
FileChooser fileChooser = new FileChooser();
fileChooser.setTitle("Select Image to Send");
File file = fileChooser.showOpenDialog(stage);
try (
InputStream input = new FileInputStream(file);
OutputStream output = session.getBasicRemote().getSendStream()) {
FileReader reader = new FileReader(file);
BufferedReader br = new BufferedReader(reader);
byte[] buffer = new byte[1024];
int read;
while ((read = input.read(buffer)) > 0) {
output.write(buffer, 0, read);
}
} catch (IOException ex) {
LOGGER.log(Level.SEVERE, null, ex);
}
}
private void connectToWebSocket() {
System.out.println("CLIENT connectToWebSocket Called " + session);
WebSocketContainer container = ContainerProvider.getWebSocketContainer();
try {
URI uri = URI.create("ws://localhost:9090/websocket/chat/fileTransfer");
session = container.connectToServer(this, uri);
} catch (DeploymentException | IOException ex) {
LOGGER.log(Level.SEVERE, null, ex);
System.exit(-1);
}
System.out.println("++" + session);
}
}
Apr 07, 2014 11:54:02 PM javafxbinarywsclient.JavaFXBinaryWsClient selectAndSendImage
SEVERE: null
java.io.IOException: An established connection was aborted by the software in your host machine
at sun.nio.ch.SocketDispatcher.write0(Native Method)
at sun.nio.ch.SocketDispatcher.write(SocketDispatcher.java:51)
at sun.nio.ch.IOUtil.writeFromNativeBuffer(IOUtil.java:93)
at sun.nio.ch.IOUtil.write(IOUtil.java:51)
at sun.nio.ch.SocketChannelImpl.write(SocketChannelImpl.java:487)
at org.glassfish.grizzly.nio.transport.TCPNIOTransport.flushByteBuffer(TCPNIOTransport.java:915)
at org.glassfish.grizzly.nio.transport.TCPNIOAsyncQueueWriter.write0(TCPNIOAsyncQueueWriter.java:107)
at org.glassfish.grizzly.nio.AbstractNIOAsyncQueueWriter.write(AbstractNIOAsyncQueueWriter.java:262)
at org.glassfish.grizzly.nio.AbstractNIOAsyncQueueWriter.write(AbstractNIOAsyncQueueWriter.java:168)
at org.glassfish.grizzly.nio.AbstractNIOAsyncQueueWriter.write(AbstractNIOAsyncQueueWriter.java:70)
at org.glassfish.grizzly.nio.transport.TCPNIOTransportFilter.handleWrite(TCPNIOTransportFilter.java:128)
at org.glassfish.grizzly.filterchain.TransportFilter.handleWrite(TransportFilter.java:191)
at org.glassfish.grizzly.filterchain.ExecutorResolver$8.execute(ExecutorResolver.java:111)
at org.glassfish.grizzly.filterchain.DefaultFilterChain.executeFilter(DefaultFilterChain.java:288)
at org.glassfish.grizzly.filterchain.DefaultFilterChain.executeChainPart(DefaultFilterChain.java:206)
at org.glassfish.grizzly.filterchain.DefaultFilterChain.execute(DefaultFilterChain.java:136)
at org.glassfish.grizzly.filterchain.DefaultFilterChain.process(DefaultFilterChain.java:114)
at org.glassfish.grizzly.ProcessorExecutor.execute(ProcessorExecutor.java:77)
at org.glassfish.grizzly.filterchain.DefaultFilterChain.write(DefaultFilterChain.java:437)
at org.glassfish.grizzly.nio.NIOConnection.write(NIOConnection.java:386)
at org.glassfish.grizzly.nio.NIOConnection.write(NIOConnection.java:360)
at org.glassfish.tyrus.container.grizzly.client.GrizzlyWriter.write(GrizzlyWriter.java:96)
at org.glassfish.tyrus.core.ProtocolHandler.write(ProtocolHandler.java:253)
at org.glassfish.tyrus.core.ProtocolHandler.send(ProtocolHandler.java:144)
at org.glassfish.tyrus.core.ProtocolHandler.send(ProtocolHandler.java:139)
at org.glassfish.tyrus.core.ProtocolHandler.stream(ProtocolHandler.java:193)
at org.glassfish.tyrus.container.grizzly.client.GrizzlyClientSocket.stream(GrizzlyClientSocket.java:432)
at org.glassfish.tyrus.core.TyrusRemoteEndpoint.sendBinary(TyrusRemoteEndpoint.java:97)
at org.glassfish.tyrus.core.OutputStreamToAsyncBinaryAdapter.write(OutputStreamToAsyncBinaryAdapter.java:78)
at javafxbinarywsclient.JavaFXBinaryWsClient.selectAndSendImage(JavaFXBinaryWsClient.java:125)
at javafxbinarywsclient.JavaFXBinaryWsClient.access$000(JavaFXBinaryWsClient.java:38)
at javafxbinarywsclient.JavaFXBinaryWsClient$1.handle(JavaFXBinaryWsClient.java:79)
at javafxbinarywsclient.JavaFXBinaryWsClient$1.handle(JavaFXBinaryWsClient.java:76)
at com.sun.javafx.event.CompositeEventHandler.dispatchBubblingEvent(CompositeEventHandler.java:69)
at com.sun.javafx.event.EventHandlerManager.dispatchBubblingEvent(EventHandlerManager.java:217)
at com.sun.javafx.event.EventHandlerManager.dispatchBubblingEvent(EventHandlerManager.java:170)
at com.sun.javafx.event.CompositeEventDispatcher.dispatchBubblingEvent(CompositeEventDispatcher.java:38)
at com.sun.javafx.event.BasicEventDispatcher.dispatchEvent(BasicEventDispatcher.java:37)
at com.sun.javafx.event.EventDispatchChainImpl.dispatchEvent(EventDispatchChainImpl.java:92)
at com.sun.javafx.event.BasicEventDispatcher.dispatchEvent(BasicEventDispatcher.java:35)
at com.sun.javafx.event.EventDispatchChainImpl.dispatchEvent(EventDispatchChainImpl.java:92)
at com.sun.javafx.event.EventUtil.fireEventImpl(EventUtil.java:53)
at com.sun.javafx.event.EventUtil.fireEvent(EventUtil.java:28)
at javafx.event.Event.fireEvent(Event.java:171)
at javafx.scene.Node.fireEvent(Node.java:6867)
at javafx.scene.control.Button.fire(Button.java:179)
at com.sun.javafx.scene.control.behavior.ButtonBehavior.mouseReleased(ButtonBehavior.java:193)
at com.sun.javafx.scene.control.skin.SkinBase$4.handle(SkinBase.java:336)
at com.sun.javafx.scene.control.skin.SkinBase$4.handle(SkinBase.java:329)
at com.sun.javafx.event.CompositeEventHandler.dispatchBubblingEvent(CompositeEventHandler.java:64)
at com.sun.javafx.event.EventHandlerManager.dispatchBubblingEvent(EventHandlerManager.java:217)
at com.sun.javafx.event.EventHandlerManager.dispatchBubblingEvent(EventHandlerManager.java:170)
at com.sun.javafx.event.CompositeEventDispatcher.dispatchBubblingEvent(CompositeEventDispatcher.java:38)
at com.sun.javafx.event.BasicEventDispatcher.dispatchEvent(BasicEventDispatcher.java:37)
at com.sun.javafx.event.EventDispatchChainImpl.dispatchEvent(EventDispatchChainImpl.java:92)
at com.sun.javafx.event.BasicEventDispatcher.dispatchEvent(BasicEventDispatcher.java:35)
at com.sun.javafx.event.EventDispatchChainImpl.dispatchEvent(EventDispatchChainImpl.java:92)
at com.sun.javafx.event.BasicEventDispatcher.dispatchEvent(BasicEventDispatcher.java:35)
at com.sun.javafx.event.EventDispatchChainImpl.dispatchEvent(EventDispatchChainImpl.java:92)
at com.sun.javafx.event.EventUtil.fireEventImpl(EventUtil.java:53)
at com.sun.javafx.event.EventUtil.fireEvent(EventUtil.java:33)
at javafx.event.Event.fireEvent(Event.java:171)
at javafx.scene.Scene$MouseHandler.process(Scene.java:3311)
at javafx.scene.Scene$MouseHandler.process(Scene.java:3151)
at javafx.scene.Scene$MouseHandler.access$1900(Scene.java:3106)
at javafx.scene.Scene.impl_processMouseEvent(Scene.java:1563)
at javafx.scene.Scene$ScenePeerListener.mouseEvent(Scene.java:2248)
at com.sun.javafx.tk.quantum.GlassViewEventHandler$MouseEventNotification.run(GlassViewEventHandler.java:250)
at com.sun.javafx.tk.quantum.GlassViewEventHandler$MouseEventNotification.run(GlassViewEventHandler.java:173)
at java.security.AccessController.doPrivileged(Native Method)
at com.sun.javafx.tk.quantum.GlassViewEventHandler.handleMouseEvent(GlassViewEventHandler.java:292)
at com.sun.glass.ui.View.handleMouseEvent(View.java:530)
at com.sun.glass.ui.View.notifyMouse(View.java:924)
at com.sun.glass.ui.win.WinApplication._runLoop(Native Method)
at com.sun.glass.ui.win.WinApplication.access$100(WinApplication.java:17)
at com.sun.glass.ui.win.WinApplication$3$1.run(WinApplication.java:67)
at java.lang.Thread.run(Thread.java:724)