JAVA-day12

一缓苛、目的

  • 了解URL地址
  • 使用socket實現(xiàn)數(shù)據(jù)發(fā)送
  • 實現(xiàn)雙向傳遞
  • 實現(xiàn)對聊和群聊功能

二甩栈、學習內(nèi)容

1.網(wǎng)絡(luò)編程

在兩臺不同的計算機之間傳遞數(shù)據(jù)

  • 1.qq聊天
  • 2.打開網(wǎng)易App 刷新界面 就有數(shù)據(jù)
  • 3.打開瀏覽器 網(wǎng)頁 www.baidu.com

客戶端:手機App 瀏覽器 桌面QQ
服務(wù)器端:存儲/處理數(shù)據(jù)

2.URL:統(tǒng)一的資源定位

http://www.baidu.com/search?code=android
http//https:傳輸協(xié)議 TCP/IP
www.baidu.com:域名 表示一臺網(wǎng)絡(luò)中的電腦
ipv4 ipv6地址:唯一標識一臺網(wǎng)絡(luò)中的計算機
32位:四個部分每個是8個字節(jié)

3.DNS服務(wù)器:域名解析

www.baidu.com類型的域名解析為對應(yīng)的ip地址
search 對應(yīng)的后臺程序文件 php java jsp
寥袭?表示運行這個程序需要傳遞的參數(shù)
code=Android code是服務(wù)器端規(guī)定的字段
& 如果有多個參數(shù)使用&符號鏈接

4.ip地址落恼、端口號

ip地址:唯一標識某一臺電腦
端口號:唯一標識電腦上的某一個進程(程序)80

數(shù)據(jù)傳輸:TCP/IP協(xié)議
TCP:面向連接的锨能、安全的 打電話
UDP:面向無連接的 不安全 但快

5.網(wǎng)絡(luò)中的數(shù)據(jù)傳輸:

Socket實現(xiàn)->套接字
Socket類:客戶端
ServerSocket:服務(wù)器端

  • 讀取數(shù)據(jù):服務(wù)器讀取 客戶端讀取
    BufferedReader->InputStreamReader->socket.getInputStream()
  • 讀取終端
    BufferedReader->InputStreamReader->System.in
  • 輸出:客戶端輸出 服務(wù)器端輸出
    BufferedWriter->OutputStreamWriter->socket.getOutputStream()
    PrintStream->socket.getOutputStream()

三扯再、技術(shù)的使用

1.模擬客戶端
class Client{
    public static void main(String[] args) throws IOException {
        //1.創(chuàng)建用于通信的socket
        //  指明和誰通信:ip地址 端口號
        Socket socket=new Socket("127.0.0.1",8989);
        // 接收服務(wù)器端的數(shù)據(jù)
        BufferedReader br=new BufferedReader(new InputStreamReader(socket.getInputStream()));
        //socket.getInputStream();
        // 向服務(wù)器發(fā)送數(shù)據(jù)
        //socket.getOutputStream();
        String line=null;
        while ((line=br.readLine())!=null){
            System.out.println(line);
        }

        //客戶端向服務(wù)器端發(fā)送數(shù)據(jù)
        PrintStream ps=new PrintStream(socket.getOutputStream());
        ps.println("你好啊");

        socket.shutdownOutput();
    }
}
2.模擬服務(wù)器端
class Server{
    public static void main(String[] args) throws IOException {
        //1.創(chuàng)建服務(wù)器端的serversocket
        ServerSocket ss=new ServerSocket(8989);

        //2.獲取連接的客戶端的socket
        Socket clientSocket=ss.accept();

        //3.向客戶端發(fā)送數(shù)據(jù)
        //BufferedWriter bw=new BufferedWriter(new OutputStreamWriter(clientSocket.getOutputStream()));
        PrintStream ps=new PrintStream(clientSocket.getOutputStream());
        ps.println("登錄成功");

        //輸出完畢
        clientSocket.shutdownOutput();

        //4.服務(wù)器端接收客戶端發(fā)來的數(shù)據(jù)
        BufferedReader br=new BufferedReader(new InputStreamReader(clientSocket.getInputStream()));
        String line=null;
        while ((line=br.readLine())!=null){
            System.out.println(line);
        }
    }
}
3.實現(xiàn)上傳圖片
class Client{
    public static void main(String[] args) throws IOException {
        //連接服務(wù)器端 獲取socket
        Socket socket=new Socket("127.0.0.1",8787);

        //創(chuàng)建服務(wù)器端對應(yīng)的輸入流 用于接收服務(wù)器端發(fā)來的數(shù)據(jù)
        BufferedReader br=new BufferedReader(new InputStreamReader(socket.getInputStream()));
        System.out.println(br.readLine());

        //向服務(wù)器端發(fā)送文件(圖片)
        //1.將文件寫入到內(nèi)存
        String path="C:\\Users\\asus\\Desktop\\草圖1.png";
        FileInputStream fis=new FileInputStream(path);

        //2.創(chuàng)建字節(jié)流
        BufferedOutputStream bos=new BufferedOutputStream(socket.getOutputStream());
        byte[] buf=new byte[1024];
        int len=-1;
        while ((len=fis.read(buf))!=-1){
            bos.write(buf,0,len);
        }
        socket.shutdownOutput();
    }
}
class Server{
    public static void main(String[] args) throws IOException {
        //創(chuàng)建服務(wù)器端的ServerSocket
        ServerSocket ss=new ServerSocket(8787);

        //監(jiān)聽客戶端連接
        //當有客戶端來連接這個服務(wù)器 就可以得到對應(yīng)的socket對象
        //當沒有客戶端來連接 服務(wù)器一直在這里等待
        Socket socket=ss.accept();

        //創(chuàng)建客戶端對應(yīng)的輸出流 用于向這個客戶端發(fā)送數(shù)據(jù)
        PrintStream ps=new PrintStream(socket.getOutputStream());
        ps.println("連接成功 可以輸出數(shù)據(jù)了!");

        BufferedInputStream bis=new BufferedInputStream(socket.getInputStream());
        //文件對應(yīng)的輸出流
        String path="C:\\Users\\asus\\Desktop\\Android\\Android Studio\\java\\src\\main\\java\\day12\\media\\草圖1.png";
        FileOutputStream fos=new FileOutputStream(path);

        byte[] buf=new byte[1024];
        int len=-1;
        while ((len=bis.read(buf))!=-1){
           fos.write(buf,0,len);
        }
    }
}

