TCP嫉拐、UDP切黔、Socket

  • 網(wǎng)絡(luò)通訊的三要素:
    • 一啥辨、 IP
  • IP地址

Internet上的每臺主機(Host)都有一個唯一的IP地址介返。IP地址的長度為32位焕妙,分為4段蒋伦,每段8位,用十進制數(shù)字表示焚鹊,每段數(shù)字范圍為0~255痕届,段與段之間用句點隔開。例如159.226.1.1寺旺。(四個字節(jié))

  • IP地址類別
    IP地址是由網(wǎng)絡(luò)號和主機號組成
    IP地址是由網(wǎng)絡(luò)號和主機號組成
    A類地址:8位網(wǎng)絡(luò)位爷抓,24位主機位 政府單位
    B類地址:16位網(wǎng)絡(luò)位,16位主機位 事業(yè)單位(學(xué)校阻塑、銀行..)
    C類地址:24位網(wǎng)絡(luò)位蓝撇,8位主機位 私人使用..
  • 特殊的IP地址
    127.0.0.1 表示 本機回環(huán)地址
    • 二、 Port端口號
      • Port地址

如果把IP地址比作一間房子 陈莽,端口就是出入這間房子的門渤昌。真正的房子只有幾個門,但是一個IP地址的端口 可以有65536(即:2^16)個之多走搁!端口是通過端口號來標(biāo)記的独柑,端口號只有整數(shù),范圍是從0 到65535(2^16-1)

 - Port分類(0~65535)

公認端口(WellKnownPorts):從0到1023私植,它們緊密綁定(binding)于一些服務(wù)忌栅。
注冊端口(RegisteredPorts):從1024到49151。它們松散地綁定于一些服務(wù)曲稼。
動態(tài)和/或私有端口(Dynamicand/orPrivatePorts):從49152到65535

  • 常用端口
    21 ---> FTP
    80 ---> HTTP
    443 ---> HTTPS
    • 三索绪、協(xié)議
  • TCP:

TransmissionControl Protocol 傳輸控制協(xié)議TCP是一種面向連接(連接導(dǎo)向)的、可靠的贫悄、基于字節(jié)流的運輸層(Transportlayer)通信協(xié)議瑞驱。
特點:
面向連接的協(xié)議,數(shù)據(jù)傳輸必須要建立連接窄坦,所以在TCP中需要連接時間唤反。
傳輸數(shù)據(jù)大小限制凳寺,一旦連接建立,雙方可以按統(tǒng)一的格式傳輸大的數(shù)據(jù)彤侍。
一個可靠的協(xié)議肠缨,確保接收方完全正確地獲取發(fā)送方所發(fā)送的全部數(shù)據(jù)。

  • UDP:

User Datagram Protocol的簡稱拥刻,中文名是用戶數(shù)據(jù)包協(xié)議怜瞒,是 OSI 參考模型中一種無連接的傳輸層協(xié)議父泳,提供面向事務(wù)的簡單不可靠信息傳送服務(wù)般哼。
特點:
每個數(shù)據(jù)報中都給出了完整的地址信息,因此無需要建立發(fā)送方和接收方的連接惠窄。
UDP傳輸數(shù)據(jù)時是有大小限制的蒸眠,每個被傳輸?shù)臄?shù)據(jù)報必須限定在64KB之內(nèi)。
UDP是一個不可靠的協(xié)議杆融,發(fā)送方所發(fā)送的數(shù)據(jù)報并不一定以相同的次序到達接收方楞卡。

  • TCP和UDP
    • UDP通訊協(xié)議的特點:
      將數(shù)據(jù)封裝為數(shù)據(jù)包,面向無連接脾歇。
      每個數(shù)據(jù)包大小限制在64K中
      因為無連接蒋腮,所以不可靠
      因為不需要建立連接,所以速度快
      UDP 通訊是不分服務(wù)端與客戶端的藕各,只分發(fā)送端與接收端池摧。
      比如: 物管的對講機, QQ聊天、 游戲...
