網(wǎng)絡(luò)編程之Socket

Socket 是一個通信鏈路的端點,它提供給應(yīng)用程序互相訪問的接口,它處在java.net包下.
InetAddress 類:IP地基于TCP的Socket編程用到的類

QQ截圖20170822221401.png

測試InetAdress的上述函數(shù)

package com.qf.demo;

import java.net.InetAddress;
import java.net.UnknownHostException;
/**
 * 測試本機 的地址
 * localhost
 * 127.0.0.1
 * 
 * @author Administrator
 *
 */
public class Test {

    public static void main(String[] args) {
        
        try {
            // 得到本機的信息
            InetAddress inetAddress = InetAddress.getLocalHost();
            // 得到主機名
            String name = inetAddress.getHostName();
            System.out.println(name);
           // 得到主機的ip地址
            String address = inetAddress.getHostAddress();

            System.out.println(address);
            
            
            InetAddress inetAddress2 = InetAddress.getByName("www.baidu.com");
            System.out.println(inetAddress2.getHostName());
            System.out.println(inetAddress2.getHostAddress());
            
            
            InetAddress inetAddress3 =InetAddress.getByName("localhost");
            // 如果獲取不到主機名  主機名是展示的是ip地址
            System.out.println(inetAddress3.getHostName());

            System.out.println(inetAddress3.getHostAddress());
            
        } catch (UnknownHostException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }
    }
}

Socket應(yīng)用

  • 客戶端發(fā)送數(shù)據(jù)給服務(wù)端
  • 1 創(chuàng)建Socket
  • 2 準備發(fā)送的數(shù)據(jù)
  • 3 將數(shù)據(jù)放到socket中
  • 4 (調(diào)配物流車, 物流車送貨)
  • 5 關(guān)閉socket
    *注意: 先運行 服務(wù)端 在運行客戶端

客戶端代碼

public class Client {

    public static void main(String[] args) {
        //1 創(chuàng)建Socket
        Socket socket =  null;
        OutputStream os =null;
        try {
            System.out.println("客戶端起來了");
            socket = new Socket("127.0.0.1", 6666);
//          2 準備發(fā)送的數(shù)據(jù)
            String string = "hello world";
//           3 將數(shù)據(jù)放到socket中
            os = socket.getOutputStream();
            // 將數(shù)據(jù)交給快遞員寫給快點點
            os.write(string.getBytes());
            os.flush();
        } catch (UnknownHostException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        } catch (IOException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }finally{
            if(os!=null){
                try {
                    os.close();
                } catch (IOException e) {
                    // TODO Auto-generated catch block
                    e.printStackTrace();
                }
            }
            if(socket!=null){
                try {
                    socket.close();
                } catch (IOException e) {
                    // TODO Auto-generated catch block
                    e.printStackTrace();
                }
            }
        }
        
    }
}

  • 服務(wù)端接收數(shù)據(jù)
  • 1 創(chuàng)建服務(wù)端的快遞點
  • 2 等待接收數(shù)據(jù)
  • 3 接收到數(shù)據(jù) , 就可以從快遞點拿出數(shù)據(jù)
  • 4 關(guān)socket

服務(wù)器端代碼

public class Server {

    public static void main(String[] args) {
        //  1 創(chuàng)建服務(wù)端的快遞點
        ServerSocket serverSocket =null;
        Socket socket =  null;
        InputStream is =null;
        try {
            System.out.println("服務(wù)端起來了");
             serverSocket = new ServerSocket(6666);
            // 2 等待接收數(shù)據(jù)
             socket = serverSocket.accept();// 如果沒有接收到數(shù)據(jù), 阻塞程序執(zhí)行, 直到接收到數(shù)據(jù)
            // 3 接收到數(shù)據(jù) , 就可以從快遞點拿出數(shù)據(jù)
            is = socket.getInputStream();
            byte[] bs= new byte[1024];
            int num = is.read(bs);
            String string = new String(bs, 0, num);
            System.out.println("服務(wù)端接收到的數(shù)據(jù)是: "+string);
            
        } catch (IOException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }finally {
            if(is!=null){
                try {
                    is.close();
                } catch (IOException e) {
                    // TODO Auto-generated catch block
                    e.printStackTrace();
                }
            }
            if(socket!=null){
                try {
                    socket.close();
                } catch (IOException e) {
                    // TODO Auto-generated catch block
                    e.printStackTrace();
                }
            }
            if(serverSocket!=null){
                try {
                    serverSocket.close();
                } catch (IOException e) {
                    // TODO Auto-generated catch block
                    e.printStackTrace();
                }
            }
        }
    }
}

當(dāng)我們運行服務(wù)器的時候服務(wù)器會等著接受Socket,如果沒有則進入阻塞狀態(tài)
當(dāng)我們運行客戶端的時候?qū)?shù)據(jù)給Socket那么服務(wù)端就會由阻塞進入就緒狀態(tài),然后進入執(zhí)行狀態(tài)執(zhí)行下面的代碼
那么服務(wù)端可不可以和客戶端進行互相通信呢
下面的例子就是互相通信的
客戶端

package com.qf.demo4;

import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import java.net.Socket;
import java.net.UnknownHostException;
import java.util.Scanner;

import com.qf.demo3.Util;

/**
 * 控制臺循環(huán)輸入數(shù)據(jù) 發(fā)送給 服務(wù)端
 * 
 * @author Administrator
 *
 */
public class Client {

