日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問(wèn) 生活随笔!

生活随笔

當(dāng)前位置: 首頁(yè) > 编程语言 > java >内容正文

java

Java基础23 网络编程 socket套接字流 TCP传输总结

發(fā)布時(shí)間:2024/1/8 java 28 豆豆
生活随笔 收集整理的這篇文章主要介紹了 Java基础23 网络编程 socket套接字流 TCP传输总结 小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

一、網(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)地址
常用的方法

package day23;import java.net.InetAddress; import java.net.UnknownHostException;public class Test01 {public static void main(String[] args) throws UnknownHostException {InetAddress in = InetAddress.getByName("DESKTOP-FQLA3DE");//獲取ip地址 10.3.131.45String ip= in.getHostAddress();System.out.println(ip);//獲取主機(jī)String host = in.getHostAddress();System.out.println(host);} }

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)閉

package day23;import java.io.*; import java.net.Socket;/*** 客戶端 先寫后讀*/ public class ClientStr {public static void main(String[] args) throws IOException {//實(shí)例化 Socket對(duì)象Socket soc = new Socket("localhost", 8888);InputStream is = soc.getInputStream();OutputStream os = soc.getOutputStream();//向服務(wù)器寫數(shù)據(jù)os.write("11111,我還要全息之影".getBytes());//刷新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();os.close();is.close();soc.close();} } package day23;import java.io.*; import java.net.ServerSocket; import java.net.Socket;/*** 服務(wù)器端 先運(yùn)行服務(wù)器端在運(yùn)行客戶端 先讀后寫*/ public class ServerStr {public static void main(String[] args) throws IOException {//實(shí)例化ServerSocket對(duì)象ServerSocket server = new ServerSocket(8888);//開始監(jiān)聽客戶單Socket soc = server.accept();//獲取輸入流與輸出流InputStream is =soc.getInputStream();OutputStream os =soc.getOutputStream();//讀取客戶端發(fā)送的數(shù)據(jù)BufferedReader br = new BufferedReader(new InputStreamReader(is));String line =null;while ((line = br.readLine())!=null){System.out.println(line);}//服務(wù)器向客戶端寫入數(shù)據(jù)os.write("扣1送地獄火".getBytes());//刷新soc.shutdownOutput();//關(guān)閉資源 soc server 最后關(guān)閉os.close();br.close();is.close();soc.close();server.close();}}

四、基于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

package day23;import java.io.*; import java.net.Socket;/*** 客戶端 先寫后讀*/ public class ClientStr {public static void main(String[] args) throws IOException {//實(shí)例化 Socket對(duì)象Socket soc = new Socket("localhost", 8888);InputStream is = soc.getInputStream();OutputStream os = soc.getOutputStream();//向服務(wù)器寫數(shù)據(jù)os.write("11111,我還要全息之影".getBytes());//刷新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();os.close();is.close();soc.close();} }

客戶端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通信 文件上傳


代碼
客戶端

package day23;import java.io.FileInputStream; import java.io.IOException; import java.io.InputStream; import java.io.OutputStream; import java.net.Socket;public class ClientFile {public static void main(String[] args) throws IOException {//實(shí)例化Socket對(duì)象Socket soc = new Socket("localhost",8887);//獲取輸入流 輸出流InputStream is = soc.getInputStream();OutputStream os = soc.getOutputStream();FileInputStream fis = new FileInputStream("E:\\admin01\\b\\c.txt\\gm01.jpg");//讀取本地文件byte [] b =new byte[1024];int leng =-1;while ((leng=fis.read(b))!=-1){//寫入到服務(wù)器os.write(b,0,leng);}//刷新os.flush();soc.shutdownOutput();//關(guān)閉資源os.close();fis.close();is.close();soc.close();} }

服務(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 此類表示用來(lái)發(fā)送和接收數(shù)據(jù)報(bào)包的套接字。
    將 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)為字符串
    代碼
    客戶端
  • package day23;import java.io.IOException; import java.io.StringReader; import java.net.*;public class Client {public static void main(String[] args) throws IOException {//實(shí)例化這個(gè)對(duì)象 DatagramSocketDatagramSocket socket = new DatagramSocket();//構(gòu)建一個(gè)包裹對(duì)象 DatagramPacketString str = "我是客戶端的包裹";//轉(zhuǎn)換為字節(jié)byte [] b1= str.getBytes();InetAddress address = InetAddress.getByName("localhost");DatagramPacket dp = new DatagramPacket(b1,0,b1.length,address,8887);//發(fā)送包裹socket.send(dp);//=========客戶端接受包裹byte [] b2 = new byte[1024];DatagramPacket dp1 = new DatagramPacket(b2,b2.length);socket.receive(dp1);//需要進(jìn)行拆包System.out.println(new String(dp1.getData(),0,dp1.getData().length));} }

    服務(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 abstract class Pet { public abstract void eat(); }

    狗類

    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 interface Inner { void 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é)流

    InputStream is = soc.getInputStream(); OutputStream os = soc.getOutputStream();

    需要用到讀取寫入的時(shí)候都寫,只需要一個(gè)的時(shí)候只寫一個(gè)
    與本地磁盤交互

    FileInputStream fis = new FileInputStream("E:\\admin01\\b\\otm01.jpg");

    讀取本地文件用傳統(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ù)
    得到套接字輸入流輸出流

    InputStream is =soc.getInputStream();//OutputStream os = soc.getOutputStream();

    需要用到讀取寫入的時(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)題。

    如果覺(jué)得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。