一、服务器端
ServerSocket serverSocket = new ServerSocket(8080);//创建服务器套接字,
Socket socket = serverSocket.accept();//并等待连接
二、客户端
Socket socket = new Socket("localhost",8080);//创建套接字并通过该套接字向服务器发送请求连接
客户端代码:
public class Client extends Application{ //初始化驶入输出流 DataOutputStream outputStream = null; DataInputStream inputStream = null; @Override public void start(Stage primaryStage) throws Exception { BorderPane pane = new BorderPane(); pane.setPadding(new Insets(10,10,10,10)); pane.setLeft(new Label("输入半径: ")); TextField tf = new TextField(); tf.setAlignment(Pos.BOTTOM_LEFT); pane.setCenter(tf); BorderPane mainPane = new BorderPane(); TextArea ta = new TextArea(); mainPane.setCenter(new ScrollPane(ta)); mainPane.setTop(pane); Scene scene = new Scene(mainPane,450,200); primaryStage.setTitle("Client"); primaryStage.setScene(scene); primaryStage.show(); try { Socket socket = new Socket("localhost",8080); inputStream = new DataInputStream(socket.getInputStream()); outputStream = new DataOutputStream(socket.getOutputStream()); }catch (IOException e){ System.err.println(e); } tf.setOnAction(e->{ try{ double radius = Double.parseDouble(tf.getText().trim()); outputStream.writeDouble(radius); outputStream.flush(); double area = inputStream.readDouble(); ta.appendText("半径: "+radius+"\n"); ta.appendText("从服务器得到的面积: "+area+"\n"); }catch (IOException ex){ ta.appendText(ex.toString()+"\n"); } }); } }
服务器端代码:
public class MultiThreadServer extends Application{ private TextArea ta = new TextArea(); private int clientNo = 0; @Override public void start(Stage primaryStage) throws Exception { Scene scene = new Scene(new ScrollPane(ta),450,200); primaryStage.setTitle("Server"); primaryStage.setScene(scene); primaryStage.show(); new Thread(()->{//ServerSocket accept()方法执行的时候花费时间,不应放在JavaFX程序线程中运行,因此放在一个独立的线程中 try{ //服务器套接字 ServerSocket serverSocket = new ServerSocket(8080); ta.appendText("服务器开始工作: "+new Date().toString()+"\n"); while (true){ //等待连接 Socket socket = serverSocket.accept(); clientNo++; Platform.runLater(()->{ ta.appendText("第 "+clientNo+" 个客户端连接成功: "+new Date().toString()+"\n"); InetAddress inetAddress = socket.getInetAddress(); ta.appendText("客户端"+clientNo+"的主机名为:"+inetAddress.getHostName()+"\n"); ta.appendText("客户端"+clientNo+"的地址为:"+inetAddress.getHostAddress()+"\n"); }); //创建一个新线程处理通信 new Thread(new HandleAClient(socket)).start(); } }catch (IOException e){ e.printStackTrace(); } }).start(); } class HandleAClient implements Runnable{ private Socket socket; public HandleAClient(Socket socket) { this.socket = socket; } @Override public void run() { try { //创建输入输出流接受客户端的数据 DataInputStream inputStream = new DataInputStream(socket.getInputStream()); DataOutputStream outputStream = new DataOutputStream(socket.getOutputStream()); while (true){ double radius = inputStream.readDouble(); double area = radius*radius*Math.PI; outputStream.writeDouble(area); Platform.runLater(()->{ ta.appendText("客户端发过来的半径:"+radius+"\n"); ta.appendText("服务器发出去的面积:"+area+"\n"); }); } } catch (IOException e) { e.printStackTrace(); } } } }