JavaFX、聊天程序

服务器:

package net;

import javafx.application.Application;
import javafx.application.Platform;
import javafx.scene.Scene;
import javafx.scene.control.Label;
import javafx.scene.control.ScrollPane;
import javafx.scene.control.TextArea;
import javafx.scene.input.KeyCode;
import javafx.scene.layout.BorderPane;
import javafx.scene.layout.VBox;
import javafx.stage.Stage;

import java.awt.*;
import java.awt.event.KeyEvent;
import java.io.DataInputStream;
import java.io.DataOutputStream;
import java.io.IOException;
import java.net.ServerSocket;
import java.net.Socket;
import java.util.Date;

public class Exercise31_09Server extends Application {
    private TextArea messageFromClient = new TextArea();    //接受来自客户端的信息
    private TextArea messageToClient = new TextArea();      //发送给客户端信息
    private DataInputStream inputFromClient;                //输入流
    private DataOutputStream outputToClient;                //输出流

    public static void main(String[] args) {
        launch(args);
    }

    @Override
    public void start(Stage primaryStage) {
        //文本区域设置属性
        messageFromClient.setPrefColumnCount(31);
        messageFromClient.setPrefRowCount(6);
        messageFromClient.setEditable(false);
        messageToClient.setPrefColumnCount(31);
        messageToClient.setPrefRowCount(6);

        //文本区域设置键盘按下事件
        messageToClient.setOnKeyPressed(event -> {
            if (event.getCode() == KeyCode.ENTER) {
                try {
                    String text = messageToClient.getSelectedText().trim(); //获取被选文本
                    messageToClient.appendText("");     //
                    outputToClient.writeUTF(text);      //发送信息到客户端
                } catch (IOException ex) {
                    ex.printStackTrace();
                }
            }
        });

        Scene scene = new Scene(new VBox(10,
                getPane("Server", messageToClient), getPane("Client", messageFromClient)));
        primaryStage.setScene(scene);
        primaryStage.setTitle("Exercise31_09Server");
        primaryStage.show();

        //启动线程
        new Thread(this::startServer).start();
    }

    /** 获取面板模板 */
    private BorderPane getPane(String text, TextArea textArea) {
        BorderPane pane = new BorderPane(new ScrollPane(textArea));
        pane.setTop(new Label(text));

        return pane;
    }

    /** 启动服务器 */
    private void startServer() {
        try {
            //创建服务器套接字
            ServerSocket serverSocket = new ServerSocket(8000);
            System.out.println("Server started at " + new Date());

            //创建套接字(连接客户端)
            Socket socket = serverSocket.accept();
            inputFromClient = new DataInputStream(socket.getInputStream());     //输入流
            outputToClient = new DataOutputStream(socket.getOutputStream());

            while (true) {
                String text = inputFromClient.readUTF();    //接收客户端信息
                Platform.runLater(() -> messageFromClient.appendText(text + "\n"));
            }
        } catch (IOException ex) {
            ex.printStackTrace();
        } finally {
            try {       //关闭流
                inputFromClient.close();
                outputToClient.close();
            } catch (IOException ex) {
                ex.printStackTrace();
            }
        }
    }
}

客户端:

package net;

import javafx.application.Application;
import javafx.application.Platform;
import javafx.scene.Scene;
import javafx.scene.control.Label;
import javafx.scene.control.ScrollPane;
import javafx.scene.control.TextArea;
import javafx.scene.input.KeyCode;
import javafx.scene.layout.BorderPane;
import javafx.scene.layout.VBox;
import javafx.stage.Stage;

import java.io.DataInputStream;
import java.io.DataOutputStream;
import java.io.IOException;
import java.net.Socket;

public class Exercise31_09Client extends Application {
    private TextArea messageFromServer = new TextArea();        //接受服务器信息
    private TextArea messageToServer = new TextArea();          //发送信息到服务器
    private DataInputStream inputFromServer;                    //输入流
    private DataOutputStream outputToServer;                    //输出流

    public static void main(String[] args) {
        launch(args);
    }

    @Override
    public void start(Stage primaryStage) {
        //文本区域设置属性
        messageFromServer.setPrefColumnCount(31);
        messageFromServer.setPrefRowCount(6);
        messageFromServer.setEditable(false);
        messageToServer.setPrefColumnCount(31);
        messageToServer.setPrefRowCount(6);

        Scene scene = new Scene(new VBox(10,
                getPane("Server", messageToServer), getPane("Client", messageFromServer)));
        primaryStage.setScene(scene);
        primaryStage.setTitle("Exercise31_09Client");
        primaryStage.show();

        文本区域设置键盘按下事件
        messageToServer.setOnKeyPressed(event -> {
            if (event.getCode() == KeyCode.ENTER) {
                try {
                    String text = messageToServer.getSelectedText().trim(); //获取被选文本
                    messageToServer.appendText("");
                    outputToServer.writeUTF(text);      //发送信息到客户端
                } catch (IOException ex) {
                    ex.printStackTrace();
                }
            }
        });

        new Thread(() -> {
            try {
                //创建客户端套接字、输入输出流
                Socket socket = new Socket("localhost", 8000);
                inputFromServer = new DataInputStream(socket.getInputStream());
                outputToServer = new DataOutputStream(socket.getOutputStream());

                while (true) {
                    String text = inputFromServer.readUTF();    //接收服务器信息
                    Platform.runLater(() -> messageFromServer.appendText(text + "\n"));
                }
            } catch (IOException ex) {
                ex.printStackTrace();
            } finally {
                try {       //关闭流
                    inputFromServer.close();
                    outputToServer.close();
                } catch (IOException ex) {
                    ex.printStackTrace();
                }
            }
        }).start();
    }

    /** 获取面板模板 */
    private BorderPane getPane(String text, TextArea textArea) {
        BorderPane pane = new BorderPane(new ScrollPane(textArea));
        pane.setTop(new Label(text));

        return pane;
    }
}

 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值