四址遇、聊天功能的實現(xiàn)

1.對聊

(1)功能及實現(xiàn)方法

客戶端和服務(wù)器端都可以隨意地發(fā)送內(nèi)容
從終端輸入

  • 客戶端:
    主線程:接收終端輸入 將終端的輸入發(fā)送給服務(wù)器端
    子線程:接收服務(wù)器端發(fā)來的數(shù)據(jù)
  • 服務(wù)器端:
    主線程:接收終端輸入 將終端輸入發(fā)送給客服端
    子線程:接收客戶端端發(fā)來的數(shù)據(jù)
(2)代碼實現(xiàn)
class Client{
    public static void main(String[] args) throws IOException {
        Socket socket=new Socket("127.0.0.1",9000);

        //用一個子線程處理服務(wù)器端數(shù)據(jù)
        new Thread(new ClientThread(socket)).start();

        //主線程處理終端輸入 發(fā)送給服務(wù)器端
        BufferedReader keyin=new BufferedReader(new InputStreamReader(System.in));
        PrintStream ps=new PrintStream(socket.getOutputStream());
        String line=null;

        while ((line=keyin.readLine())!=null){
            ps.println(line);
        }
    }
}

/**
 * 創(chuàng)建一個子線程處理客戶端接收服務(wù)器端數(shù)據(jù)
 *
 */
class ClientThread implements Runnable{
    private Socket socket;
    //保存操作的socket對象
    public ClientThread(Socket socket){
        this.socket=socket;
    }
    @Override
    public void run() {
        BufferedReader br=null;
        try {
            //獲取服務(wù)器端的輸入流對象
            br=new BufferedReader(new InputStreamReader(socket.getInputStream()));

            //讀取數(shù)據(jù)
            String line=null;
            while ((line=br.readLine())!=null){
                System.out.println(line);
            }
        } catch (IOException e) {
            System.out.println("網(wǎng)絡(luò)出錯 請重新登錄");
            System.exit(-1);
        }finally {
           try {
               if (br!=null){
                   br.close();
               }
               if (socket!=null){
                   socket.close();
               }
           }catch (IOException ex){

           }
        }
    }
}

