實現 一臺服務器對多個客戶機的響應
服務器:
import java.io.BufferedReader; import java.io.BufferedWriter; import java.io.InputStream; import java.io.InputStreamReader; import java.io.OutputStream; import java.io.OutputStreamWriter; import java.net.ServerSocket; import java.net.Socket; public class TcpServer { public static void main(String[] args) throws Exception { if (args.length == 0) { System.out.println("未輸入端口號,格式:java TcoServer 端口號"); return; } System.out.println("服務器已開啓,等待客戶機響應。。。"); ServerSocket serverSocket = new ServerSocket(Integer.parseInt(args[0])); while (true) { Socket socket = serverSocket.accept(); System.out.println(socket.getInetAddress().getHostAddress() + ":" + socket.getPort() + " 已連接!"); new Thread(new Send(socket)) { }.start(); } } } // 發送數據 class Send implements Runnable { public Send(Socket socket) { this.socket = socket; } private Socket socket; private InputStream in; private OutputStream out; private BufferedReader br; private BufferedWriter bw; public void run() { try { in = socket.getInputStream(); out = socket.getOutputStream(); br = new BufferedReader(new InputStreamReader(in)); bw = new BufferedWriter(new OutputStreamWriter(out)); while (true) { String msg = br.readLine(); if ("exit".equals(msg)) { System.out.println(socket.getInetAddress().getHostAddress() + ":" + socket.getPort() + "已斷開!"); break; } StringBuffer sb = new StringBuffer(msg); msg = sb.reverse().toString(); bw.write("服務器響應:-->" + msg + "/r/n"); bw.flush(); } } catch (Exception e) { e.printStackTrace(); } try { br.close(); bw.close(); socket.close(); } catch (Exception e) { e.printStackTrace(); } } }
客戶端:
import java.io.BufferedReader; import java.io.BufferedWriter; import java.io.InputStream; import java.io.InputStreamReader; import java.io.OutputStream; import java.io.OutputStreamWriter; import java.net.Socket; public class TcpClient { public static void main(String[] args) throws Exception { if (args.length < 2) { System.out.println("請輸入端口號以及IP地址,格式:java TcoClient IP 端口號"); return; } Socket socket = new Socket(args[0], Integer.parseInt(args[1])); InputStream in = socket.getInputStream(); OutputStream out = socket.getOutputStream(); BufferedReader br = new BufferedReader(new InputStreamReader(in)); BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(out)); BufferedReader console = new BufferedReader(new InputStreamReader( System.in)); while (true) { System.out.println("請輸入:"); String msg = console.readLine(); bw.write(msg + "/r/n"); bw.flush(); if ("exit".equalsIgnoreCase(msg)) break; System.out.println(br.readLine() + "/n"); } bw.close(); br.close(); socket.close(); } }
運行效果:
本教程將指導您如何生成一個可運行的Google Web Toolkit (GWT) 2.1和Spring應用程序,該應用程序爲域模型實現了CRUD應用程序模式。在本教程中,您將學習如何: 安裝Google Eclipse插件 爲GWT配置
CountDownLatch 是 Java 中的一個同步工具類,它允許一個或多個線程等待一系列指定操作執行完成。CountDownLatch 的主要方法有兩個:await() 方法等待 countDown 方法被調用指定的次數後繼續執行,c
導讀 本文主要講解了MVEL表達式和責任鏈設計模式相結合一起的消息處理解決方案設計、解耦消息處理節點以及方便代碼維護擴展。通過“訂單拆單消息”的接入作爲具體實踐案例,簡要闡述了MVEL表達式和Apache Chain職責鏈設計模式應用場景。
@EnableXxx註解 Spring有很多@EnableXxx這種形式的註解,類似於可以一鍵打開某項功能,相當於暴露給用戶的一種便捷的配置API,例如 @EnableAsync 激活異步執行能力,@EnableTransactionMan
Java將List結果分成3份執行 在Java編程中,有時候我們需要將一個List集合中的元素分成幾部分進行處理。這種情況下,我們可以使用Java的相關類庫和API來實現這一需求。在本文中,我們將介紹如何使用Java將List結果分成3份執
隨着業務的發展,文件數量和文件大小會急劇增加,文件遷移的數量和難度不斷攀升。oss_pipe 是rust編寫的文件遷移工具,旨在支撐大規模的文件遷移場景。 編寫 oss_pipe 的初衷 •同類產品面臨的問題 •rust 語
轉載自tuoluzhe8521 導讀:通過簡化複雜的任務依賴關係, DolphinScheduler爲數據工程師提供了強大的工作流程管理和調度能力。在3.2.0版本中,DolphinScheduler帶來了一系列新功能和改進,使其在生產環
微服務Gateway 微服務網關部署在前端Nginx網關和後端微服務之間,Nginx一般充當流量網關,而微服務網關屬於一種業務型 網關,微服務網關層爲後端的微服務羣組提供統一的接入地址,其核心功能是統一做服務路由,在路由基礎上還 可以實現一
本文分享自華爲雲社區《JDBC連接openGauss6.0和PostgreSQL16.2性能對比》,作者: Gauss松鼠會小助手。 PostgreSQL vs openGauss 01 前置準備 安裝JDK: 詳細安裝步驟請問度娘,輸
1 前言: 大家都知道,阿里規範中有一條是不允許用excutors去創建線程池,而是採用ThreadPoolExecutor的原生方式去創建。很早就聽過所過這種說法,但是一直都沒去搞清楚是爲什麼,今天就查閱資料去了解了這
1)編碼 消息長度(short int-->2個字節) + 消息編號(short int--》2個字節) + 消息體 2)Protobuf協議文檔 (1)syntax="proto3"; (2)命名格式
很早之前寫過一篇《Android內存管理機制詳解》點擊量已7萬+,現把Google官方文檔整理輸出一下,供各位參考。 一、內存管理概覽 Android 運行時 (ART) 和 Dalvik 虛擬機使用分頁和內存映射來管理內存。這意味着應用
文盤rust 好久沒有更新了。這段時間筆者用rust寫了個小東西,跟各位分享一下 背景 隨着業務的發展,文件數量和文件大小會急劇增加,文件遷移的數量和難度不斷攀升。oss_pipe 是rust編寫的文件遷移工具,旨在支撐大規模的文件遷移場
本文主要內容 背景 在Java語言中,程序運行的時候,會產生很多對象,而對象信息也只是在程序運行的時候纔在內存中保持其狀態,一旦程序停止,內存釋放,對象也就不存在了。 怎麼能讓對象永久的保存下來呢?--------對象序列化 。 何
綱要 String StringBuffer 基礎類型對應的8個包裝類 日期相關類 數字相關類 Random Enum 1. 理解String類的存儲原理 String類是不可變類,也就是說String對象聲明後,將不可修改。 S