計(jì)算機(jī)程序的架構(gòu)
單機(jī)版應(yīng)用程序, 最多只能由一個(gè)用戶使用, 如Word程序,記事本程序
C/S結(jié)構(gòu), Client(客戶端)/Server(服務(wù)器). 需要下載,安裝,升級(jí)客戶端應(yīng)用程序, 客戶端與服務(wù)器進(jìn)行通訊, 如QQ
B/S結(jié)構(gòu), Browser(瀏覽器)/Server(服務(wù)器), 用戶只需要有一個(gè)瀏覽器即可, 所有操作都由服務(wù)器完成
網(wǎng)絡(luò)開(kāi)發(fā)的三要素
1.要知道對(duì)方計(jì)算機(jī)在哪兒? 計(jì)算機(jī)的IP, 網(wǎng)絡(luò)中的計(jì)算機(jī)的IP是唯一的
2.知道程序?qū)?yīng)的端口號(hào), 端口號(hào)就是一個(gè)數(shù)字, 一臺(tái)計(jì)算機(jī)中可以安裝很多可以聯(lián)網(wǎng)的程序, 每個(gè)程序都有一個(gè)唯一的端口號(hào)
3.通訊協(xié)議, 計(jì)算機(jī)之間的通信標(biāo)準(zhǔn),如數(shù)據(jù)傳輸速率、傳輸代碼、代碼結(jié)構(gòu)、傳輸步驟
現(xiàn)在采用的網(wǎng)絡(luò)傳輸協(xié)議
TCP傳輸控制協(xié)議
IP網(wǎng)際協(xié)議
TCP/IP協(xié)議的傳輸層有兩個(gè)常見(jiàn)的傳輸協(xié)議: TCP和UDP, TCP就像我們打電話, UDP就像對(duì)講機(jī)
TCP傳輸采用三次握手機(jī)制
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.OutputStreamWriter;
import java.net.ServerSocket;
import java.net.Socket;
public class ChatServer {
public static void main(String[] args) throws IOException {
// 創(chuàng)建服務(wù)器?端, 注冊(cè)當(dāng)前程序的端口號(hào)
ServerSocket server = new ServerSocket(9090);
// 接受客戶端的連接,產(chǎn)?生?一個(gè)Socket
Socket socket = server.accept();
// 獲取Socket的輸?入流, 就是通過(guò)這個(gè)輸入流獲得客戶端發(fā)送給服務(wù)器的數(shù)據(jù)
BufferedReader socketReader = new BufferedReader(new InputStreamReader(socket.getInputStream()));
// 獲取Socket的輸出流, 就是通過(guò)該輸出流, 服務(wù)器把數(shù)據(jù)發(fā)送給客戶端
OutputStreamWriter socketOut = new OutputStreamWriter(socket.getOutputStream());
// 獲取鍵盤的輸?入流,通過(guò)該輸入流讀取鍵盤上輸入的數(shù)據(jù)
BufferedReader keyboardReader = new BufferedReader(new InputStreamReader(System.in));
// 不斷讀取客戶端數(shù)據(jù)
String line = null;
while ((line = socketReader.readLine()) != null) {
System.out.println("客戶端:" + line);
System.out.print("我說(shuō):");
line = keyboardReader.readLine();
socketOut.write(line + "\n");
socketOut.flush();
}
// 關(guān)閉
server.close();
}
}
import java.net.InetAddress;
import java.net.Socket;
import java.io.InputStreamReader;
import java.io.OutputStreamWriter;
import java.io.BufferedReader;
import java.io.IOException;
public class ChatClient {
public static void main(String[] args) throws IOException {
// 建立TCP客戶端與服務(wù)器的連接, 指定服務(wù)器的IP地址與程序?qū)?yīng)的端口號(hào)
// Socket socket = new Socket(InetAddress.getLocalHost(), 9090);
byte[] addr = {-64 ,-88, -115, 2}; //把192.168.141.2 IP地址轉(zhuǎn)換為字節(jié)
InetAddress address = InetAddress.getByAddress(addr) ;
Socket socket = new Socket(address, 9090);
// 獲取Socket輸出流對(duì)象, 通過(guò)該流把數(shù)據(jù)發(fā)送給服務(wù)器
OutputStreamWriter socketOut = new OutputStreamWriter(socket.getOutputStream());
// 獲取Socket輸入流對(duì)象, 通過(guò)該流獲得服務(wù)器發(fā)送給客戶端的數(shù)據(jù)
BufferedReader socketReader = new BufferedReader(new InputStreamReader(socket.getInputStream()));
// 獲取鍵盤輸入流對(duì)象,讀取數(shù)據(jù)
BufferedReader keyboardReader = new BufferedReader(new InputStreamReader(System.in));
String line = null;
System.out.print("我說(shuō):");
while ((line = keyboardReader.readLine()) != null) {
socketOut.write(line + "\n");
// 刷新
socketOut.flush();
// 讀取服務(wù)器端返回的數(shù)據(jù)
line = socketReader.readLine();
System.out.println("服務(wù)器:" + line);
System.out.print("我說(shuō):");
}
socket.close();
}
}