class Server{
    public static void main(String[] args) throws IOException {
        ServerSocket ss=new ServerSocket(9000);
        //獲取客戶端的socket
        Socket socket=ss.accept();
        //創(chuàng)建子線程 處理客戶端輸入信息
        new ServerThread(socket).start();

        //終端輸入流對象
        BufferedReader keyin=new BufferedReader(new InputStreamReader(System.in));
        //客戶端的輸出流對象
        PrintStream ps=new PrintStream(socket.getOutputStream());
        //讀取終端的輸入 將輸入輸出給客戶端
        String line=null;
        while ((line=keyin.readLine())!=null){
            ps.println(line);
        }

    }
}
/**
 * 創(chuàng)建一個子線程處理服務(wù)器端接收客戶端的數(shù)據(jù)
 */
class ServerThread extends Thread{
    private Socket socket;
    public ServerThread(Socket socket){
        this.socket=socket;
    }
    @Override
    public void run() {
        BufferedReader br=null;
        try {
            br=new BufferedReader(new InputStreamReader(socket.getInputStream()));
            String line=null;
            while ((line=br.readLine())!=null){
                System.out.println(line);
            }
        } catch (IOException e) {
            System.out.println("網(wǎng)絡(luò)異常 請重新登錄");
            System.exit(-1);
        }finally {
            //關(guān)閉輸入輸出流
            //關(guān)閉對應(yīng)的socket鏈接
            try {
                if (br!=null){
                    br.close();
                }
                if (socket!=null){
                    socket.close();
                }
            }catch (IOException e){
                e.printStackTrace();
            }
        }
    }
}

2.群聊

(1)實現(xiàn)方法

在對聊的基礎(chǔ)上讓服務(wù)器端維護一個數(shù)組【socket】

(2)代碼實現(xiàn)
class Client{
    public static void main(String[] args) throws IOException {
        Socket socket=new Socket("10.129.28.253",6666);

        //用一個子線程處理服務(wù)器端數(shù)據(jù)
        new Thread(new ClientThread(socket)).start();

        //主線程處理終端輸入 發(fā)送給服務(wù)器端
        BufferedReader keyin=new BufferedReader(new InputStreamReader(System.in));
        PrintStream ps=new PrintStream(socket.getOutputStream());
        String line=null;

        while ((line=keyin.readLine())!=null){
            ps.println(line);
        }
    }
}
/**
 * 創(chuàng)建一個子線程處理客戶端接收服務(wù)器端數(shù)據(jù)
 *
 */
class ClientThread implements Runnable{
    private Socket socket;
    //保存操作的socket對象
    public ClientThread(Socket socket){
        this.socket=socket;
    }
    @Override
    public void run() {
        BufferedReader br=null;
        try {
            //獲取服務(wù)器端的輸入流對象
            br=new BufferedReader(new InputStreamReader(socket.getInputStream()));

            //讀取數(shù)據(jù)
            String line=null;
            while ((line=br.readLine())!=null){
                System.out.println(line);
            }
        } catch (IOException e) {
            System.out.println("網(wǎng)絡(luò)出錯 請重新登錄");
            System.exit(-1);
        }finally {
            try {
                if (br!=null){
                    br.close();
                }
                if (socket!=null){
                    socket.close();
                }
            }catch (IOException ex){

            }
        }
    }
}
/**
 * 1.如何實現(xiàn)群聊
 *   在服務(wù)器端維護一個數(shù)組【socket】
 * 2.私聊
 * 3.給每個人起名字
 */
class Server{
    //保存每一個鏈接過來的socket對象
    public static ArrayList<Socket>sockets=new ArrayList<>();
    public static void main(String[] args) throws IOException {
        ServerSocket ss=new ServerSocket(7777);

        //不停的等待客戶端來連接
        while (true) {
            Socket socket = ss.accept();
            //當有客戶端連接過來了 就保存
            sockets.add(socket);

            //開啟一個線程處理每一個客戶端的輸入
            new ServerThread(socket).start();
        }
    }
}
/**
 * 創(chuàng)建一個子線程處理服務(wù)器端接收客戶端的數(shù)據(jù)
 */