/*
發(fā)送端的使用步驟:
    1. 建立udp的服務(wù)激况。
    2. 準(zhǔn)備數(shù)據(jù)作彤,把數(shù)據(jù)封裝到數(shù)據(jù)包中發(fā)送。 發(fā)送端的數(shù)據(jù)包要帶上ip地址與端口號乌逐。
    3. 調(diào)用udp的服務(wù)竭讳,發(fā)送數(shù)據(jù)。
    4. 關(guān)閉資源浙踢。
*/
// 發(fā)送方
public class Sender {

    public static void main(String[] args) throws IOException {
        // 創(chuàng)建UDP服務(wù)
        DatagramSocket socket = new DatagramSocket();

        // 準(zhǔn)備數(shù)據(jù)绢慢,把數(shù)據(jù)封裝到數(shù)據(jù)包
        String dataStr = "您好,請查收信息哦";

        // 創(chuàng)建一個數(shù)據(jù)包
        DatagramPacket packet = new DatagramPacket(dataStr.getBytes(), dataStr.getBytes().length, InetAddress.getLocalHost(), 60900);
        
        // 調(diào)用UDP服務(wù)發(fā)送數(shù)據(jù)包
        socket.send(packet);

        // 關(guān)閉UDP服務(wù)
        socket.close();
    }
}

//接收端
/*
 接收端的使用步驟
    1. 建立udp的服務(wù)
    2. 準(zhǔn)備空 的數(shù)據(jù) 包接收數(shù)據(jù)洛波。
    3. 調(diào)用udp的服務(wù)接收數(shù)據(jù)胰舆。
    4. 關(guān)閉資源
 
 */
public class Revice {

    public static void main(String[] args) throws IOException {
        
        // 創(chuàng)建UDP服務(wù)
        DatagramSocket socket = new DatagramSocket(60900);
        
        // 準(zhǔn)備空的數(shù)據(jù)包接收數(shù)據(jù)
        byte[] buff = new byte[1024];
        
        DatagramPacket packet = new DatagramPacket(buff, buff.length);
        
        // 調(diào)用UDP服務(wù)接收數(shù)據(jù)
        socket.receive(packet);
        System.out.println("接收到數(shù)據(jù):" + new String(buff, 0, packet.getLength()));
        socket.close();
    }
}
  • TCP通訊協(xié)議特點:
    TCP是基于IO流進行數(shù)據(jù) 的傳輸 的,面向連接奋岁。
    TCP進行數(shù)據(jù)傳輸?shù)臅r候是沒有大小限制的思瘟。
    TCP是面向連接,通過三次握手的機制保證數(shù)據(jù)的完整性闻伶。 可靠協(xié)議滨攻。
    TCP是面向連接的,所以速度慢。
    TCP通訊是區(qū)分客戶端與服務(wù)端 的光绕。
    比如: 打電話女嘲、 QQ的文件傳輸、 迅雷下載....

TCP協(xié)議下的Socket:
Socket(客戶端) , TCP的客戶端一旦啟動馬上要與服務(wù)端進行連接诞帐。
ServerSocket(服務(wù)端類)

/*
tcp的客戶端使用步驟:
1. 建立tcp的客戶端服務(wù)欣尼。
2. 獲取到對應(yīng)的流對象。
3.寫出或讀取數(shù)據(jù)
4. 關(guān)閉資源停蕉。

*/
// TCP的客戶端
public class ChatClient {

    public static void main(String[] args) {
        
        try {
            // 創(chuàng)建TCP服務(wù)
            Socket socket = new Socket(InetAddress.getLocalHost(), 20000);
            
            // 獲取socket的輸出流對象
            OutputStream outputStream = socket.getOutputStream();
            
            // 利用輸出流對象寫入數(shù)據(jù)
            outputStream.write("客戶端說:您好愕鼓,我是客戶端".getBytes()); 
            
            // 獲取到輸入流對象,讀取服務(wù)端返回的數(shù)據(jù)
            InputStream inputStream = socket.getInputStream();
            byte[] buffer = new byte[1024];
            int length = inputStream.read(buffer);
            System.out.println("服務(wù)端說:" + new String(buffer, 0, length));
            
            // 關(guān)閉客戶端
            outputStream.close();
            
        } catch (IOException e) {
            throw new RuntimeException(e);
        
        }   
    }
}

