diff --git a/exp3-network/src/main/java/net/lensfrex/URLConnectionResource.java b/exp3-network/src/main/java/net/lensfrex/URLConnectionResource.java index 6c2874f..f03f273 100644 --- a/exp3-network/src/main/java/net/lensfrex/URLConnectionResource.java +++ b/exp3-network/src/main/java/net/lensfrex/URLConnectionResource.java @@ -18,9 +18,9 @@ public class URLConnectionResource { Set>> headers = urlConnection.getHeaderFields().entrySet(); - for (Map.Entry> entry : headers) { - String key = entry.getKey(); - List values = entry.getValue(); + for (Map.Entry> header : headers) { + String key = header.getKey(); + List values = header.getValue(); for (String value : values) { System.out.printf("%s: %s%n", key, value); } diff --git a/exp3-network/src/main/java/net/lensfrex/socket/client/Client.java b/exp3-network/src/main/java/net/lensfrex/socket/client/Client.java index 8b2ebf6..6511cd2 100644 --- a/exp3-network/src/main/java/net/lensfrex/socket/client/Client.java +++ b/exp3-network/src/main/java/net/lensfrex/socket/client/Client.java @@ -17,7 +17,6 @@ import net.lensfrex.socket.common.MessageData; import java.io.IOException; import java.io.InputStream; -import java.io.OutputStream; import java.net.URL; import java.nio.charset.StandardCharsets; import java.util.Random; @@ -32,9 +31,9 @@ public class Client extends Application { Scene scene = new Scene(new UI().buildUI(), 515, 509); // 主题,不想要或者网络出错的话注释掉就好了 -// scene.getStylesheets().add(new URL("https://www.lensfrex.net/light.css").toExternalForm()); + scene.getStylesheets().add(new URL("https://www.lensfrex.net/light.css").toExternalForm()); // scene.getStylesheets().add(new URL("https://www.lensfrex.net/dark.css").toExternalForm()); - scene.getStylesheets().add(new URL("http://127.0.0.1/light.css").toExternalForm()); +// scene.getStylesheets().add(new URL("http://127.0.0.1/light.css").toExternalForm()); stage.setTitle("( ̄﹃ ̄)"); stage.setScene(scene); @@ -53,9 +52,11 @@ class UI { private TextField serverTextField; private TextArea messageTextArea; + private HBox userControlVBox; private TextField usernameTextField; private Button loginButton, logoutButton; + private HBox messageControlVBox; private TextField messageTextField; private Button sendButton; @@ -109,16 +110,10 @@ class UI { loginButton = new Button("登录"); loginButton.setOnAction(e -> { try { - this.auth(Constant.OPCODE_LOGIN); - - logoutButton.setDisable(false); - loginButton.setDisable(true); - serverTextField.setDisable(true); - usernameTextField.setDisable(true); - messageControlVBox.setDisable(false); + this.changeLoginStatus(true); } catch (Exception ex) { ex.printStackTrace(); - messageTextArea.textProperty().set("登录服务器时发生错误:" + ex); + messageTextArea.textProperty().set("请求服务器时发生错误:" + ex); } }); @@ -126,16 +121,10 @@ class UI { logoutButton.setDisable(true); logoutButton.setOnAction(e -> { try { - this.auth(Constant.OPCODE_LOGOUT); - - logoutButton.setDisable(true); - loginButton.setDisable(false); - serverTextField.setDisable(false); - usernameTextField.setDisable(false); - messageControlVBox.setDisable(true); + this.changeLoginStatus(false); } catch (Exception ex) { ex.printStackTrace(); - messageTextArea.textProperty().set("登录服务器时发生错误:" + ex); + messageTextArea.textProperty().set(messageTextArea.getText() + "请求服务器时发生错误:" + ex); } }); @@ -144,29 +133,21 @@ class UI { return userControlVBox; } - private void auth(byte[] opcode) throws Exception { - String[] address = serverTextField.getText().split(":"); - int port = Integer.parseInt(address[1]); - - ClientConnection connection = new ClientConnection(address[0], port); - + private void changeLoginStatus(boolean login) throws IOException { byte[] data = usernameTextField.getText().getBytes(StandardCharsets.UTF_8); - OutputStream outputStream = connection.getOutputStream(); - - Common.send(data, opcode, outputStream); - connection.finishOutput(); - InputStream inputStream = connection.getInputStream(); - byte[] header = new byte[4]; - inputStream.read(header); + DataPack responseDataPack = this.sendData(data, login ? Constant.OPCODE_LOGIN : Constant.OPCODE_LOGOUT); + this.displayResponse(responseDataPack); - DataPack dataPack = Common.readDataPack(inputStream); - MessageData messageData = MessageData.parse(dataPack.getData()); - messageTextArea.textProperty().set(messageTextArea.getText() + - String.format("\n服务器[%s]响应:%s", messageData.getIdText(), messageData.getMessageText())); - connection.finishInput(); + this.switchStatus(login); + } - connection.disconnect(); + private void switchStatus(boolean online) { + logoutButton.setDisable(!online); + loginButton.setDisable(online); + serverTextField.setDisable(online); + usernameTextField.setDisable(online); + messageControlVBox.setDisable(!online); } private HBox messageControlPane() { @@ -182,30 +163,14 @@ class UI { sendButton = new Button("发送"); sendButton.setOnAction(e -> { - String[] address = serverTextField.getText().split(":"); - int port = Integer.parseInt(address[1]); try { - ClientConnection connection = new ClientConnection(address[0], port); - MessageData messageData = new MessageData(usernameTextField.getText(), messageTextField.getText()); + DataPack responseDataPack = this.sendData(messageData.toBytes(), Constant.OPCODE_SEND_MESSAGE); - Common.send(messageData.toBytes(), Constant.OPCODE_SEND_MESSAGE, connection.getOutputStream()); - connection.finishOutput(); - - InputStream inputStream = connection.getInputStream(); - byte[] header = new byte[4]; - inputStream.read(header); - - DataPack dataPack = Common.readDataPack(inputStream); - MessageData responseData = MessageData.parse(dataPack.getData()); - messageTextArea.textProperty().set(messageTextArea.getText() + - String.format("\n服务器[%s]响应:%s", responseData.getIdText(), responseData.getMessageText())); - connection.finishInput(); - - connection.disconnect(); - } catch (IOException ex) { + this.displayResponse(responseDataPack); + } catch (Exception ex) { ex.printStackTrace(); - messageTextArea.textProperty().set("登录服务器时发生错误:" + ex); + messageTextArea.textProperty().set(messageTextArea.getText() + "请求服务器时发生错误:" + ex); } }); @@ -213,4 +178,35 @@ class UI { return messageControlVBox; } + + private ClientConnection createConnection() throws IOException { + String[] address = serverTextField.getText().split(":"); + int port = Integer.parseInt(address[1]); + + return new ClientConnection(address[0], port); + } + + private DataPack sendData(byte[] data, byte[] opcode) throws IOException { + ClientConnection connection = this.createConnection(); + + Common.write(data, opcode, connection.getOutputStream()); + connection.finishOutput(); + + InputStream inputStream = connection.getInputStream(); + byte[] header = new byte[4]; + inputStream.read(header); + + DataPack dataPack = Common.readDataPack(inputStream); + connection.finishInput(); + + connection.disconnect(); + return dataPack; + } + + private void displayResponse(DataPack dataPack) { + MessageData messageData = MessageData.parse(dataPack.getData()); + + messageTextArea.textProperty().set(messageTextArea.getText() + + String.format("\n服务器[%s]响应:%s", messageData.getIdText(), messageData.getMessageText())); + } } \ No newline at end of file diff --git a/exp3-network/src/main/java/net/lensfrex/socket/client/Global.java b/exp3-network/src/main/java/net/lensfrex/socket/client/Global.java deleted file mode 100644 index 4734616..0000000 --- a/exp3-network/src/main/java/net/lensfrex/socket/client/Global.java +++ /dev/null @@ -1,4 +0,0 @@ -package net.lensfrex.socket.client; - -public class Global { -} diff --git a/exp3-network/src/main/java/net/lensfrex/socket/client/MainUI.java b/exp3-network/src/main/java/net/lensfrex/socket/client/MainUI.java deleted file mode 100644 index 71e4af7..0000000 --- a/exp3-network/src/main/java/net/lensfrex/socket/client/MainUI.java +++ /dev/null @@ -1,7 +0,0 @@ -package net.lensfrex.socket.client; - -import javafx.scene.layout.Pane; - -public class MainUI extends Pane { - -} diff --git a/exp3-network/src/main/java/net/lensfrex/socket/common/Common.java b/exp3-network/src/main/java/net/lensfrex/socket/common/Common.java index 71fdb0e..90b7a2a 100644 --- a/exp3-network/src/main/java/net/lensfrex/socket/common/Common.java +++ b/exp3-network/src/main/java/net/lensfrex/socket/common/Common.java @@ -3,7 +3,6 @@ package net.lensfrex.socket.common; import java.io.IOException; import java.io.InputStream; import java.io.OutputStream; -import java.nio.charset.StandardCharsets; public class Common { public static DataPack readDataPack(InputStream inputStream) { @@ -14,27 +13,27 @@ public class Common { return DataPack.parse(dataPackBytes); } - public static int sendMessage(String id, String message, OutputStream outputStream) throws IOException { + public static int writeMessage(String id, String message, OutputStream outputStream) throws IOException { MessageData messageData = new MessageData(id, message); - return sendMessage(messageData, outputStream); + return writeMessage(messageData, outputStream); } - public static int sendMessage(MessageData message, OutputStream outputStream) throws IOException { - return sendMessage(message.toBytes(), outputStream); + public static int writeMessage(MessageData message, OutputStream outputStream) throws IOException { + return writeMessage(message.toBytes(), outputStream); } - public static int sendMessage(byte[] data, OutputStream outputStream) throws IOException { - return send(data, Constant.OPCODE_SEND_MESSAGE, outputStream); + public static int writeMessage(byte[] data, OutputStream outputStream) throws IOException { + return write(data, Constant.OPCODE_SEND_MESSAGE, outputStream); } - public static int send(byte[] data, byte[] opcode, OutputStream outputStream) throws IOException { + public static int write(byte[] data, byte[] opcode, OutputStream outputStream) throws IOException { DataPack dataPack = new DataPack(opcode, data); - return send(dataPack, outputStream); + return write(dataPack, outputStream); } - public static int send(DataPack dataPack, OutputStream outputStream) throws IOException { + public static int write(DataPack dataPack, OutputStream outputStream) throws IOException { outputStream.write(Constant.MAGIC_HEADER); outputStream.write(dataPack.toBytes()); diff --git a/exp3-network/src/main/java/net/lensfrex/socket/server/Server.java b/exp3-network/src/main/java/net/lensfrex/socket/server/Server.java index be11c07..3d94f60 100644 --- a/exp3-network/src/main/java/net/lensfrex/socket/server/Server.java +++ b/exp3-network/src/main/java/net/lensfrex/socket/server/Server.java @@ -63,17 +63,17 @@ class ServerThread extends Thread { if (Arrays.equals(Constant.OPCODE_LOGIN, opcode)) { this.login(new String(dataPack.getData())); - Common.sendMessage(SERVER_ID, Constant.MESSAGE_OK, outputStream); + Common.writeMessage(SERVER_ID, Constant.MESSAGE_OK, outputStream); } else if (Arrays.equals(Constant.OPCODE_LOGOUT, opcode)) { this.logout(new String(dataPack.getData())); - Common.sendMessage(SERVER_ID, Constant.MESSAGE_OK, outputStream); + Common.writeMessage(SERVER_ID, Constant.MESSAGE_OK, outputStream); } else if (Arrays.equals(Constant.OPCODE_REQUEST_MESSAGE, opcode)) { this.sendRandomMessage(outputStream); } else if (Arrays.equals(Constant.OPCODE_SEND_MESSAGE, opcode)) { String receivedMessage = this.receiveMessage(dataPack); String responseMessage = String.format("Receive message '%s'", receivedMessage); - Common.sendMessage(SERVER_ID, responseMessage, outputStream); + Common.writeMessage(SERVER_ID, responseMessage, outputStream); } } @@ -94,7 +94,7 @@ class ServerThread extends Thread { } private void sendMessage(String messageText, OutputStream outputStream) throws IOException { - Common.sendMessage(SERVER_ID, messageText, outputStream); + Common.writeMessage(SERVER_ID, messageText, outputStream); } private String receiveMessage(DataPack dataPack) {