class ServerThread extends Thread{
    private Socket socket;
    public ServerThread(Socket socket){
        this.socket=socket;
    }
    @Override
    public void run() {
        BufferedReader br=null;
        try {
            br=new BufferedReader(new InputStreamReader(socket.getInputStream()));
            String line=null;
            while ((line=br.readLine())!=null){
                //群發(fā)消息
                //遍歷Server維護的數(shù)組
                for (Socket s:Server.sockets){
                    //向socket對應(yīng)的客戶端發(fā)送消息
                    PrintStream ps=new PrintStream(s.getOutputStream());
                    ps.println(line);
                }
            }
        } catch (IOException e) {
            System.out.println("網(wǎng)絡(luò)異常 請重新登錄");
            System.exit(-1);
        }finally {
            //關(guān)閉輸入輸出流
            //關(guān)閉對應(yīng)的socket鏈接
            try {
                if (br!=null){
                    br.close();
                }
                if (socket!=null){
                    socket.close();
                }
            }catch (IOException e){
                e.printStackTrace();
            }
        }
    }
}
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末熄阻,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子倔约,更是在濱河造成了極大的恐慌秃殉,老刑警劉巖,帶你破解...
    沈念sama閱讀 218,525評論 6 507
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件浸剩,死亡現(xiàn)場離奇詭異钾军,居然都是意外死亡,警方通過查閱死者的電腦和手機绢要,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,203評論 3 395
  • 文/潘曉璐 我一進店門吏恭,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人重罪,你說我怎么就攤上這事砸泛。” “怎么了蛆封?”我有些...
    開封第一講書人閱讀 164,862評論 0 354
  • 文/不壞的土叔 我叫張陵唇礁,是天一觀的道長。 經(jīng)常有香客問我惨篱,道長盏筐,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 58,728評論 1 294
  • 正文 為了忘掉前任砸讳,我火速辦了婚禮琢融,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘簿寂。我一直安慰自己漾抬,他們只是感情好,可當我...
    茶點故事閱讀 67,743評論 6 392
  • 文/花漫 我一把揭開白布常遂。 她就那樣靜靜地躺著纳令,像睡著了一般。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上平绩,一...
    開封第一講書人閱讀 51,590評論 1 305
  • 那天圈匆,我揣著相機與錄音,去河邊找鬼捏雌。 笑死跃赚,一個胖子當著我的面吹牛,可吹牛的內(nèi)容都是我干的性湿。 我是一名探鬼主播纬傲,決...
    沈念sama閱讀 40,330評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼肤频!你這毒婦竟也來了叹括?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 39,244評論 0 276
  • 序言:老撾萬榮一對情侶失蹤着裹,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后米同,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體骇扇,經(jīng)...
    沈念sama閱讀 45,693評論 1 314
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 37,885評論 3 336
  • 正文 我和宋清朗相戀三年面粮,在試婚紗的時候發(fā)現(xiàn)自己被綠了少孝。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 40,001評論 1 348
  • 序言:一個原本活蹦亂跳的男人離奇死亡熬苍,死狀恐怖稍走,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情柴底,我是刑警寧澤婿脸,帶...
    沈念sama閱讀 35,723評論 5 346
  • 正文 年R本政府宣布,位于F島的核電站柄驻,受9級特大地震影響狐树,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜鸿脓,卻給世界環(huán)境...
    茶點故事閱讀 41,343評論 3 330
  • 文/蒙蒙 一抑钟、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧野哭,春花似錦在塔、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,919評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至,卻和暖如春城榛,著一層夾襖步出監(jiān)牢的瞬間揪利,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 33,042評論 1 270
  • 我被黑心中介騙來泰國打工狠持, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留疟位,地道東北人。 一個月前我還...
    沈念sama閱讀 48,191評論 3 370
  • 正文 我出身青樓喘垂,卻偏偏與公主長得像甜刻,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子正勒,可洞房花燭夜當晚...
    茶點故事閱讀 44,955評論 2 355

推薦閱讀更多精彩內(nèi)容

  • Socket 網(wǎng)絡(luò)編程 目的 了解什么是網(wǎng)絡(luò)編程網(wǎng)絡(luò)編程:在兩臺不同的計算機之間傳遞數(shù)據(jù)1.QQ聊天2.打開網(wǎng)易a...
    欲擒故縱_a222閱讀 173評論 0 0
  • Swift1> Swift和OC的區(qū)別1.1> Swift沒有地址/指針的概念1.2> 泛型1.3> 類型嚴謹 對...
    cosWriter閱讀 11,103評論 1 32
  • 計算機網(wǎng)絡(luò)概述 網(wǎng)絡(luò)編程的實質(zhì)就是兩個(或多個)設(shè)備(例如計算機)之間的數(shù)據(jù)傳輸得院。 按照計算機網(wǎng)絡(luò)的定義,通過一定...
    蛋炒飯_By閱讀 1,227評論 0 10
  • Java知識點1章贞、==和equals的區(qū)別基本類型比較==比較內(nèi)容 equals比較地址值引用類型比較==比較地址...
    壓抑的內(nèi)心閱讀 592評論 0 0
  • 說明 本文 翻譯自 realpython 網(wǎng)站上的文章教程 Socket Programming in Pytho...
    keelii閱讀 2,121評論 0 16