// TCP服務(wù)端
public class ChatService {

    public static void main(String[] args) {
        
        try {
            // 建立TCP的服務(wù)端慧起,并監(jiān)聽一個端口
            ServerSocket serverSocket = new ServerSocket(20000);
            
            // 接受客戶端的連接 該方法也是一個阻塞型的方法菇晃,沒有客戶端與其連接時,會一直等待下去蚓挤。
            Socket socket = serverSocket.accept();
            
            // 獲取輸入流對象磺送,讀取客戶端發(fā)送的數(shù)據(jù)
            InputStream inputStream = socket.getInputStream();
            
            byte[] buffer = new byte[1024];
            int length = 0;
            length = inputStream.read(buffer);
            System.out.println("客戶端說:" + new String(buffer, 0, length));
            
            // 獲取socket的輸出流對象,向客戶端發(fā)送數(shù)據(jù)
            OutputStream outputStream = socket.getOutputStream();
            outputStream.write("服務(wù)端說:您好我是服務(wù)端".getBytes());
            
            // 關(guān)閉服務(wù)端
            serverSocket.close();
            
        } catch (IOException e) {
            throw new  RuntimeException(e);
        }
        
    }
}
  • Socket
    • 套接字(socket)概念

套接字(socket)是通信的基石灿意,是支持TCP/IP協(xié)議的網(wǎng)絡(luò)通信的基本操作單元估灿。它是網(wǎng)絡(luò)通信過程中端點的抽象表示,包含進行網(wǎng)絡(luò)通信必須的五種信息:連接使用的協(xié)議缤剧,本地主機的IP地址馅袁,本地進程的協(xié)議端口,遠地主機的IP地址鞭执,遠程進程的協(xié)議端口司顿。
應(yīng)用層通過傳輸層進行數(shù)據(jù)通信時,TCP會遇到同時為多個應(yīng)用程序進程提供并發(fā)服務(wù)的問題兄纺。多個TCP連接或多個應(yīng)用程序進程可能需要通過同一個 TCP協(xié)議端口傳輸數(shù)據(jù)大溜。為了區(qū)別不同的應(yīng)用程序進程和連接,許多計算機操作系統(tǒng)為應(yīng)用程序與TCP/IP協(xié)議交互提供了套接字(Socket)接口估脆。應(yīng)用層可以和傳輸層通過Socket接口钦奋,區(qū)分來自不同應(yīng)用程序進程或網(wǎng)絡(luò)連接的通信,實現(xiàn)數(shù)據(jù)傳輸?shù)牟l(fā)服務(wù)疙赠。

  • 建立socket連接
    建立Socket連接至少需要一對套接字付材,其中一個運行于客戶端,稱為ClientSocket圃阳,另一個運行于服務(wù)器端厌衔,稱為ServerSocket。
    套接字之間的連接過程分為三個步驟:服務(wù)器監(jiān)聽捍岳,客戶端請求富寿,連接確認睬隶。

    • 服務(wù)器監(jiān)聽:服務(wù)器端套接字并不定位具體的客戶端套接字,而是處于等待連接的狀態(tài)页徐,實時監(jiān)控網(wǎng)絡(luò)狀態(tài)苏潜,等待客戶端的連接請求。
    • 客戶端請求:指客戶端的套接字提出連接請求变勇,要連接的目標(biāo)是服務(wù)器端的套接字恤左。為此,客戶端的套接字必須首先描述它要連接的服務(wù)器的套接字搀绣,指出服務(wù)器端套接字的地址和端口號飞袋,然后就向服務(wù)器端套接字提出連接請求。
    • 連接確認:當(dāng)服務(wù)器端套接字監(jiān)聽到或者說接收到客戶端套接字的連接請求時豌熄,就響應(yīng)客戶端套接字的請求授嘀,建立一個新的線程物咳,把服務(wù)器端套接字的描述發(fā)給客戶 端锣险,一旦客戶端確認了此描述,雙方就正式建立連接览闰。而服務(wù)器端套接字繼續(xù)處于監(jiān)聽狀態(tài)芯肤,繼續(xù)接收其他客戶端套接字的連接請求。
  • SOCKET連接與TCP連接
    創(chuàng)建Socket連接時压鉴,可以指定使用的傳輸層協(xié)議崖咨,Socket可以支持不同的傳輸層協(xié)議(TCP或UDP),當(dāng)使用TCP協(xié)議進行連接時油吭,該Socket連接就是一個TCP連接击蹲。

  • Socket連接與HTTP連接
    由于通常情況下Socket連接就是TCP連接,因此Socket連接一旦建立婉宰,通信雙方即可開始相互發(fā)送數(shù)據(jù)內(nèi)容歌豺,直到雙方連接斷開。但在實際網(wǎng)絡(luò)應(yīng)用中心包,客戶端到服務(wù)器之間的通信往往需要穿越多個中間節(jié)點类咧,例如路由器、網(wǎng)關(guān)蟹腾、防火墻等痕惋,大部分防火墻默認會關(guān)閉長時間處于非活躍狀態(tài)的連接而導(dǎo)致 Socket 連接斷連,因此需要通過輪詢告訴網(wǎng)絡(luò)娃殖,該連接處于活躍狀態(tài)值戳。
    而HTTP連接使用的是“請求—響應(yīng)”的方式,不僅在請求時需要先建立連接炉爆,而且需要客戶端向服務(wù)器發(fā)出請求后堕虹,服務(wù)器端才能回復(fù)數(shù)據(jù)柿隙。
    很 多情況下,需要服務(wù)器端主動向客戶端推送數(shù)據(jù)鲫凶,保持客戶端與服務(wù)器數(shù)據(jù)的實時與同步禀崖。此時若雙方建立的是Socket連接,服務(wù)器就可以直接將數(shù)據(jù)傳送給客戶端螟炫;若雙方建立的是HTTP連接波附,則服務(wù)器需要等到客戶端發(fā)送一次請求后才能將數(shù)據(jù)傳回給客戶端,因此昼钻,客戶端定時向服務(wù)器端發(fā)送連接請求掸屡,不僅可以 保持在線,同時也是在“詢問”服務(wù)器是否有新的數(shù)據(jù)然评,如果有就將數(shù)據(jù)傳給客戶端仅财。

  • Scoket連接和HTTP連接的區(qū)別:
    HTTP協(xié)議是基于TCP連接的,是應(yīng)用層協(xié)議碗淌,主要解決如何包裝數(shù)據(jù)盏求。Socket是對TCP/IP協(xié)議的封裝,Socket本身并不是協(xié)議亿眠,而是一個調(diào)用接口(API)碎罚,通過Socket,我們才能使用TCP/IP協(xié)議纳像。
    HTTP連接:短連接荆烈,客戶端向服務(wù)器發(fā)送一次請求,服務(wù)器響應(yīng)后連接斷開竟趾,節(jié)省資源憔购。服務(wù)器不能主動給客戶端響應(yīng)(除非采用HTTP長連接技術(shù))
    Socket連接:長連接,客戶端跟服務(wù)器端直接使用Socket進行連接岔帽,沒有規(guī)定連接后斷開玫鸟,因此客戶端和服務(wù)器段保持連接通道,雙方可以主動發(fā)送數(shù)據(jù)山卦,一般多用于游戲.Socket默認連接超時時間是30秒鞋邑,默認大小是8K(理解為一個數(shù)據(jù)包大小)账蓉。

// 練習(xí)1: 使用TCP實現(xiàn)客戶端與服務(wù)端一問一答聊天
// 客戶端類
public class Client {

    public static void main(String[] args) throws IOException {
        
        // 建立TCP的客戶端服務(wù)
        Socket socket = new Socket(InetAddress.getLocalHost(), 20000);
        
        // 獲取socket的輸出流對象
        OutputStreamWriter writer = new OutputStreamWriter(socket.getOutputStream());
        // 獲取socket的輸入流對象
        BufferedReader reader = new BufferedReader(new InputStreamReader(socket.getInputStream()));
        
        // 獲取鍵盤的輸入流對象枚碗,讀取數(shù)據(jù)
        BufferedReader keyReader = new BufferedReader(new InputStreamReader(System.in));
        
        // 不斷的讀取鍵盤錄入的數(shù)據(jù)然后把數(shù)據(jù)輸出
        String lineStr = null;
        while ((lineStr = keyReader.readLine()) != null) {
            System.out.println();
            writer.write(lineStr + "\r");
            // 刷新數(shù)據(jù)
            writer.flush();
            
            // 讀取服務(wù)器返回的數(shù)據(jù)
            lineStr = reader.readLine();
            System.out.println("服務(wù)器返回的數(shù)據(jù)是:" + lineStr);
        }
        
        // 關(guān)閉socket
        socket.close();
    }
}

