JavaFX和网络
发布时间:2020-12-15 04:29:11 所属栏目:Java 来源:网络整理
导读:我是套接字和网络编程的新手,这是我尝试创建一个简单的聊天服务器,我的代码似乎没有任何错误(据我所知),它编译得很好但是当我尝试运行它时,似乎陷入困境,什么都不做. 抱歉,如果这样的事情已经被问到,我什么都没找到,但我不确定是什么问题,所以我真的不知道该
我是套接字和网络编程的新手,这是我尝试创建一个简单的聊天服务器,我的代码似乎没有任何错误(据我所知),它编译得很好但是当我尝试运行它时,似乎陷入困境,什么都不做.
抱歉,如果这样的事情已经被问到,我什么都没找到,但我不确定是什么问题,所以我真的不知道该找什么. 服务器: import java.io.DataInputStream; import java.io.DataOutputStream; import java.io.IOException; import java.net.InetAddress; import java.net.ServerSocket; import java.net.Socket; import java.util.Date; import javafx.scene.Scene; import javafx.scene.control.TextArea; import javafx.stage.Stage; public class ChatServer extends Stage { TextArea informationArea = new TextArea(); String message = null; public ChatServer() { informationArea.setEditable(false); setTitle("Chat Server"); setScene(new Scene(informationArea,500,300)); show(); try { ServerSocket serverSocket = new ServerSocket(8000); informationArea.appendText("Server started at " + new Date() + 'n'); int clientNumber = 1; while(true) { Socket socket = serverSocket.accept(); InetAddress inetAddress = socket.getInetAddress(); informationArea.appendText( "Client: " + clientNumber++ + "nthost name: " + inetAddress.getHostName() + "ntIP address " + inetAddress.getHostAddress() + "nn" ); ClientHandler task = new ClientHandler(socket); new Thread(task).start(); } } catch(IOException ex) { System.err.println(ex); } } class ClientHandler implements Runnable { private Socket socket; ClientHandler(Socket socket) { this.socket = socket; } @Override public void run() { try { DataInputStream inputFromClient = new DataInputStream(socket.getInputStream()); DataOutputStream outputToClient = new DataOutputStream(socket.getOutputStream()); while (true) { if (message != null) { outputToClient.writeUTF(message); } message = inputFromClient.readUTF(); } } catch(IOException e) { System.err.println(e); } } } } 运行它的类: import javafx.application.Application; import javafx.stage.Stage; public class RunChatServer extends Application { public static void main(String[] args) { launch(args); } @Override public void start(Stage stage) { stage = new ChatServer(); } } 我很欣赏输入错误的原因,为什么,实现这个目标的正确方法,以及任何风格的建议,因为这是我的第一次尝试,而我不知道实现这一目标的传统方法. 更新: class ClientHandler extends Task { private Socket socket; ClientHandler(Socket socket) { this.socket = socket; } @Override public Void call() { try { DataInputStream inputFromClient = new DataInputStream(socket.getInputStream()); DataOutputStream outputToClient = new DataOutputStream(socket.getOutputStream()); while (true) { if (message != null) { outputToClient.writeUTF(message); outputToClient.flush(); } message = inputFromClient.readUTF(); } } catch(IOException e) { System.err.println(e); } return null; } } 但这没有解决任何问题…… 解决方法
将服务器接受套接字的循环放在自己的线程中而不是阻塞构造函数.
try { ServerSocket serverSocket = new ServerSocket(8000); informationArea.appendText("Server started at " + new Date() + 'n'); new Thread(() -> { int clientNumber = 1; while (true) { try { Socket socket = serverSocket.accept(); InetAddress inetAddress = socket.getInetAddress(); Platform.runLater(() -> informationArea.appendText( "Client: " + clientNumber++ + "nthost name: " + inetAddress.getHostName() + "ntIP address " + inetAddress.getHostAddress() + "nn" ) ); ClientHandler task = new ClientHandler(socket); new Thread(task).start(); } catch (IOException ex) { Logger.getLogger(ChatServer.class.getName()).log(Level.SEVERE,null,ex); } } }).start(); } catch (IOException ex) { System.err.println(ex); } (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |