Java的TCP網絡編程
阿新 • • 發佈:2018-09-05
聊天 編程 調用 ssa writer 服務器端 ip地址 NPU 等待
服務端代碼:
package socket; import java.io.BufferedReader; import java.io.IOException; import java.io.InputStream; import java.io.InputStreamReader; import java.net.ServerSocket; import java.net.Socket; /** * 聊天室服務端 * @author 小明 * */ public class Server { /** * 運行在服務端的ServerSocket主要有兩個作用: * 1:向系統申請服務端口,客戶端就是通過這個端口與服務端建立連接的。 * 2:監聽服務端口,一旦客戶端與服務端建立連接,就會 * 自動創建一個Socket,並通過該Socket與建立連接的 * 客戶端進行交互。 **/ private ServerSocket server; public Server() { try{ /** * 實例化ServerSocket的同時要指定向系統申請的服務端口。註意,該端口 * 不能與當前系統其它應用程序申請的端口號一致, * 否則會拋出端口被占用的異常。 */ System.out.println("正在啟動服務端..."); server = newServerSocket(8088); System.out.println("服務端啟動完畢!"); }catch(Exception e){ } } public void start() { try { System.out.println("等待客戶端連接"); Socket socket = server.accept(); /** * 準備接受客戶端連接 * * 這是一個阻塞方法。 *一旦調用accpet()方法,服務端阻塞在這裏,等著客戶端連接了。 *這時當我們啟動客戶端時,客戶端實例化socket,通過IP找到應用程序。 *這時accpet()馬上就會有反應。accpet()方法執行完就返回一個socket。 *通過這個socket就可以與剛建立連接的這個客戶端進行通訊了。 *客戶端創建一個socket,服務端通過accept()接收一個socket。 *這時候就可以進行溝通了。 * 需要處理異常。*/ InputStream in = socket.getInputStream(); InputStreamReader isr = new InputStreamReader(in); BufferedReader br = new BufferedReader(isr); String message = br.readLine(); System.out.println("客戶端說:" + message); System.out.println("一個客戶端連接了"); } catch (IOException e) { // TODO Auto-generated catch block e.printStackTrace(); } } public static void main(String[] args) { Server server = new Server(); server.start(); } }
需要先啟動服務器端,客戶端才啟動。
服務端運行後,accept()方法hi引起程序的阻塞。
客戶端代碼:
package socket; import java.io.BufferedWriter; import java.io.IOException; import java.io.OutputStreamWriter; import java.io.PrintWriter; import java.net.Socket; import java.net.UnknownHostException; /** * 聊天室客戶端 * @author 小明 * */ public class Client { /** * 套接字 * 封裝了TCP協議的通信細節,讓我們可以簡單地使用它完成TCP通訊 * Socket連接後提供了兩條流,通過兩條流的讀寫操作完成與遠端計算機的數據連接 * 完成與遠端計算機的數據交換。 */ private Socket socket; /** * 用來初始化客戶端 */ public Client() { try { /** * 實例化Socket時需要傳入兩個參數: * 1:服務端的IP地址 * 2:服務端的端口號 * 通過IP地址可以找到服務端所在的計算機 * 通過端口可以找到運行在服務端計算機上的 * 服務端應用程序 * 註意,實例化Socket的過程就是連接的過程,若 * 連接失敗就會拋出異常。 */ System.out.println("正在連接服務端..."); socket = new Socket("localhost", 8088); System.out.println("與服務端建立連接!"); /** * 有兩個參數,一個是IP地址,一個是端口號 */ /** * 所有應用程序在使用網絡的時候都要和操作系統申請一個網絡端口 * */ /** * 異常要我們自己進行處理,不要拋出 */ }catch (IOException e) { // TODO Auto-generated catch block e.printStackTrace(); } } /** * 寫程序時不要過度依賴main方法 * 客戶端開始工作的方法 */ public void start() { try{ //socket.getOutputStream(); PrintWriter pw = new PrintWriter( new BufferedWriter( new OutputStreamWriter( socket.getOutputStream())), true); //pw.write("你好服務端"); //使用上面這條語句是錯的,要使用具有自動行刷新的方法 //不要再下意識地寫上面那條語句了 pw.println("你好服務端!"); }catch(Exception e){ e.printStackTrace(); } } public static void main(String[] args) { Client client = new Client(); client.start(); } }
建立第二個服務端時,發信息給服務端時沒有反應。
因為只調用了一次accept()方法,所以接收不到信息。
Java的TCP網絡編程