服务器:
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;
}
}