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