// 服務(wù)端類
public class Service {

    public static void main(String[] args) throws IOException {
        
        // 建立tcp的服務(wù)端
        ServerSocket serverSocket = new ServerSocket(20000);
        
        // 接收服務(wù)端的連接,并獲取一個socket
        Socket socket = serverSocket.accept();
        
        // 獲取到socket的輸入流對象
        BufferedReader reader = new BufferedReader(new InputStreamReader(socket.getInputStream()));
        
        // 獲取到socket的輸出流對象
        OutputStreamWriter writer = new OutputStreamWriter(socket.getOutputStream());
        
        // 獲取鍵盤的輸入流對象
        BufferedReader keyReader = new BufferedReader(new InputStreamReader(System.in));
        
        // 讀取客戶端的數(shù)據(jù)
        String lineStr = null;
        while ((lineStr = reader.readLine()) != null) {
            System.out.println("服務(wù)器接收到的數(shù)據(jù):" + lineStr);
            
            System.out.println("請輸入回復(fù)客戶端的數(shù)據(jù)");
            
            lineStr = keyReader.readLine();
            
            writer.write(lineStr + "\r");
            writer.flush();
        }
        
        // 關(guān)閉資源
        serverSocket.close();
    }
}
// 練習(xí)2:編寫一個服務(wù)器铸本,可以讓多個客戶端可以下載圖片
import java.io.FileInputStream;
import java.io.IOException;
import java.io.OutputStream;
import java.net.ServerSocket;
import java.net.Socket;
import java.util.HashSet;

// 練習(xí):編寫一個服務(wù)器肮雨,可以讓多個客戶端下載圖片

// 模擬服務(wù)器類
public class ImageService extends Thread {

    Socket socket;
    // 使用該集合是用于存儲ip地址的,由于重復(fù)元素不會被添加,間接記錄下載的人數(shù)
    HashSet< String> ipSet = new HashSet<String>();
    
    @Override
    public void run() {
        try {
            // 獲取socke的輸出流對象
            OutputStream outputStream = socket.getOutputStream();
            // 獲取圖片的輸入流對象
            FileInputStream fileInputStream = new FileInputStream("/Users/mofeini/Desktop/to/4.jpg");
            // 讀取圖片箱玷,把數(shù)據(jù)寫入到指定路徑
            byte[] buffer = new byte[1024];
            int length = 0;
            while ((length = fileInputStream.read(buffer)) != -1) {
                outputStream.write(buffer, 0, length);
            }
            
            String ip = socket.getInetAddress().getHostAddress();
            if(ipSet.add(ip)) {
                System.out.println("第" + ipSet.size() + "下載了圖片" );
            }
            
            // 關(guān)閉資源
            fileInputStream.close();
            socket.close();
            
        } catch (Exception e) {
            // TODO: handle exception
            e.printStackTrace();
        }
    }
    
    public ImageService(Socket socket) {
        this.socket = socket;
    }
    
    public static void main(String[] args) throws IOException {
        
        // 建立tcp連接怨规,并監(jiān)聽端口
        ServerSocket serverSocket = new ServerSocket(20002);
        
        while (true) {
            // 確定連接
            Socket socket = serviceSocket.accept();
            new ImageService(socket).start();
        }
        
        
        
    }
}

