網(wǎng)絡(luò)編程(理解)
-
用編程語言來實(shí)現(xiàn)計(jì)算機(jī)的資源共享和信息傳遞碍遍。
- 計(jì)算機(jī)網(wǎng)絡(luò):多臺(tái)獨(dú)立的計(jì)算機(jī)用網(wǎng)絡(luò)通信設(shè)備連接起來的網(wǎng)絡(luò)捻勉。
- 實(shí)現(xiàn)資源共享和數(shù)據(jù)傳遞豁辉。
- 計(jì)算機(jī)網(wǎng)絡(luò):多臺(tái)獨(dú)立的計(jì)算機(jī)用網(wǎng)絡(luò)通信設(shè)備連接起來的網(wǎng)絡(luò)捻勉。
網(wǎng)絡(luò)通信的三要素
* IP地址
* 計(jì)算機(jī)在網(wǎng)絡(luò)中的唯一標(biāo)識(shí)庶橱。
* 現(xiàn)在使用的是:"點(diǎn)分十進(jìn)制"
* 端口
* 應(yīng)用程序的的標(biāo)記夷恍。
* 協(xié)議
* 通信的規(guī)則。
* UDP:不建立連接棉安,數(shù)據(jù)打包傳輸,數(shù)據(jù)有限制贡耽,數(shù)據(jù)不可靠,速度快。
* TCP:建立連接,數(shù)據(jù)無限制,數(shù)據(jù)可靠,速度慢兜辞。
-
網(wǎng)絡(luò)7層協(xié)議圖解
-
Socket通信概述圖解
-
UDP發(fā)送和接收數(shù)據(jù)圖解
- UDP發(fā)送和接收數(shù)據(jù)
1. 先開啟誰都無所謂。
2. 發(fā)送端
創(chuàng)建發(fā)送端的Socket服務(wù)對(duì)象。
創(chuàng)建數(shù)據(jù)并把數(shù)據(jù)打包首量。
發(fā)送數(shù)據(jù)琅捏。
釋放資源。
3. 接收端
創(chuàng)建接收端的Socket服務(wù)對(duì)象市俊。
創(chuàng)建數(shù)據(jù)包蜒程。
接收數(shù)據(jù)。
解析數(shù)據(jù)。
釋放資源。
案例一:UDP協(xié)議 鍵盤錄入數(shù)據(jù)服務(wù)器接收并顯示數(shù)據(jù)。
//SendDemo發(fā)送demo
public class SendDemo {
public static void main(String[] args) throws IOException {
//創(chuàng)建Socket對(duì)象
DatagramSocket socket = new DatagramSocket();
// public DatagramPacket(byte[] buf,int length,InetAddress address,int
// port)
// buf其實(shí)就是要發(fā)送的數(shù)據(jù)信息
// length表示要發(fā)送的數(shù)據(jù)長(zhǎng)度
// address數(shù)據(jù)要發(fā)到哪里去。對(duì)應(yīng)的那個(gè)IP地址對(duì)象
// port端口號(hào)
BufferedReader reader = new BufferedReader(new InputStreamReader(System.in));
String string = null;
while ((string = reader.readLine()) != null ) {
if ("886".equals(string)) {
break;
}
byte[] by = string.getBytes();
DatagramPacket p = new DatagramPacket(by, by.length, InetAddress.getByName("192.168.3.108"), 10086);
socket.send(p);
}
socket.close();
}
}
ReceiveDemo接收demo
public class ReceiveDemo {
public static void main(String[] args) throws IOException {
//創(chuàng)建接收對(duì)象 并指定端口
DatagramSocket socket = new DatagramSocket(10086);
while (true) {
//創(chuàng)建接收數(shù)據(jù)包 接收數(shù)據(jù)
byte[] by = new byte[1024];
DatagramPacket p = new DatagramPacket(by, by.length);
//接收數(shù)據(jù)
socket.receive(p);
//解析數(shù)據(jù)并顯示
//InetAddress address = p.getAddress();
//String ip = address.getHostAddress();
byte[] byt = p.getData();
String string = new String(byt, 0,p.getLength());
System.out.println("獲得的數(shù)據(jù)是:" + string);
}
//關(guān)閉釋放資源
//socket.close();
}
}
-
UDP通訊簡(jiǎn)單使用多線程優(yōu)化
- 直接看代碼
ChatRoom測(cè)試類
public class ChatRoom {
public static void main(String[] args) throws IOException {
DatagramSocket dsSend = new DatagramSocket();
DatagramSocket dsReceive = new DatagramSocket(11111);
SendThread st = new SendThread(dsSend);
ReceiveThread rt = new ReceiveThread(dsReceive);
Thread t1 = new Thread(st);
Thread t2 = new Thread(rt);
t1.start();
t2.start();
}
}
接收數(shù)據(jù)類ReceiveThread
public class ReceiveThread implements Runnable {
private DatagramSocket ds;
public ReceiveThread(DatagramSocket ds) {
this.ds = ds;
}
@Override
public void run() {
try {
while (true) {
// 創(chuàng)建數(shù)據(jù)包
byte[] bys = new byte[1024];
DatagramPacket dp = new DatagramPacket(bys, bys.length);
// 接收數(shù)據(jù)
ds.receive(dp);
// 解析數(shù)據(jù)
String ip = dp.getAddress().getHostAddress();
String data = new String(dp.getData(), 0, dp.getLength());
System.out.println("from " + ip + " data is " + data);
}
} catch (IOException e) {
e.printStackTrace();
}
}
}
發(fā)送數(shù)據(jù)類SendThread
public class SendThread implements Runnable {
private DatagramSocket ds;
public SendThread(DatagramSocket ds) {
this.ds = ds;
}
@Override
public void run() {
try {
// 封裝鍵盤錄入
BufferedReader br = new BufferedReader(new InputStreamReader(
System.in));
String line = null;
while ((line = br.readLine()) != null) {
if ("886".equals(line)) {
break;
}
// 創(chuàng)建數(shù)據(jù)包
byte[] bys = line.getBytes();
DatagramPacket dp = new DatagramPacket(bys, bys.length,
InetAddress.getByName("192.168.3.108"), 11111);
// 發(fā)送數(shù)據(jù)
ds.send(dp);
}
// 釋放資源
ds.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}
TCP發(fā)送和接收數(shù)據(jù)
必須先開啟服務(wù)器醉鳖。
A:客戶端
創(chuàng)建客戶端Socket對(duì)象。
獲取輸出流。
寫數(shù)據(jù)惊畏。
釋放資源农曲。
B:服務(wù)器端
創(chuàng)建服務(wù)器Socket對(duì)象。
監(jiān)聽客戶端連接合呐。
獲取輸入流暮的。
讀取數(shù)據(jù)。
釋放資源淌实。
-
TCP協(xié)議發(fā)送和接收數(shù)據(jù)圖解
案例一:TCP協(xié)議 客戶端(ClientDemo)是鍵盤錄入冻辩,服務(wù)器(ServerDemo)是寫到文件猖腕。
ClientDemo 模擬客戶端
public class ClientDemo {
public static void main(String[] args) throws IOException {
// 創(chuàng)建客戶端對(duì)象
Socket s = new Socket("192.168.32.80", 12345);
// 鍵盤錄入
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
// 把通道內(nèi)的輸出流包裝
BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(
s.getOutputStream()));
String line = null;
while ((line = br.readLine()) != null) {
if ("over".equals(line)) {
break;
}
bw.write(line);
bw.newLine();
bw.flush();
}
s.close();
}
}
ServerDemo 模擬服務(wù)器
public class ServerDemo {
public static void main(String[] args) throws IOException {
// 創(chuàng)建服務(wù)器Socket對(duì)象
ServerSocket ss = new ServerSocket(12345);
// 監(jiān)聽客戶端連接
Socket s = ss.accept();
// 封裝通道內(nèi)的輸入流
BufferedReader br = new BufferedReader(new InputStreamReader(
s.getInputStream()));
// 把數(shù)據(jù)寫到文件
BufferedWriter bw = new BufferedWriter(new FileWriter("bw.txt"));
String line = null;
while ((line = br.readLine()) != null) {
bw.write(line);
bw.newLine();
bw.flush();
}
bw.close();
s.close();
ss.close();
}
}
案例二:TCP協(xié)議 客戶端是讀取文件,服務(wù)器是寫到文件恨闪。反饋信息
ClientDemo 模擬客戶端
public class ClientDemo {
public static void main(String[] args) throws IOException {
// 創(chuàng)建客戶端對(duì)象
Socket s = new Socket("192.168.32.80", 12345);
// 讀取文件的數(shù)據(jù)
BufferedReader br = new BufferedReader(new FileReader(
"InetAddressDemo.java"));
// 把通道內(nèi)的輸出流包裝
BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(
s.getOutputStream()));
String line = null;
while ((line = br.readLine()) != null) {
bw.write(line);
bw.newLine();
bw.flush();
}
// bw.write("你可以釋放了");
// bw.newLine();
// bw.flush();
s.shutdownOutput(); // 禁用輸出流
// 獲取服務(wù)器的反饋
// 把通道內(nèi)的輸入流包裝
BufferedReader reader = new BufferedReader(new InputStreamReader(
s.getInputStream()));
String data = reader.readLine(); // 阻塞式
System.out.println("client:" + data);
// 釋放資源
br.close();
s.close();
}
}
ServerDemo 模擬服務(wù)器
public class ServerDemo {
public static void main(String[] args) throws IOException {
// 創(chuàng)建服務(wù)器對(duì)象
ServerSocket ss = new ServerSocket(12345);
// 監(jiān)聽客戶端連接
Socket s = ss.accept();
// 把通道內(nèi)的輸入流包裝
BufferedReader br = new BufferedReader(new InputStreamReader(
s.getInputStream()));
// 把數(shù)據(jù)寫入文件
BufferedWriter bw = new BufferedWriter(new FileWriter("Copy.java"));
String line = null;
while ((line = br.readLine()) != null) { // 阻塞式
// if("你可以釋放了".equals(line)){
// break;
// }
bw.write(line);
bw.newLine();
bw.flush();
}
// 給客戶端一個(gè)反饋
// 把通道內(nèi)的輸出流包裝
BufferedWriter writer = new BufferedWriter(new OutputStreamWriter(
s.getOutputStream()));
writer.write("文件上傳成功");
writer.newLine();
writer.flush();
// 釋放資源
bw.close();
s.close();
ss.close();
}
}
案例三:TCP協(xié)議 客戶端是讀取圖片倘感,服務(wù)器是寫到圖片。反饋信息
ClientDemo 模擬客戶端
public class ClientDemo {
public static void main(String[] args) throws IOException {
// 窗口客戶端對(duì)象
Socket s = new Socket("192.168.32.80", 12345);
// 讀取圖片
InputStream is = new FileInputStream("mn.jpg");
// 寫到通道
OutputStream os = s.getOutputStream();
int by = 0;
while ((by = is.read()) != -1) {
os.write(by);
}
s.shutdownOutput();
// 獲取服務(wù)器的反饋
// 把通道內(nèi)的輸入流包裝
BufferedReader reader = new BufferedReader(new InputStreamReader(
s.getInputStream()));
String data = reader.readLine(); // 阻塞式
System.out.println("client:" + data);
// 釋放資源
is.close();
s.close();
}
}
ServerDemo 模擬服務(wù)器
public class ServerDemo {
public static void main(String[] args) throws IOException {
// 創(chuàng)建服務(wù)器對(duì)象
ServerSocket ss = new ServerSocket(12345);
// 監(jiān)聽客戶端連接
Socket s = ss.accept();
// 獲取輸入流
InputStream is = s.getInputStream();
// 獲取輸出流
OutputStream os = new FileOutputStream("copy.jpg");
int by = 0;
while ((by = is.read()) != -1) {
os.write(by);
}
// 給出反饋
BufferedWriter writer = new BufferedWriter(new OutputStreamWriter(
s.getOutputStream()));
writer.write("文件上傳成功");
writer.newLine();
writer.flush();
os.close();
s.close();
ss.close();
}
}