使用套接字

时间:2015-10-05 05:14:49

标签: multithreading sockets javafx

我在编写JavaFX聊天客户端的套接字端时遇到问题。这是我第一次以任何方式处理套接字,所以预计会有一些麻烦。我一直在关注此页面来设计服务器端 - 客户端: http://pirate.shu.edu/~wachsmut/Teaching/CSAS2214/Virtual/Lectures/chat-client-server.html

我的问题是将我输入GUI的文本导入DataInputSteam和DataOutputStream,以便同一服务器上的其他人可以看到更改。我做 不明白如何将UI中的文本转换为套接字 可以使用。

以下是我的控制器类的一部分:

@FXML
private TextArea messageArea;

@FXML
private Button sendButton;

private ChatClient client;

@FXML
public void initialize() {

    client = new ChatClient(ChatServer.HOSTNAME, ChatServer.PORT);

    sendButton.setOnAction(event -> {
        client.handle(messageArea.getText());
    });
}

ChatClient类是一个Runnable,它带有一个连接到Socket的DataInputStream和DataOutputStream字段。我没有从链接中改变太多:

public class ChatClient implements Runnable {

private Socket socket;
private Thread thread;
private DataInputStream streamIn;
private DataOutputStream streamOut;
private ChatClientThread client;

public ChatClient(String serverName, int port) {
    System.out.println("Establishing connection...");
    try {
        socket = new Socket(serverName, port);
        System.out.println("Connected: " + socket);
        start();
    } catch (UnknownHostException e) {
       System.out.println("Unknown host: " + e.getMessage());
    } catch (IOException e) {
        System.out.println("Unexpected: " + e.getMessage());
    }
}

@Override
public void run() {
    while (thread != null) {
        try {
            streamOut.writeUTF(streamIn.readUTF());
            streamOut.flush();
        } catch (IOException e) {
            System.out.println("Sending error: " + e.getMessage());
            stop();
        }
    }
}

public void handle(String msg) {
    try {
        streamOut.writeUTF(msg);
        streamOut.flush();
    } catch (IOException e) {
        System.out.println("Could not handle message: " + e.getMessage());
    }
    System.out.println(msg);
}

public void start() throws IOException {
    streamIn = new DataInputStream(socket.getInputStream());
    streamOut = new DataOutputStream(socket.getOutputStream());
    if (thread == null) {
        client = new ChatClientThread(this, socket);
        thread = new Thread(this);
        thread.start();
    }
}

所以在控制器类中,我调用的是处理流的handle方法。原始代码刚写入控制台,所以我不得不更改行: streamIn = new DataInputStream(System.in) 至 streamIn = new DataInputStream(socket.getInputStream());

还有一个ChatClientThread类,它扩展了Thread并在其run方法中调用了ChatClient.handle()。

我想我的问题是当writeUTF和readUTF与DataStream交互时如何更新GUI。我知道streamOut.writeUTF(msg)将DataOutputStream更改为"有"该字符串,但我不确定我应该如何使用该数据流更新我的gui,以便使用该应用程序的所有客户端都可以看到更新。我现在的方式,如果我运行JavaFX应用程序的两个实例,他们不会'通过UI或控制台进行通信。每当我点击发送按钮

时,我的程序就会停止

0 个答案:

没有答案