// 下載圖片的客戶端
public class ImageClient {

    public static void main(String[] args) throws IOException {
        // 建立tcp服務(wù)
        Socket socket = new Socket(InetAddress.getLocalHost(), 20002);
        
        // 獲取socket的輸入流對象
        InputStream inputStream = socket.getInputStream();
        // 獲取文件的輸出流對象
        FileOutputStream fileOutputStream = new FileOutputStream("/Users/mofeini/Desktop/to/download.jpg");
        
        // 邊讀取圖片陌宿,邊下載圖片
        byte[] buffer = new byte[1024];
        int length = 0;
        while ((length = inputStream.read(buffer)) != -1) {
            fileOutputStream.write(buffer, 0, length);
        }
        
        // 關(guān)閉資源
        fileOutputStream.close();
        socket.close();
    }
    
}
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市波丰,隨后出現(xiàn)的幾起案子壳坪,更是在濱河造成了極大的恐慌,老刑警劉巖掰烟,帶你破解...
    沈念sama閱讀 206,968評論 6 482
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件爽蝴,死亡現(xiàn)場離奇詭異,居然都是意外死亡纫骑,警方通過查閱死者的電腦和手機蝎亚,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 88,601評論 2 382
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來先馆,“玉大人发框,你說我怎么就攤上這事∶呵剑” “怎么了梅惯?”我有些...
    開封第一講書人閱讀 153,220評論 0 344
  • 文/不壞的土叔 我叫張陵,是天一觀的道長番捂。 經(jīng)常有香客問我个唧,道長,這世上最難降的妖魔是什么设预? 我笑而不...
    開封第一講書人閱讀 55,416評論 1 279
  • 正文 為了忘掉前任,我火速辦了婚禮犁河,結(jié)果婚禮上鳖枕,老公的妹妹穿的比我還像新娘。我一直安慰自己桨螺,他們只是感情好宾符,可當(dāng)我...
    茶點故事閱讀 64,425評論 5 374
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著灭翔,像睡著了一般魏烫。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上肝箱,一...
    開封第一講書人閱讀 49,144評論 1 285
  • 那天哄褒,我揣著相機與錄音,去河邊找鬼煌张。 笑死呐赡,一個胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的骏融。 我是一名探鬼主播链嘀,決...
    沈念sama閱讀 38,432評論 3 401
  • 文/蒼蘭香墨 我猛地睜開眼萌狂,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了怀泊?” 一聲冷哼從身側(cè)響起茫藏,我...
    開封第一講書人閱讀 37,088評論 0 261
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎霹琼,沒想到半個月后刷允,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 43,586評論 1 300
  • 正文 獨居荒郊野嶺守林人離奇死亡碧囊,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 36,028評論 2 325
  • 正文 我和宋清朗相戀三年树灶,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片糯而。...
    茶點故事閱讀 38,137評論 1 334
  • 序言:一個原本活蹦亂跳的男人離奇死亡天通,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出熄驼,到底是詐尸還是另有隱情像寒,我是刑警寧澤,帶...
    沈念sama閱讀 33,783評論 4 324
  • 正文 年R本政府宣布瓜贾,位于F島的核電站诺祸,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏祭芦。R本人自食惡果不足惜筷笨,卻給世界環(huán)境...
    茶點故事閱讀 39,343評論 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望龟劲。 院中可真熱鬧胃夏,春花似錦、人聲如沸昌跌。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,333評論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽蚕愤。三九已至答恶,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間萍诱,已是汗流浹背悬嗓。 一陣腳步聲響...
    開封第一講書人閱讀 31,559評論 1 262
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留砂沛,地道東北人烫扼。 一個月前我還...
    沈念sama閱讀 45,595評論 2 355
  • 正文 我出身青樓,卻偏偏與公主長得像碍庵,于是被迫代替她去往敵國和親映企。 傳聞我的和親對象是個殘疾皇子悟狱,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 42,901評論 2 345

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