    public static void main(String[] args) {
        // 1 創(chuàng)建快遞點
        Socket socket = null;
        OutputStream os = null;
        InputStream is = null;
        try {

            socket = new Socket("10.0.143.51", 8888);
            // 2 準備要發(fā)送的數(shù)據(jù)
            Scanner scanner = new Scanner(System.in);
            // 3 獲得快遞員
            os = socket.getOutputStream();
            is = socket.getInputStream();
            while (true) {
                String data = scanner.next();
                os.write(data.getBytes());
                os.flush();
                if ("over".equals(data)) {
                    break;
                }

                // 收到回信
                byte[] bs = new byte[1024];
                int num = is.read(bs);
                String reault = new String(bs, 0, num);
                System.out.println("服務(wù)器回復(fù)的數(shù)據(jù)是  : " + reault);
                if ("over".equals(reault)) {
                    break;
                }
            }
        } catch (UnknownHostException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        } catch (IOException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }finally {
            Util.closed(null, socket, is, os);
        }

    }
}

服務(wù)端

package com.qf.demo4;

import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import java.net.ServerSocket;
import java.net.Socket;
import java.util.Scanner;

import com.qf.demo3.Util;

public class Server {

    public static void main(String[] args) {
        // 1 創(chuàng)建 服務(wù)端的socket
        ServerSocket serverSocket = null;
        Socket socket =null;
        InputStream is =null;
        OutputStream os  = null;
        try {
             serverSocket = new ServerSocket(8888);
            // 2 等待接收客戶端的數(shù)據(jù)
             socket = serverSocket.accept();
             is = socket.getInputStream();
             os  =  socket.getOutputStream();
            Scanner scanner = new Scanner(System.in);
            // 3  讀取信息
            while(true){
                byte[] bs = new byte[1024];
                int num = is.read(bs);
                String string = new String(bs, 0, num);
                System.out.println("客戶端發(fā)送了: "+string);
                if("over".equals(string)){
                    break;
                }
                
                // 以下是回復(fù)數(shù)據(jù)
                String result = scanner.next();
                os.write(result.getBytes());
                os.flush();
                if("over".equals(result)){
                    break;
                }
                
            }
        } catch (IOException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }finally {
            Util.closed(serverSocket, socket, is, os);
        }
        
    }
}
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末炸茧,一起剝皮案震驚了整個濱河市肪虎,隨后出現(xiàn)的幾起案子排嫌,更是在濱河造成了極大的恐慌芯勘,老刑警劉巖,帶你破解...
    沈念sama閱讀 211,639評論 6 492
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件装蓬,死亡現(xiàn)場離奇詭異著拭,居然都是意外死亡,警方通過查閱死者的電腦和手機牍帚,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,277評論 3 385
  • 文/潘曉璐 我一進店門儡遮,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人暗赶,你說我怎么就攤上這事鄙币。” “怎么了蹂随?”我有些...
    開封第一講書人閱讀 157,221評論 0 348
  • 文/不壞的土叔 我叫張陵十嘿,是天一觀的道長。 經(jīng)常有香客問我糙及,道長详幽,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 56,474評論 1 283
  • 正文 為了忘掉前任浸锨,我火速辦了婚禮,結(jié)果婚禮上版姑,老公的妹妹穿的比我還像新娘柱搜。我一直安慰自己,他們只是感情好剥险,可當(dāng)我...
    茶點故事閱讀 65,570評論 6 386
  • 文/花漫 我一把揭開白布聪蘸。 她就那樣靜靜地躺著,像睡著了一般表制。 火紅的嫁衣襯著肌膚如雪健爬。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 49,816評論 1 290
  • 那天么介,我揣著相機與錄音娜遵,去河邊找鬼。 笑死壤短,一個胖子當(dāng)著我的面吹牛设拟,可吹牛的內(nèi)容都是我干的慨仿。 我是一名探鬼主播,決...
    沈念sama閱讀 38,957評論 3 408
  • 文/蒼蘭香墨 我猛地睜開眼纳胧,長吁一口氣:“原來是場噩夢啊……” “哼镰吆!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起跑慕,我...
    開封第一講書人閱讀 37,718評論 0 266
  • 序言:老撾萬榮一對情侶失蹤万皿,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后核行,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體牢硅,經(jīng)...
    沈念sama閱讀 44,176評論 1 303
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 36,511評論 2 327
  • 正文 我和宋清朗相戀三年钮科,在試婚紗的時候發(fā)現(xiàn)自己被綠了唤衫。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 38,646評論 1 340
  • 序言:一個原本活蹦亂跳的男人離奇死亡绵脯,死狀恐怖佳励,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情蛆挫,我是刑警寧澤赃承,帶...
    沈念sama閱讀 34,322評論 4 330
  • 正文 年R本政府宣布,位于F島的核電站悴侵,受9級特大地震影響瞧剖,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜可免,卻給世界環(huán)境...
    茶點故事閱讀 39,934評論 3 313
  • 文/蒙蒙 一抓于、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧浇借,春花似錦捉撮、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,755評論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至闯估,卻和暖如春灼舍,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背涨薪。 一陣腳步聲響...
    開封第一講書人閱讀 31,987評論 1 266
  • 我被黑心中介騙來泰國打工骑素, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人尤辱。 一個月前我還...
    沈念sama閱讀 46,358評論 2 360
  • 正文 我出身青樓砂豌,卻偏偏與公主長得像厢岂,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子阳距,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 43,514評論 2 348

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