Java基础23 网络编程 socket套接字流 TCP传输总结
一、網(wǎng)絡(luò)編程的概念
1.計(jì)算機(jī)網(wǎng)絡(luò):將不同地區(qū)的計(jì)算機(jī),使用網(wǎng)絡(luò)來(lái)進(jìn)行連接 實(shí)現(xiàn)不同地區(qū)的數(shù)據(jù)的交互與共享(互聯(lián)時(shí)代)
2. 網(wǎng)絡(luò)編程的三要素:IP地址 端口號(hào) 協(xié)議
3. ip地址:是在網(wǎng)絡(luò)連接中 每一臺(tái)電腦的唯一標(biāo)識(shí)
ip地址的分類 IP4 IP6
IP4 是由四個(gè)字節(jié)的二進(jìn)制組成 由于不好記憶 IP4 改成以十進(jìn)制 來(lái)進(jìn)行表示 每一個(gè)字節(jié)是以.來(lái)進(jìn)行分割
192.168.1.33 子網(wǎng) 10.1
IP6 ip6是由16進(jìn)制來(lái)組成的
查看IP地址
第一步:windons+r
第二步:cmd
第三步 指定 ipconfig
查看服務(wù)器是否可以訪問(wèn) ping 服務(wù)器的IP地址
ping + ip地址
InetAddress 此類表示互聯(lián)網(wǎng)協(xié)議(IP)地址
常用的方法
4.端口號(hào):每一個(gè)進(jìn)程的唯一的標(biāo)識(shí) 每一個(gè)執(zhí)行的程序的唯一的標(biāo)識(shí) 這個(gè)標(biāo)識(shí)可以自行設(shè)置 也可以
由系統(tǒng)進(jìn)行分配
端口號(hào)的范圍0-65535 必須設(shè)置在這個(gè)范圍之內(nèi) 0-1024 這個(gè)范圍之內(nèi)的端口號(hào) 不進(jìn)行使用 一
般是系統(tǒng)使用
常見(jiàn)的口號(hào)
tomcat:8080
mysql 3306
orcale 1207
qq 4000
5..協(xié)議: 數(shù)據(jù)再進(jìn)行交互的時(shí)候遵循的規(guī)范 必須按照這個(gè)規(guī)范來(lái)進(jìn)行傳輸 客戶端與服務(wù)才能進(jìn)行有效
的交互
常見(jiàn)的協(xié)議
TCP 面向連接的協(xié)議 三次握手 之后 表示連接成功 特點(diǎn): 傳輸數(shù)據(jù)穩(wěn)定安全 效率低一點(diǎn)
UDP 面向無(wú)連接的協(xié)議 特點(diǎn): 傳輸數(shù)據(jù)安全性低 效率高 丟失數(shù)據(jù) 丟包
HTTP 一次性的協(xié)議 表示客戶端與服務(wù)器連接成功 交互完成之后 就斷開的了 一般用于web端
明文進(jìn)行傳輸 數(shù)據(jù)沒(méi)有進(jìn)行任何加密 上線的項(xiàng)目都不能直接使用http
協(xié)議進(jìn)行數(shù)據(jù)交互
HTTPS= http+ssl證書 ssl 證書 保證對(duì)傳輸?shù)臄?shù)據(jù)進(jìn)行加密 保證數(shù)據(jù)的安全性
6.三次握手
7.http 請(qǐng)求
二、基于TCP 進(jìn)行Socket通信
1.Socket 此類實(shí)現(xiàn)客戶端套接字(也可以就叫“套接字”)。套接字是兩臺(tái)機(jī)器間通信的端點(diǎn) 可以兩臺(tái)
設(shè)備進(jìn)行通信
3.ServerSocket 此類實(shí)現(xiàn)服務(wù)器套接字。 服務(wù)器套接字等待請(qǐng)求網(wǎng)絡(luò)傳入。它基于該請(qǐng)求執(zhí)行某些操作,然后可能向請(qǐng)求者返回結(jié)果
三、基于TCP 進(jìn)行Socket通信-簡(jiǎn)單文本傳輸
1.客戶端
步驟
1實(shí)例化Socket對(duì)象
2.獲取到輸入流 與輸出流
3.向服務(wù)器與寫數(shù)據(jù)
4.接受服務(wù)發(fā)送的數(shù)據(jù)
5.關(guān)閉資源
2.服務(wù)器
步驟
1.實(shí)例化 ServerSockket對(duì)象
2.調(diào)用其監(jiān)聽的方法
3.獲取到輸入流與輸出流
4.接受客戶端發(fā)送的數(shù)據(jù) 讀取
5.客戶端發(fā)送數(shù)據(jù)
6.關(guān)閉資源
3.代碼
寫入完數(shù)據(jù)需要soc.shutdownOutput(); 刷新保存才能讀取
關(guān)閉資源 soc server 最后關(guān)閉
四、基于TCP進(jìn)行Socket通信-傳輸對(duì)象
實(shí)體對(duì)象
package day23;import java.io.Serializable;public class Actor implements Serializable{private String name;private int age;public Actor(){}public Actor(String name, int age) {this.name = name;this.age = age;}public String getName() {return name;}public void setName(String name) {this.name = name;}public int getAge() {return age;}public void setAge(int age) {this.age = age;}@Overridepublic String toString() {return "Actor{" +"name='" + name + '\'' +", age=" + age +'}';} }服務(wù)器的代碼
package day23;import java.io.IOException; import java.io.InputStream; import java.io.ObjectInputStream; import java.io.OutputStream; import java.net.ServerSocket; import java.net.Socket;/*** 服務(wù)器端*/ public class ServerObject {public static void main(String[] args) throws IOException, ClassNotFoundException {//實(shí)例化ServerSocket 對(duì)象ServerSocket server = new ServerSocket(8887);//開始監(jiān)聽Socket soc = server.accept();//獲取輸出流 輸入流InputStream is =soc.getInputStream();OutputStream os =soc.getOutputStream();//讀客戶端對(duì)象ObjectInputStream ois= new ObjectInputStream(is);//調(diào)用讀取的方法Actor act = (Actor) ois.readObject();System.out.println(act);//給客戶端一個(gè)反饋 響應(yīng)os.write("我是服務(wù)器,收到客戶端的請(qǐng)求".getBytes());//刷新soc.shutdownOutput();//關(guān)閉資源os.close();ois.close();is.close();soc.close();server.close();} }客戶端代碼
package day23;import java.io.*; import java.net.Socket;/*** 客戶端*/ public class ClientObject {public static void main(String[] args) throws IOException {//實(shí)例化SocketSocket soc = new Socket("localhost",8887);//獲取輸入流 輸出流InputStream is = soc.getInputStream();OutputStream os = soc.getOutputStream();//實(shí)例化對(duì)象Actor ac = new Actor("狂徒張三",18);//向服務(wù)器寫對(duì)象 序列化對(duì)象流ObjectOutputStream oos = new ObjectOutputStream(os);oos.writeObject(ac);//刷新soc.shutdownOutput();//讀服務(wù)器返回的數(shù)據(jù)BufferedReader br = new BufferedReader(new InputStreamReader(is));String line =null;while ((line= br.readLine())!=null){System.out.println(line);}//關(guān)閉資源br.close();oos.close();os.close();is.close();soc.close();} }五、基于TCP進(jìn)行Socket通信-多線程處理方案
代碼
客戶端1
客戶端2
package day23;import java.io.*; import java.net.Socket;public class ClientStr1 {public static void main(String[] args) throws IOException {Socket soc =new Socket("localhost",8888);InputStream is = soc.getInputStream();OutputStream os =soc.getOutputStream();os.write("我是你義父".getBytes());soc.shutdownOutput();BufferedReader br = new BufferedReader(new InputStreamReader(is));String line = null;while ((line= br.readLine())!=null){System.out.println(line);}br.close();os.close();is.close();soc.close();} }線程類
package day23;import java.io.*; import java.net.Socket;public class MyThread extends Thread{private Socket soc;public MyThread(Socket soc) {this.soc = soc;}@Overridepublic void run() {try {InputStream is = soc.getInputStream();OutputStream os = soc.getOutputStream();BufferedReader br = new BufferedReader(new InputStreamReader(is));String line = null;while ((line= br.readLine())!=null){System.out.println(line);}//服務(wù)器向客戶端寫入數(shù)據(jù)os.write("我是主播,別殺我".getBytes());os.write("\r\n".getBytes());os.write("扣1送地獄火".getBytes());soc.shutdownOutput();os.close();br.close();is.close();soc.close();} catch (IOException e) {e.printStackTrace();}} }服務(wù)器
package day23;import java.io.IOException; import java.net.ServerSocket; import java.net.Socket;public class ServerStr1 {public static void main(String[] args) throws IOException {//實(shí)例化ServerSocket對(duì)象ServerSocket server = new ServerSocket(8888);//死循環(huán)while (true){Socket soc =server.accept();//實(shí)例化線程對(duì)象MyThread th1=new MyThread(soc);//開啟線程th1.start();}} }六、基于TCP進(jìn)行Socket通信 文件上傳
代碼
客戶端
服務(wù)器
package day23;import java.io.*; import java.net.ServerSocket; import java.net.Socket;public class ServerFile{public static void main(String[] args) throws IOException {ServerSocket server = new ServerSocket(8887);//進(jìn)行監(jiān)聽Socket soc = server.accept();//得到輸入流 輸出流InputStream is =soc.getInputStream();//OutputStream os = soc.getOutputStream();//將所有的圖片保存在指定的文件夾下File f = new File("E:\\admin");//判斷文件是否存在 不存在 創(chuàng)建if(!f.exists()){f.mkdirs();}//讀取客戶端發(fā)送的文件byte [] b = new byte[1024];int leng =-1;//根據(jù)系統(tǒng)時(shí)間 將文件的名稱隨機(jī)生產(chǎn)String fileName = System.currentTimeMillis()+".jpg";FileOutputStream fos = new FileOutputStream(new File(f,fileName));while ((leng=is.read(b))!=-1){//寫入fos.write(b,0,leng);}fos.flush();fos.close();is.close();soc.close();server.close();}}七、基于UDP的通信
將 DatagramSocket 綁定到一個(gè)更加具體的地址時(shí)廣播包也可以被接收
2.構(gòu)造方法
1.DatagramPacket 此類表示數(shù)據(jù)報(bào)包
客戶端
1.實(shí)例化這個(gè)對(duì)象 DatagramSocket
2.構(gòu)建一個(gè)包裹對(duì)象 DatagramPacket 并打包數(shù)據(jù)
3.發(fā)送包裹
服務(wù)器
1.實(shí)例化這個(gè)對(duì)象 DatagramSocket
2.構(gòu)建一個(gè)包裹對(duì)象 用于接受客戶端發(fā)送的信息
3.接受包裹 并拆包轉(zhuǎn)為字符串
代碼
客戶端
服務(wù)器代碼
package day23;import java.io.IOException; import java.net.DatagramPacket; import java.net.DatagramSocket; import java.net.SocketException;public class Server {public static void main(String[] args) throws IOException {//實(shí)例化 DatagramSocket 這個(gè)對(duì)象DatagramSocket socket = new DatagramSocket(8887);byte [] b =new byte[1024];DatagramPacket dp = new DatagramPacket(b,b.length);//調(diào)用接受包裹的方法socket.receive(dp);//拆包System.out.println(new String(dp.getData(),0,dp.getData().length));//================服務(wù)器向客戶端發(fā)送包裹String s1 = "收到包裹,惡狗請(qǐng)回答";//構(gòu)造一個(gè)包裹對(duì)象DatagramPacket dp1 = new DatagramPacket(s1.getBytes(),0,s1.getBytes().length,dp.getSocketAddress());socket.send(dp1);} }八、工廠設(shè)置模式
Pet pet = null;
if(){
pet = new Cat()
}
Inner in =null;
if(){
in = new Cat()
}
無(wú)論繼承還是接口,先定義以一個(gè)父類為null,然后根據(jù)條件,字符串比較,使用自動(dòng)向上轉(zhuǎn)型 實(shí)例化父類或接口
第一種方式繼承
父類
狗類
public class Dog extends Pet { @Override public void eat() { System.out.println("吃狗糧"); } }貓類
public class Cat extends Pet { @Override public void eat() { System.out.println("吃貓糧"); } }企鵝類
public class Penguin extends Pet { @Override public void eat() { System.out.println("吃魚"); } }工廠類
/** * 工廠類 就是為實(shí)例化對(duì)象 */ public class Factory { //定義一個(gè)靜態(tài)方法來(lái)實(shí)例化對(duì)象 public static Pet getPet(String type){ Pet pet = null; if (type.equals("dog")){ pet = new Dog(); }else if(type.equals("cat")){ pet = new Cat(); }else if(type.equals("penguin")){ pet = new Penguin(); } return pet; } }測(cè)試類
public class Test { public static void main(String[] args) { Pet p = Factory.getPet("dog"); p.eat(); } }第二種方式接口
接口
狗類
public class Dog implements Inner { @Override public void eat() { System.out.println("吃狗糧"); } }貓類
public class Cat implements Inner { @Override public void eat() { System.out.println("吃貓糧"); } }工廠類
public class Factroy { //提供一個(gè)靜態(tài)的方法來(lái)實(shí)例化對(duì)象 public static Inner getInner(String type){ Inner in = null; if(type.equals("dog")){ in = new Dog(); }else if(type.equals("cat")){ in= new Cat(); } return in; } }測(cè)試類
public class Test { public static void main(String[] args) { Inner in = Factroy.getInner("dog"); in.eat(); } }TCP傳輸總結(jié)
可以看作有一個(gè)套接字Socket 輸入輸出流 屬于字節(jié)流
客戶端 Socket soc = new Socket("localhost",8888); 其中l(wèi)ocalhost是代指本地服務(wù)器的ip地址,如果需要傳到其他服務(wù)器,就改成其他服務(wù)器的ip地址 8888 是服務(wù)器的端口號(hào)
套接字的輸入輸出流 用于在服務(wù)器與客互端的兩端的傳輸,無(wú)論是客戶端還是服務(wù)器端與本地磁盤交互都需要傳統(tǒng)字節(jié)流,文件輸入輸出流,對(duì)象輸入輸出流,字節(jié)流
需要用到讀取寫入的時(shí)候都寫,只需要一個(gè)的時(shí)候只寫一個(gè)
與本地磁盤交互
讀取本地文件用傳統(tǒng)字節(jié)流 fis.read(b),傳到服務(wù)器端用套接字字節(jié)流os.write(b,0,leng);
byte [] b = new byte[1024];int leng =-1;while ((leng=fis.read(b))!=-1){os.write(b,0,leng);}服務(wù)器端
ServerSocket server = new ServerSocket(8888); Socket soc = server.accept();生成一個(gè)服務(wù)器端的套接字 new ServerSocket(8888); 要和客戶端的端口號(hào)對(duì)上才能接受到客戶端的數(shù)據(jù)
得到套接字輸入流輸出流
需要用到讀取寫入的時(shí)候都寫,只需要一個(gè)的時(shí)候只寫一個(gè)
與本地磁盤交互 創(chuàng)建文件 用傳統(tǒng)字節(jié)流
//創(chuàng)建String文件名 以及File地址String fileName = System.currentTimeMillis()+".jpg";File f = new File("E:\\admin",fileName);if(!f.exists()){f.createNewFile();}//寫入到本地 需要輸出流FileOutputStream fos = new FileOutputStream(f);讀取客戶端的數(shù)據(jù)用套接字字節(jié)流is.read(b) 寫入到本地用傳統(tǒng)字節(jié)流fos.write(b,0,leng);
byte [] b =new byte[1024];int leng=-1;while ((leng=is.read(b))!=-1){fos.write(b,0,leng);}總結(jié)
以上是生活随笔為你收集整理的Java基础23 网络编程 socket套接字流 TCP传输总结的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: 乐高方面的网站
- 下一篇: java美元兑换,(Java实现) 美元