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