網(wǎng)絡(luò)編程基礎(chǔ)知識大全
============================
1. IP地址
? IP地址,就是每一個接入互聯(lián)網(wǎng)的主機的唯一身份標識,IP地址
? 0-255組成的,分成了4段,每段0-255
? IP地址分類:ABCDE
? 局域網(wǎng):192.168開頭
? 本地回環(huán)地址:127.0.0.1 每一個電腦,網(wǎng)卡正常工作,主機的IP就是127.0.0.1
? IP地址這個事物也是對象,對IP地址對象的描述類
? java.net.InetAddress
? 私有構(gòu)造方法,靜態(tài)方法返回本類對象的
? static InetAddress getLocalHost() 獲取本地主機IP地址對象
? 這個方法在哪個機器上運行,那個機器就是本地主機
?
? InetAddress類中的兩個方法 getHostAddress()通過IP地址對象,獲取IP地址
? InetAddress類中的兩個方法 getHostName()通過IP地址對象,獲取主機名
? 如果獲取一臺主機的IP或者主機名,必須先獲取到一臺主機的IP對象(InetAddress)
? 獲取遠程主機IP地址對象
? static InetAddress getByName(String host) 參數(shù),傳遞主機名,傳遞IP地址
/*
?* 獲取本地主機IP地址對象
?* InetAddress類的靜態(tài)方法 getLocalHost
?*/
import java.net.*;
public class InetAddressDemo {
?public static void main(String[] args)throws UnknownHostException {
? InetAddress i = InetAddress.getLocalHost();
? System.out.println(i);//機器名/IP地址
? //獲取主機名
? String name = i.getHostName();
? //獲取IP地址
? String ip = i.getHostAddress();
? System.out.println(name+"..."+ip);
?}
}
?//===================================================
2. 端口號
? 操作系統(tǒng)的一個數(shù)字物理標識
? 看成是進入或者出去操作系統(tǒng)的一個門牌號
? 我郵寄一個包裹 昌平建材城西路100號
? 收件:大興黃村北路200號
? 端口號 0-1024操作系統(tǒng)保留號
? 最大65535
? 常見端口號:
? ? 80 http訪問互聯(lián)網(wǎng)的默認端口號
? ? http://www.baidu.com:80
? ? 21 FTP數(shù)據(jù)傳輸端口號
? ? 8080 Javaweb服務(wù)器默認端口號
? ? 3306 MySQL數(shù)據(jù)的連接端口號
? ? 1521 Oracle數(shù)據(jù)庫連接端口號
? ? 1433 MS SQLServer數(shù)據(jù)庫連接端口號
//===================================================
3. 傳輸協(xié)議
? 發(fā)送,接受兩個方面約定好的內(nèi)容
? 兩個人打電話,相約晚上11點-11點30分可以通話,語音采用中文
? UDP -- 面向無連接協(xié)議
? 通信雙方不需要連接
? 不需要連接,不可靠,丟數(shù)據(jù)
? 連接效率很高
? 不允許傳輸大數(shù)據(jù),限制在64KB以內(nèi)
? TCP -- 面向連接協(xié)議
? 通信雙方需要建立連接,三次握手,效率底下
? 連接,安全可靠協(xié)議,不丟失數(shù)據(jù)
? 適合于大數(shù)據(jù)傳輸
//===================================================
4. Socket服務(wù)
?Socket就是為網(wǎng)絡(luò)服務(wù)提供的一種機制
?通信的兩端都有Socket
?提供接收和發(fā)送功能的
?寫功能的時候,接收還是發(fā)送的,必須有Socket服務(wù)
?UDP的傳輸
? 分為發(fā)送端和接收端
? 發(fā)送端:
? ? A 發(fā)送的數(shù)據(jù)封包 -- 封裝數(shù)據(jù)包的類,DatagramPacket
? ? B 將封裝好的數(shù)據(jù)包,交給Socket進行發(fā)送 -- DategramSocket
? ? C 關(guān)閉資源
? 接收端:
? ? A. 接收數(shù)據(jù)包,Socket接收
? ? B. 拆包
? ? C. 拆包后的信息,顯示出來
? ? D. 關(guān)閉資源
?
? DategramPacket數(shù)據(jù)包:
? ? 構(gòu)造方法DatagramPacket(byte[] buf, int length, InetAddress address, int port)
? ? ? ? ? ? ? ? ? ? ? ? ? ? ? 字節(jié)數(shù)據(jù) 長度 IP地址 端口號
? ? 構(gòu)造方法DatagramPacket(byte[] buf, int length) 接收
? ? int getLength() 接收數(shù)據(jù)包中,數(shù)組的有效個數(shù)
? ? int getPort()獲取發(fā)送端口號
? ? InetAddress getAddress()返回發(fā)送端的IP地址對象
?
?DatagramSocket發(fā)送包,接收包
? ?構(gòu)造方法,發(fā)送時候空參數(shù)的
? ?發(fā)送方法,send(數(shù)據(jù)包)
? ?構(gòu)造DatagramSocket(int port) 接收,傳遞端口號
? ?接收的方法 receive(數(shù)據(jù)包)
/*
?* UDP發(fā)送端
?*/
import java.net.*;
import java.util.Scanner;
public class UDPSend {
?public static void main(String[] args) throws Exception{
? new Scanner(System.in).nextLine();
? //將數(shù)據(jù)封裝到數(shù)據(jù)包 DategramPacket
? byte[] bytes = "你好UDP".getBytes();
? DatagramPacket dp = new
? ? DatagramPacket(bytes, bytes.length, InetAddress.getByName("127.0.0.1"),10000);
? //創(chuàng)建投遞服務(wù)的Socket對象,DatagramSocket
? DatagramSocket ds = new DatagramSocket(8000);
? //將數(shù)據(jù)包,交給Socket發(fā)送
? ds.send(dp);
? //關(guān)閉資源
? ds.close();
?}
}
/*
?* UDP的接收端
?*/
import java.net.*;
public class UDPReceive {
?public static void main(String[] args) throws Exception{
? //創(chuàng)建投遞服務(wù)的Socket對象
? DatagramSocket ds = new DatagramSocket(10000);
? //定義數(shù)據(jù)包,接收
? byte[] bytes = new byte[10];
? DatagramPacket dp = new DatagramPacket(bytes,bytes.length);
? //Socket接收數(shù)據(jù)包
? ds.receive(dp);
? //獲取數(shù)組中的有效個數(shù)
? int length = dp.getLength();
? //獲取端口號
? int port = dp.getPort();
? //獲取發(fā)送端的IP地址對象
? InetAddress i = dp.getAddress();
? String ip = i.getHostAddress();
? //輸出全部的信息
? System.out.println(new String(bytes,0,length)+"..."+ip+"..."+port);
? //關(guān)閉資源
? ds.close();
?
?}
}
//===================================================
5. TCP
? 客戶端和服務(wù)器
? 建立連接,客戶端必須連接服務(wù)器,否則程序無法運行
? 客戶端的Socket服務(wù),Socket
? 服務(wù)器端的Socket服務(wù),ServerSocket
? Socket類構(gòu)造方法 Socket(String host, int port)
? 構(gòu)造方法,一旦執(zhí)行,就會去連接服務(wù)器,如果沒有服務(wù)器,拋出異常
? ?OutputStream getOutputStream() 通過Socket對象獲取字節(jié)輸出流
? ?InputStream getInputStream()通過Socket對象獲取字節(jié)輸入流
?
?ServerSocket類構(gòu)造方法ServerSocket(int port)
?Socket accept()獲取客戶端的連接對象,這個方法告訴服務(wù)器,是哪一個客戶端連接的
?客戶端通過自己Socket獲取字節(jié)輸出流,向服務(wù)器發(fā)送數(shù)據(jù)
?服務(wù)器通過客戶端連接對象Socket獲取字節(jié)輸入流,讀取客戶端發(fā)送的數(shù)據(jù)
?服務(wù)器通過客戶端連接對象Socket獲取字節(jié)輸出流,向客戶端發(fā)送數(shù)據(jù)
?客戶端通過字節(jié)的Socket對象獲取字節(jié)輸入流,讀取服務(wù)器發(fā)回的數(shù)據(jù)
?/*
?* TCP的客戶端
?*/
import java.io.*;
import java.net.*;
public class TCPClient {
?public static void main(String[] args)throws Exception {
? //創(chuàng)建客戶端的Socket對象
? Socket s = new Socket("127.0.0.1",10000);
? //將數(shù)據(jù)傳輸?shù)椒?wù)器,字節(jié)輸出流
? OutputStream out = s.getOutputStream();
? //寫,字節(jié)數(shù)組
? out.write("你好TCP".getBytes());
?
? //客戶端獲取服務(wù)器發(fā)回的信息,字節(jié)輸入流
? InputStream in = s.getInputStream();
? byte[] bytes = new byte[10];
? int len = 0 ;
? len = in.read(bytes);
? System.out.println(new String(bytes,0,len));
? //關(guān)閉資源
? s.close();
?}
}
/*
?* TCP服務(wù)器
?*/
import java.io.*;
import java.net.*;
public class TCPServer {
?public static void main(String[] args) throws Exception{
? //創(chuàng)建服務(wù)器的Socket服務(wù)
? ServerSocket ss = new ServerSocket(10000);
? //知道是哪個客戶端連接的
? Socket s = ss.accept();//線程等,等著客戶端連接
? //有了客戶端對象Socket,完全可以使用客戶端連接對象,獲取IO流
? //獲取字節(jié)輸入流
? InputStream in = s.getInputStream();
? byte[] bytes = new byte[10];
? int len = 0 ;
? len = in.read(bytes);
? System.out.println(new String(bytes,0,len));
?
? //服務(wù)器回客戶端一個信息,謝謝收到了
? OutputStream out = s.getOutputStream();
? out.write("謝謝收到了".getBytes());
? s.close();
? ss.close();
?}
}
//===================================================
6. TCP的案例
?鍵盤錄入字母,發(fā)送給服務(wù)器,服務(wù)器轉(zhuǎn)成大寫字母,回傳客戶端,客戶端讀取服務(wù)器發(fā)回的大寫字母
?通過案例暴露很多問題
? ?A. 鍵盤讀取 OK
? ?B. 讀取到的鍵盤,發(fā)出去沒有,OK
? ?C. 服務(wù)器收到了嗎,服務(wù)器收到了 readLine()方法線程阻塞,等著讀 OK
? ?D. 服務(wù)器大寫數(shù)據(jù)發(fā)回了嗎 OK
? ?E. 客戶端讀取到了 OK
/*
?* 轉(zhuǎn)成大寫客戶端
?*/
import java.io.*;
import java.net.*;
public class TCPClientToUpperCase {
?public static void main(String[] args) throws Exception{
? //建立Socket服務(wù)
? Socket s = new Socket("127.0.0.1",10000);
? //讀取鍵盤輸入
? BufferedReader bfr = new
? ? BufferedReader(new InputStreamReader(System.in));
?
? //建立字節(jié)流對象,轉(zhuǎn)成字符流,讀取服務(wù)器發(fā)回的大寫字母
? BufferedReader bfrin =
? ? new BufferedReader(new InputStreamReader(s.getInputStream()));
?
? //向服務(wù)器發(fā)送數(shù)據(jù),采用打印流
? PrintWriter out = new PrintWriter(s.getOutputStream(),true);
? String line = null;
? while((line = bfr.readLine())!=null){
? ?if("over".equals(line))break;
? ?out.println(line);
? ?//將數(shù)據(jù)打印到服務(wù)器,讀取服務(wù)器回來的大寫
? ?String server = bfrin.readLine();
? ?System.out.println("大寫字母是::"+server);
? }
? bfr.close();
? s.close();
?}
}
/*
?* 轉(zhuǎn)換大寫服務(wù)器
?*/
import java.io.*;
import java.net.*;
public class TCPServerToUpperCase {
?public static void main(String[] args) throws Exception{
? //建立服務(wù)器Socket,獲取客戶端連接對象
? ServerSocket ss = new ServerSocket(10000);
? Socket s = ss.accept();
? //讀取客戶端的小寫字母,都是文本,按行讀
? BufferedReader bfrin = new
? ? BufferedReader(new InputStreamReader(s.getInputStream()));
?
? //創(chuàng)建打印流對象,將大寫數(shù)據(jù),寫回客戶端
? PrintWriter out = new PrintWriter(s.getOutputStream(),true);
?
? String line = null;
? while((line = bfrin.readLine())!=null){
? ?if("over".equals(line))
? ? break;
? ? out.println(line.toUpperCase());
? }
? s.close();
? ss.close();
?}
}
//===================================================
7. TCP文本上傳
?將C盤上的源文件,通過TCP服務(wù)器傳遞到D盤upload目錄中
?
?客戶端
? ?IO讀取文本文件
? ?打印流,將文本打印到服務(wù)器
? ?讀取上傳成功四個字
?服務(wù)器
? ?讀取客戶端的文本文件,保存到目的中(D盤)
? ?將上傳成功四個字,會給客戶端
?
?服務(wù)器停不下來
?服務(wù)器讀取的是Socket中的字節(jié)流null;
?客戶端,和服務(wù)器之間,約定一個結(jié)束標記
?java工程師們很善良,定義好了結(jié)束標記
?Socket類中的方法 void shutdownOutput()
/*
?* TCP文本上傳客戶端
?*/
import java.io.*;
import java.net.*;
public class TCPCilentUpLoad {
?public static void main(String[] args) throws Exception{
? Socket s = new Socket("127.0.0.1", 10000);
? //字符流,讀取文本文件
? BufferedReader bfr = new BufferedReader(new FileReader("c:\1.txt"));
? //將文本使用打印流,打印到服務(wù)器
? PrintWriter out = new PrintWriter(s.getOutputStream(),true);
? String line = null;
? while((line=bfr.readLine())!=null){
? ?out.println(line);
? }
? //out.println("*&^%$#@@#$TRJHGFD&%^$#@");
? s.shutdownOutput();
? //讀取服務(wù)器的上傳成功
? InputStream in = s.getInputStream();
? byte[] bytes = new byte[10];
? int len = in.read(bytes);
? System.out.println("服務(wù)器說::"+new String(bytes,0,len));
? bfr.close();
? s.close();
?}
}
*
?* 文本上傳服務(wù)器
?*/
import java.io.*;
import java.net.*;
import java.util.*;
public class TCPServerUpLoad {
?public static void main(String[] args)throws Exception {
? ServerSocket ss = new ServerSocket(10000);
? Socket s = ss.accept();
? //讀取客戶端的數(shù)據(jù),轉(zhuǎn)換流
? BufferedReader bfrin = new
? ? BufferedReader(new InputStreamReader(s.getInputStream()));
? //將目的封裝成File對象
? File file = new File("d:\upload");
? if(!file.exists())
? ?file.mkdirs();
? //封裝數(shù)據(jù)目的,使用打印流
? //對上傳的文件名修改
? String filename = "itcast"+System.currentTimeMillis()+new Random().nextInt(999999999)+".txt";
? PrintWriter pw = new PrintWriter(new FileWriter(file+File.separator+filename),true);
? String line = null;
? while((line = bfrin.readLine())!=null){
? ?pw.println(line);
? }
? //上傳成功寫回客戶端
?
? OutputStream out = s.getOutputStream();
? out.write("上傳成功".getBytes());
? pw.close();
? s.close();
? ss.close();
?}
}