日韩av黄I国产麻豆传媒I国产91av视频在线观看I日韩一区二区三区在线看I美女国产在线I麻豆视频国产在线观看I成人黄色短片

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 >

java socket 重连复用_Java Socket编程基础及深入讲解(示例代码)

發布時間:2023/12/10 27 豆豆
生活随笔 收集整理的這篇文章主要介紹了 java socket 重连复用_Java Socket编程基础及深入讲解(示例代码) 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

Socket是Java網絡編程的基礎,了解還是有好處的,

這篇文章主要講解Socket的基礎編程。Socket用在哪呢,主要用在進程間,網絡間通信。本篇比較長,特別做了個目錄:

一、Socket通信基本示例

這種模式是基礎,必須掌握,后期對Socket的優化都是在這個基礎上的,也是為以后學習NIO做鋪墊。

package yiwangzhibujian.onlysend;

import java.io.InputStream;

import java.net.ServerSocket;

import java.net.Socket;

public class SocketServer {

public static void main(String[] args) throws Exception {

// 監聽指定的端口

int port = 55533;

ServerSocket server = new ServerSocket(port);

// server將一直等待連接的到來

System.out.println("server將一直等待連接的到來");

Socket socket = server.accept();

// 建立好連接后,從socket中獲取輸入流,并建立緩沖區進行讀取

InputStream inputStream = socket.getInputStream();

byte[] bytes = new byte[1024];

int len;

StringBuilder sb = new StringBuilder();

while ((len = inputStream.read(bytes)) != -1) {

//注意指定編碼格式,發送方和接收方一定要統一,建議使用UTF-8

sb.append(new String(bytes, 0, len,"UTF-8"));

}

System.out.println("get message from client: " + sb);

inputStream.close();

socket.close();

server.close();

}

}

服務端監聽一個端口,等待連接的到來

package yiwangzhibujian.onlysend;

import java.io.OutputStream;

import java.net.Socket;

public class SocketClient {

public static void main(String args[]) throws Exception {

// 要連接的服務端IP地址和端口

String host = "127.0.0.1";

int port = 55533;

// 與服務端建立連接

Socket socket = new Socket(host, port);

// 建立連接后獲得輸出流

OutputStream outputStream = socket.getOutputStream();

String message="你好 yiwangzhibujian";

socket.getOutputStream().write(message.getBytes("UTF-8"));

outputStream.close();

socket.close();

}

}

客戶端通過ip和端口,連接到指定的server,然后通過Socket獲得輸出流,并向其輸出內容,服務器會獲得消息。最終服務端控制臺打印如下:

server將一直等待連接的到來

get message from client: 你好 yiwangzhibujian

通過這個例子應該掌握并了解:

Socket服務端和客戶端的基本編程

傳輸編碼統一指定,防止亂碼

這個例子做為學習的基本例子,實際開發中會有各種變形,比如客戶端在發送完消息后,需要服務端進行處理并返回,如下。

二、消息通信優化

2.1 雙向通信,發送消息并接受消息

這個也是做為Socket編程的基本,應該掌握,例子如下:

package yiwangzhibujian.waitreceive;

import java.io.InputStream;

import java.io.OutputStream;

import java.net.ServerSocket;

import java.net.Socket;

public class SocketServer {

public static void main(String[] args) throws Exception {

// 監聽指定的端口

int port = 55533;

ServerSocket server = new ServerSocket(port);

// server將一直等待連接的到來

System.out.println("server將一直等待連接的到來");

Socket socket = server.accept();

// 建立好連接后,從socket中獲取輸入流,并建立緩沖區進行讀取

InputStream inputStream = socket.getInputStream();

byte[] bytes = new byte[1024];

int len;

StringBuilder sb = new StringBuilder();

//只有當客戶端關閉它的輸出流的時候,服務端才能取得結尾的-1

while ((len = inputStream.read(bytes)) != -1) {

// 注意指定編碼格式,發送方和接收方一定要統一,建議使用UTF-8

sb.append(new String(bytes, 0, len, "UTF-8"));

}

System.out.println("get message from client: " + sb);

OutputStream outputStream = socket.getOutputStream();

outputStream.write("Hello Client,I get the message.".getBytes("UTF-8"));

inputStream.close();

outputStream.close();

socket.close();

server.close();

}

}

與之前server的不同在于,當讀取完客戶端的消息后,打開輸出流,將指定消息發送回客戶端,客戶端程序為:

package yiwangzhibujian.waitreceive;

import java.io.InputStream;

import java.io.OutputStream;

import java.net.Socket;

public class SocketClient {

public static void main(String args[]) throws Exception {

// 要連接的服務端IP地址和端口

String host = "127.0.0.1";

int port = 55533;

// 與服務端建立連接

Socket socket = new Socket(host, port);

// 建立連接后獲得輸出流

OutputStream outputStream = socket.getOutputStream();

String message = "你好 yiwangzhibujian";

socket.getOutputStream().write(message.getBytes("UTF-8"));

//通過shutdownOutput高速服務器已經發送完數據,后續只能接受數據

socket.shutdownOutput();

InputStream inputStream = socket.getInputStream();

byte[] bytes = new byte[1024];

int len;

StringBuilder sb = new StringBuilder();

while ((len = inputStream.read(bytes)) != -1) {

//注意指定編碼格式,發送方和接收方一定要統一,建議使用UTF-8

sb.append(new String(bytes, 0, len,"UTF-8"));

}

System.out.println("get message from server: " + sb);

inputStream.close();

outputStream.close();

socket.close();

}

}

客戶端也有相應的變化,在發送完消息時,調用關閉輸出流方法,然后打開輸出流,等候服務端的消息。

2.2 使用場景

這個模式的使用場景一般用在,客戶端發送命令給服務器,然后服務器相應指定的命令,如果只是客戶端發送消息給服務器,然后讓服務器返回收到消息的消息,這就有點過分了,這就是完全不相信Socket的傳輸安全性,要知道它的底層可是TCP,如果沒有發送到服務器端是會拋異常的,這點完全不用擔心。

2.3 如何告知對方已發送完命令

其實這個問題還是比較重要的,正常來說,客戶端打開一個輸出流,如果不做約定,也不關閉它,那么服務端永遠不知道客戶端是否發送完消息,那么服務端會一直等待下去,直到讀取超時。所以怎么告知服務端已經發送完消息就顯得特別重要。

2.3.1 通過Socket關閉

這個是第一章介紹的方式,當Socket關閉的時候,服務端就會收到響應的關閉信號,那么服務端也就知道流已經關閉了,這個時候讀取操作完成,就可以繼續后續工作。

但是這種方式有一些缺點

客戶端Socket關閉后,將不能接受服務端發送的消息,也不能再次發送消息

如果客戶端想再次發送消息,需要重現創建Socket連接

2.3.2 通過Socket關閉輸出流的方式

這種方式調用的方法是:

socket.shutdownOutput();

而不是(outputStream為發送消息到服務端打開的輸出流):

outputStream.close();

如果關閉了輸出流,那么相應的Socket也將關閉,和直接關閉Socket一個性質。

調用Socket的shutdownOutput()方法,底層會告知服務端我這邊已經寫完了,那么服務端收到消息后,就能知道已經讀取完消息,如果服務端有要返回給客戶的消息那么就可以通過服務端的輸出流發送給客戶端,如果沒有,直接關閉Socket。

這種方式通過關閉客戶端的輸出流,告知服務端已經寫完了,雖然可以讀到服務端發送的消息,但是還是有一點點缺點:

不能再次發送消息給服務端,如果再次發送,需要重新建立Socket連接

這個缺點,在訪問頻率比較高的情況下將是一個需要優化的地方。

2.3.3 通過約定符號

這種方式的用法,就是雙方約定一個字符或者一個短語,來當做消息發送完成的標識,通常這么做就需要改造讀取方法。

假如約定單端的一行為end,代表發送完成,例如下面的消息,end則代表消息發送完成:

hello yiwangzhibujian

end

那么服務端響應的讀取操作需要進行如下改造:

Socket socket = server.accept();

// 建立好連接后,從socket中獲取輸入流,并建立緩沖區進行讀取

BufferedReader read=new BufferedReader(new InputStreamReader(socket.getInputStream(),"UTF-8"));

String line;

StringBuilder sb = new StringBuilder();

while ((line = read.readLine()) != null && "end".equals(line)) {

//注意指定編碼格式,發送方和接收方一定要統一,建議使用UTF-8

sb.append(line);

}

可以看見,服務端不僅判斷是否讀到了流的末尾,還判斷了是否讀到了約定的末尾。

這么做的優缺點如下:

優點:不需要關閉流,當發送完一條命令(消息)后可以再次發送新的命令(消息)

缺點:需要額外的約定結束標志,太簡單的容易出現在要發送的消息中,誤被結束,太復雜的不好處理,還占帶寬

經過了這么多的優化還是有缺點,難道就沒有完美的解決方案嗎,答案是有的,看接下來的內容。

2.3.4 通過指定長度

如果你了解一點class文件的結構(后續會寫,敬請期待),那么你就會佩服這么設計方式,也就是說我們可以在此找靈感,就是我們可以先指定后續命令的長度,然后讀取指定長度的內容做為客戶端發送的消息。

現在首要的問題就是用幾個字節指定長度呢,我們可以算一算:

1個字節:最大256,表示256B

2個字節:最大65536,表示64K

3個字節:最大16777216,表示16M

4個字節:最大4294967296,表示4G

依次類推

這個時候是不是很糾結,最大的當然是最保險的,但是真的有必要選擇最大的嗎,其實如果你稍微了解一點UTF-8的編碼方式(字符編碼后續會寫,敬請期待),那么你就應該能想到為什么一定要固定表示長度字節的長度呢,我們可以使用變長方式來表示長度的表示,比如:

第一個字節首位為0:即0XXXXXXX,表示長度就一個字節,最大128,表示128B

第一個字節首位為110,那么附帶后面一個字節表示長度:即110XXXXX?10XXXXXX,最大2048,表示2K

第一個字節首位為1110,那么附帶后面二個字節表示長度:即110XXXXX?10XXXXXX?10XXXXXX,最大131072,表示128K

依次類推

上面提到的這種用法適合高富帥的程序員使用,一般呢,如果用作命名發送,兩個字節就夠了,如果還不放心4個字節基本就能滿足你的所有要求,下面的例子我們將采用2個字節表示長度,目的只是給你一種思路,讓你知道有這種方式來獲取消息的結尾:

服務端程序:

package yiwangzhibujian.waitreceive2;

import java.io.InputStream;

import java.net.ServerSocket;

import java.net.Socket;

public class SocketServer {

public static void main(String[] args) throws Exception {

// 監聽指定的端口

int port = 55533;

ServerSocket server = new ServerSocket(port);

// server將一直等待連接的到來

System.out.println("server將一直等待連接的到來");

Socket socket = server.accept();

// 建立好連接后,從socket中獲取輸入流,并建立緩沖區進行讀取

InputStream inputStream = socket.getInputStream();

byte[] bytes;

// 因為可以復用Socket且能判斷長度,所以可以一個Socket用到底

while (true) {

// 首先讀取兩個字節表示的長度

int first = inputStream.read();

//如果讀取的值為-1 說明到了流的末尾,Socket已經被關閉了,此時將不能再去讀取

if(first==-1){

break;

}

int second = inputStream.read();

int length = (first << 8) + second;

// 然后構造一個指定長的byte數組

bytes = new byte[length];

// 然后讀取指定長度的消息即可

inputStream.read(bytes);

System.out.println("get message from client: " + new String(bytes, "UTF-8"));

}

inputStream.close();

socket.close();

server.close();

}

}

此處的讀取步驟為,先讀取兩個字節的長度,然后讀取消息,客戶端為:

package yiwangzhibujian.waitreceive2;

import java.io.OutputStream;

import java.net.Socket;

public class SocketClient {

public static void main(String args[]) throws Exception {

// 要連接的服務端IP地址和端口

String host = "127.0.0.1";

int port = 55533;

// 與服務端建立連接

Socket socket = new Socket(host, port);

// 建立連接后獲得輸出流

OutputStream outputStream = socket.getOutputStream();

String message = "你好 yiwangzhibujian";

//首先需要計算得知消息的長度

byte[] sendBytes = message.getBytes("UTF-8");

//然后將消息的長度優先發送出去

outputStream.write(sendBytes.length >>8);

outputStream.write(sendBytes.length);

//然后將消息再次發送出去

outputStream.write(sendBytes);

outputStream.flush();

//==========此處重復發送一次,實際項目中為多個命名,此處只為展示用法

message = "第二條消息";

sendBytes = message.getBytes("UTF-8");

outputStream.write(sendBytes.length >>8);

outputStream.write(sendBytes.length);

outputStream.write(sendBytes);

outputStream.flush();

//==========此處重復發送一次,實際項目中為多個命名,此處只為展示用法

message = "the third message!";

sendBytes = message.getBytes("UTF-8");

outputStream.write(sendBytes.length >>8);

outputStream.write(sendBytes.length);

outputStream.write(sendBytes);

outputStream.close();

socket.close();

}

}

客戶端要多做的是,在發送消息之前先把消息的長度發送過去。

這種事先約定好長度的做法解決了之前提到的種種問題,Redis的Java客戶端Jedis就是用這種方式實現的這種方式的缺點:

暫時還沒發現

當然如果是需要服務器返回結果,那么也依然使用這種方式,服務端也是先發送結果的長度,然后客戶端進行讀取。當然現在流行的就是,長度+類型+數據模式的傳輸方式。

三、服務端優化

3.1 服務端并發處理能力

在上面的例子中,服務端僅僅只是接受了一個Socket請求,并處理了它,然后就結束了,但是在實際開發中,一個Socket服務往往需要服務大量的Socket請求,那么就不能再服務完一個Socket的時候就關閉了,這時候可以采用循環接受請求并處理的邏輯:

package yiwangzhibujian.multiserver;

import java.io.IOException;

import java.io.InputStream;

import java.net.ServerSocket;

import java.net.Socket;

public class SocketServer {

public static void main(String args[]) throws IOException {

// 監聽指定的端口

int port = 55533;

ServerSocket server = new ServerSocket(port);

// server將一直等待連接的到來

System.out.println("server將一直等待連接的到來");

while(true){

Socket socket = server.accept();

// 建立好連接后,從socket中獲取輸入流,并建立緩沖區進行讀取

InputStream inputStream = socket.getInputStream();

byte[] bytes = new byte[1024];

int len;

StringBuilder sb = new StringBuilder();

while ((len = inputStream.read(bytes)) != -1) {

// 注意指定編碼格式,發送方和接收方一定要統一,建議使用UTF-8

sb.append(new String(bytes, 0, len, "UTF-8"));

}

System.out.println("get message from client: " + sb);

inputStream.close();

socket.close();

}

}

}

這種一般也是新手寫法,但是能夠循環處理多個Socket請求,不過當一個請求的處理比較耗時的時候,后面的請求將被阻塞,所以一般都是用多線程的方式來處理Socket,即每有一個Socket請求的時候,就創建一個線程來處理它。

不過在實際生產中,創建的線程會交給線程池來處理,為了:

線程復用,創建線程耗時,回收線程慢

防止短時間內高并發,指定線程池大小,超過數量將等待,方式短時間創建大量線程導致資源耗盡,服務掛掉

package yiwangzhibujian.threadserver;

import java.io.InputStream;

import java.net.ServerSocket;

import java.net.Socket;

import java.util.concurrent.ExecutorService;

import java.util.concurrent.Executors;

public class SocketServer {

public static void main(String args[]) throws Exception {

// 監聽指定的端口

int port = 55533;

ServerSocket server = new ServerSocket(port);

// server將一直等待連接的到來

System.out.println("server將一直等待連接的到來");

//如果使用多線程,那就需要線程池,防止并發過高時創建過多線程耗盡資源

ExecutorService threadPool = Executors.newFixedThreadPool(100);

while (true) {

Socket socket = server.accept();

Runnable runnable=()->{

try {

// 建立好連接后,從socket中獲取輸入流,并建立緩沖區進行讀取

InputStream inputStream = socket.getInputStream();

byte[] bytes = new byte[1024];

int len;

StringBuilder sb = new StringBuilder();

while ((len = inputStream.read(bytes)) != -1) {

// 注意指定編碼格式,發送方和接收方一定要統一,建議使用UTF-8

sb.append(new String(bytes, 0, len, "UTF-8"));

}

System.out.println("get message from client: " + sb);

inputStream.close();

socket.close();

} catch (Exception e) {

e.printStackTrace();

}

};

threadPool.submit(runnable);

}

}

}

使用線程池的方式,算是一種成熟的方式??梢詰迷谏a中。

3.2 服務端其他屬性

ServerSocket有以下3個屬性。

SO_TIMEOUT:表示等待客戶連接的超時時間。一般不設置,會持續等待。

SO_REUSEADDR:表示是否允許重用服務器所綁定的地址。一般不設置,經我的測試沒必要,下面會進行詳解。

SO_RCVBUF:表示接收數據的緩沖區的大小。一般不設置,用系統默認就可以了。

具體詳細的解釋可以參照下面。

3.3 性能再次提升

當現在的性能還不能滿足需求的時候,就需要考慮使用NIO,這不是本篇的內容,后續會貼出。

四、Socket的其它知識

其實如果經常看有關網絡編程的源碼的話,就會發現Socket還是有很多設置的,可以學著用,但是還是要有一些基本的了解比較好。下面就對Socket的Java API中涉及到的進行簡單講解。首先呢Socket有哪些可以設置的選項,其實在SocketOptions接口中已經都列出來了:

int TCP_NODELAY = 0x0001:對此連接禁用 Nagle 算法。

int SO_BINDADDR = 0x000F:此選項為 TCP 或 UDP 套接字在 IP 地址頭中設置服務類型或流量類字段。

int SO_REUSEADDR = 0x04:設置套接字的 SO_REUSEADDR。

int SO_BROADCAST = 0x0020:此選項啟用和禁用發送廣播消息的處理能力。

int IP_MULTICAST_IF = 0x10:設置用于發送多播包的傳出接口。

int IP_MULTICAST_IF2 = 0x1f:設置用于發送多播包的傳出接口。

int IP_MULTICAST_LOOP = 0x12:此選項啟用或禁用多播數據報的本地回送。

int IP_TOS = 0x3:此選項為 TCP 或 UDP 套接字在 IP 地址頭中設置服務類型或流量類字段。

int SO_LINGER = 0x0080:指定關閉時逗留的超時值。

int SO_TIMEOUT = 0x1006:設置阻塞 Socket 操作的超時值: ServerSocket.accept(); SocketInputStream.read(); DatagramSocket.receive(); 選項必須在進入阻塞操作前設置才能生效。

int SO_SNDBUF = 0x1001:設置傳出網絡 I/O 的平臺所使用的基礎緩沖區大小的提示。

int SO_RCVBUF = 0x1002:設置傳入網絡 I/O 的平臺所使用基礎緩沖區的大小的提示。

int SO_KEEPALIVE = 0x0008:為 TCP 套接字設置 keepalive 選項時

int SO_OOBINLINE = 0x1003:置 OOBINLINE 選項時,在套接字上接收的所有 TCP 緊急數據都將通過套接字輸入流接收。

上面只是簡單介紹了下(來源Java API),下面有對其中的某些的詳細講解,沒講到的后續如果用到會補上。

4.1 客戶端綁定端口

服務端綁定端口是可以理解的,因為要監聽指定的端口,但是客戶端為什么要綁定端口,說實話我覺得這么做的人有點2,或許有的網絡安全策略配置了端口訪出,使用戶只能使用指定的端口,那么這樣的配置也是挺2的,直接說就可以不要留面子。

當然首先要理解的是,如果沒有指定端口的話,Socket會自動選取一個可以用的端口,不用瞎操心的。

但是你非得指定一個端口也是可以的,做法如下,這時候就不能用Socket的構造方法了,要一步一步來:

// 要連接的服務端IP地址和端口

String host = "localhost";

int port = 55533;

// 與服務端建立連接

Socket socket = new Socket();

socket.bind(new InetSocketAddress(55534));

socket.connect(new InetSocketAddress(host, port));

這樣做就可以了,但是當這個程序執行完成以后,再次執行就會報,端口占用異常:

java.net.BindException: Address already in use: connect

明明上一個Socket已經關閉了,為什么再次使用還會說已經被占用了呢?如果你是用netstat 命令來查看端口的使用情況:

netstat -n|findstr "55533"

TCP 127.0.0.1:55534 127.0.0.1:55533 TIME_WAIT

就會發現端口的使用狀態為TIME_WAIT,說到這你需要有一點TCP連接的基本常識,建議看《》,這是其中的一點摘抄筆記,或許對理解有一些幫助。

簡單來說,當連接主動關閉后,端口狀態變為TIME_WAIT,其他程序依然不能使用這個端口,防止服務端因為超時重新發送的確認連接斷開對新連接的程序造成影響。

TIME_WAIT的時間一般有底層決定,一般是2分鐘,還有1分鐘和30秒的。

所以,客戶端不要綁定端口,不要綁定端口,不要綁定端口。

4.2?讀超時SO_TIMEOUT

讀超時這個屬性還是比較重要的,當Socket優化到最后的時候,往往一個Socket連接會一直用下去,那么當一端因為異常導致連接沒有關閉,另一方是不應該持續等下去的,所以應該設置一個讀取的超時時間,當超過指定的時間后,還沒有讀到數據,就假定這個連接無用,然后拋異常,捕獲異常后關閉連接就可以了,調用方法為:

public void setSoTimeout(int timeout)

throws SocketException

timeout - 指定的以毫秒為單位的超時值。設置0為持續等待下去。建議根據網絡環境和實際生產環境選擇。

這個選項設置的值將對以下操作有影響:

ServerSocket.accept()

SocketInputStream.read()

DatagramSocket.receive()

4.3 設置連接超時

這個連接超時和上面說的讀超時不一樣,讀超時是在建立連接以后,讀數據時使用的,而連接超時是在進行連接的時候,等待的時間。

4.4 判斷Socket是否可用

當需要判斷一個Socket是否可用的時候,不能簡簡單單判斷是否為null,是否關閉,下面給出一個比較全面的判斷Socket是否可用的表達式,這是根據Socket自身的一些狀態進行判斷的,它的狀態有:

bound:是否綁定

closed:是否關閉

connected:是否連接

shutIn:是否關閉輸入流

shutOut:是否關閉輸出流

socket != null && socket.isBound() && !socket.isClosed() && socket.isConnected()&& !socket.isInputShutdown() && !socket.isOutputShutdown()

建議如此使用,但這只是第一步,保證Socket自身的狀態是可用的,但是當連接正常創建后,上面的屬性如果不調用本方相應的方法是不會改變的,也就是說如果網絡斷開、服務器主動斷開,Java底層是不會檢測到連接斷開并改變Socket的狀態,所以,真實的檢測連接狀態還是得通過額外的手段,有兩種方式。

4.4.1 自定義心跳包

雙方需要約定,什么樣的消息屬于心跳包,什么樣的消息屬于正常消息,假設你看了上面的章節現在說就容易理解了,我們定義前兩個字節為消息的長度,那么我們就可以定義第3個字節為消息的屬性,可以指定一位為消息的類型,1為心跳,0為正常消息。那么要做的有如下:

客戶端發送心跳包

服務端獲取消息判斷是否是心跳包,若是丟棄

當客戶端發送心跳包失敗時,就可以斷定連接不可用

具體的編碼不再貼出,自己實現即可。

4.4.2 通過發送緊急數據

Socket自帶一種模式,那就是發送緊急數據,這有一個前提,那就是服務端的OOBINLINE不能設置為true,它的默認值是false。

OOBINLINE的true和false影響了什么:

對客戶端沒有影響

對服務端,如果設置為true,那么服務端將會捕獲緊急數據,這會對接收數據造成混淆,需要額外判斷

發送緊急數據通過調用Socket的方法:

socket.sendUrgentData(0);

發送數據任意即可,因為OOBINLINE為false的時候,服務端會丟棄掉緊急數據。

當發送緊急數據報錯以后,我們就會知道連接不通了。

4.4.3 真的需要判斷連接斷開嗎

通過上面的兩種方式已經可以判斷出連接是否可用,然后我們就可以進行后續操作,可是請大家認真考慮下面的問題:

發送心跳成功時確認連接可用,當再次發送消息時能保證連接還可用嗎?即便中間的間隔很短

如果連接不可用了,你會怎么做?重新建立連接再次發送數據?還是說單單只是記錄日志?

如果你打算重新建立連接,那么發送心跳包的意義何在?為何不在發送異常時再新建連接?

如果你認真考慮了上面的問題,那么你就會覺得發送心跳包完全是沒有必要的操作,通過發送心跳包來判斷連接是否可用是通過捕獲異常來判斷的。那么我們完全可以在發送消息報出IO異常的時候,在異常中重新發送一次即可,這兩種方式的編碼有什么不同呢,下面寫一寫偽代碼。

提前檢測連接是否可用:

//有一個連接中的socket

Socket socket=...

//要發送的數據

String data="";

try{

//發送心跳包或者緊急數據,來檢測連接的可用性

}catch (Excetption e){

//打印日志,并重連Socket

socket=new Socket(host,port);

}

socket.write(data);

直接發送數據,出異常后重新連接再次發送:

//有一個連接中的socket

Socket socket=...

//要發送的數據

String data="";

try{

socket.write(data);

}catch (Excetption e){

//打印日志,并重連Socket

socket=new Socket(host,port);

socket.write(data);

}

通過比較可以發現兩種方式的特點,現在簡單介紹下:

兩種方式均可實現連接斷開重新連接并發送

提前檢測,再每次發送消息的時候都要檢測,影響效率,占用帶寬

希望大家認真考慮,做出自己的選擇。

4.5 設置端口重用SO_REUSEADDR

首先,創建Socket時,默認是禁止的,設置true有什么作用呢,Java API中是這么介紹的:

關閉 TCP 連接時,該連接可能在關閉后的一段時間內保持超時狀態(通常稱為 TIME_WAIT 狀態或 2MSL 等待狀態)。對于使用已知套接字地址或端口的應用程序而言,如果存在處于超時狀態的連接(包括地址和端口),可能不能將套接字綁定到所需的 SocketAddress 上。

使用 bind(SocketAddress) 綁定套接字前啟用 SO_REUSEADDR 允許在上一個連接處于超時狀態時綁定套接字。

一般是用在綁定端口的時候使用,但是經過我的測試建議如下:

服務端綁定端口后,關閉服務端,重新啟動后不會提示端口占用

客戶端綁定端口后,關閉,即便設置ReuseAddress為true,即便能綁定端口,連接的時候還是會報端口占用異常

綜上所述,不建議綁定端口,也沒必要設置ReuseAddress,當然ReuseAddress的底層還是和硬件有關系的,或許在你的機器上測試結果和我不一樣,若是如此和平臺相關性差異這么大配置更是不建議使用了。

4.6 設置關閉等待SO_LINGER

Java API的介紹是:啟用/禁用具有指定逗留時間(以秒為單位)的 SO_LINGER。最大超時值是特定于平臺的。 該設置僅影響套接字關閉。

大家都是這么說的,當調用Socket的close方法后,沒有發送的數據將不再發送,設置這個值的話,Socket會等待指定的時間發送完數據包。說實話,經過我簡單的測試,對于一般數據量來說,幾十K左右,即便直接關閉Socket的連接,服務端也是可以收到數據的。

所以對于一般應用沒必要設置這個值,當數據量發送過大拋出異常時,再來設置這個值也不晚。那么到達逗留超時值時,套接字將通過 TCP RST 強制性 關閉。啟用超時值為零的選項將立即強制關閉。如果指定的超時值大于 65,535,則其將被減少到 65,535。

4.7 設置發送延遲策略TCP_NODELAY

一般來說當客戶端想服務器發送數據的時候,會根據當前數據量來決定是否發送,如果數據量過小,那么系統將會根據Nagle 算法(暫時還沒研究),來決定發送包的合并,也就是說發送會有延遲,這在有時候是致命的,比如說對實時性要求很高的消息發送,在線對戰游戲等,即便數據量很小也要求立即發送,如果稍有延遲就會感覺到卡頓,默認情況下Nagle 算法是開啟的,所以如果不打算有延遲,最好關閉它。這樣一旦有數據將會立即發送而不會寫入緩沖區。

但是對延遲要求不是特別高下還是可以使用的,還是可以提升網絡傳輸效率的。

4.8 設置輸出輸出緩沖區大小SO_RCVBUF/SO_SNDBUF

SO_SNDBUF:發送緩沖

SO_RCVBUF:接收緩沖

默認都是8K,如果有需要可以修改,通過相應的set方法。不建議修改的太小,設置太小數據傳輸將過于頻繁。太大了將會造成消息停留。

不過我對這個經過測試后有以下結論:

當數據填滿緩沖區時,一定會發送

當數據沒有填滿緩沖區時也會發送,這個算法還是上面說的Nagle 算法

4.9 設置保持連接存活SO_KEEPALIVE

雖然說當設置連接連接的讀超時為0,即無限等待時,Socket不會被主動關閉,但是總會有莫名其妙的軟件來檢測你的連接是否有數據發送,長時間沒有數據傳輸的連接會被它們關閉掉。

因此通過設置這個選項為true,可以有如下效果:當2個小時(具體的實現而不同)內在任意方向上都沒有跨越套接字交換數據,則 TCP 會自動發送一個保持存活的消息到對面。將會有以下三種響應:

返回期望的ACK。那么不通知應用程序(因為一切正常),2 小時的不活動時間過后,TCP 將發送另一個探頭。

對面返回RST,表明對面掛了,但是又好了,Socket依然要關閉

沒有響應,說明對面掛了,這時候關閉Socket

所以對于構建長時間連接的Socket還是配置上SO_KEEPALIVE比較好。

4.10 異常:java.net.SocketException: Connection reset by peer

這個異常的含義是,我正在寫數據的時候,你把連接給關閉了。這個異常在一般正常的編碼是不會出現這個異常的,因為用戶通常會判斷是否讀到流的末尾了,讀到末尾才會進行關閉操作,如果出現這個異常,那就檢查一下判斷是否讀到流的末尾邏輯是否正確。

五、關于Socket的理解

5.1 Socket和TCP/IP

最近在看《TCP/IP詳解 卷1:協議》,關于TCP/IP我覺得講解的非常詳細,我做了點摘抄,可以大致看看,非常建議大家閱讀下這本書。通常TCP/IP分為四層:

也就是說Socket實際上是歸屬于應用層,使用的事運輸層的TCP,使用SocketServer監聽的端口,也是可以被Telnet連接的。可以看下面兩行代碼:

ServerSocket server = new ServerSocket(port);

Socket socket = server.accept();

在什么情況獲取到這個Socket呢,通過理論加測試,結論是在三次握手操作后,系統才會將這個連接交給應用層,ServerSocket 才知道有一個連接過來了。那么系統當接收到一個TCP連接請求后,如果上層還沒有接受它(假如SocketServer循環處理Socket,一次一個),那么系統將緩存這個連接請求,既然是緩存那么就是有限度的,書上介紹的是緩存3個,但是經過我的本機測試是50個,也就是說,系統將會為應用層的Socket緩存50和TCP連接(這是和系統底層有關系的),當超過指定數量后,系統將會拒絕連接。

假如緩存的TCP連接請求發送來數據,那么系統也會緩存這些數據,等待SocketServer獲得這個連接的時候一并交給它,這個會在后期學習NIO進行詳解。

換句話說,系統接收TCP連接請求放入緩存隊列,而SocketServer從緩存隊列獲取Socket。

而上面例子中的為了讓服務端知道發送完消息的,關閉輸出流的操作:

socket.shutdownOutput();

其實是對應著四次揮手的第一次:

也就是上面說的主動關閉,FIN_WAIT_1,這樣服務端就能得知客戶端發送完消息,此時服務端可以選擇關閉連接,也可以選擇發送數據后關閉連接:

這就是TCP所說的半關閉。其實很多知識都是想通的,多學點基礎知識還是有必要的。

5.2 Socket和RMI

RMI基礎知識就不多介紹了(后續會寫,敬請期待),現在假定你對RMI有所了解,那么一般就會對這兩種技術有所比較?;蛘哒f在應用的時候就會想用那種技術比較好。

RMI全稱:Remote Method Invocation-遠程方法調用,通過名字其實就能對這種技術有個初步的了解。現在我就簡單說說我對這兩種技術的想法。

這個待寫,等我寫完RMI博客的時候補上,那時候會更細致的了解下。

5.3 DatagramSocket與Socket

這一段涉及到UDP,依然和上面一樣,后續會補上。

5.4?拆包和黏包

使用Socket通信的時候,或多或少都聽過拆包和黏包,如果沒聽過而去貿然編程那么偶爾就會碰到一些莫名其妙的問題,所有有這方面的知識還是比較重要的,至少知道怎么發生,怎么防范。

現在先簡單說明下拆包和黏包的原因:

拆包:當一次發送(Socket)的數據量過大,而底層(TCP/IP)不支持一次發送那么大的數據量,則會發生拆包現象。

黏包:當在短時間內發送(Socket)很多數據量小的包時,底層(TCP/IP)會根據一定的算法(指Nagle)把一些包合作為一個包發送。

首先可以明確的是,大部分情況下我們是不希望發生拆包和黏包的(如果希望發生,什么都去做即可),那么怎么去避免呢,下面進行詳解?

5.4.1 黏包

首先我們應該正確看待黏包,黏包實際上是對網絡通信的一種優化,假如說上層只發送一個字節數據,而底層卻發送了41個字節,其中20字節的I P首部、 20字節的T C P首部和1個字節的數據,而且發送完后還需要確認,這么做浪費了帶寬,量大時還會造成網絡擁堵。當然它還是有一定的缺點的,就是因為它會合并一些包會導致數據不能立即發送出去,會造成延遲,如果能接受(一般延遲為200ms),那么還是不建議關閉這種優化,如果因為黏包會造成業務上的錯誤,那么請改正你的服務端讀取算法(協議),因為即便不發生黏包,在服務端緩存區也可能會合并起來一起提交給上層,推薦使用長度+類型+數據模式。

如果不希望發生黏包,那么通過禁用TCP_NODELAY即可,Socket中也有相應的方法:

void setTcpNoDelay(boolean on)

通過設置為true即可防止在發送的時候黏包,但是當發送的速率大于讀取的速率時,在服務端也會發生黏包,即因服務端讀取過慢,導致它一次可能讀取多個包。

5.4.2 拆包

這個問題應該引起重視,在TCP/IP詳解中說過:最大報文段長度(MSS)表示TCP傳往另一端的最大塊數據的長度。當一個連接建立時,連接的雙方都要通告各自的 MSS。客戶端會盡量滿足服務端的要求且不能大于服務端的MSS值,當沒有協商時,會使用值536字節。雖然看起來MSS值越大越好,但是考慮到一些其他情況,這個值還是不太好確定,具體詳見《TCP/IP詳解 卷1:協議》。

如何應對拆包,其實在上面2.3節已經介紹過了,那就是如何表明發送完一條消息了,對于已知數據長度的模式,可以構造相同大小的數組,循環讀取,示例代碼如下:

int length=1024;//這個是讀取的到數據長度,現假定1024

byte[] data=new byte[1024];

int readLength=0;

while(readLength

int read = inputStream.read(data, readLength, length-readLength);

readLength+=read;

}

這樣當循環結束后,就能讀取到完整的一條數據,而不需要考慮拆包了。

總結

以上是生活随笔為你收集整理的java socket 重连复用_Java Socket编程基础及深入讲解(示例代码)的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。

久久久国产一区二区三区 | 欧美日本在线视频 | 日韩欧美aaa| 二区精品视频 | 婷婷六月色 | 久久精品视频在线看 | 亚洲女同ⅹxx女同tv | 玖玖在线观看视频 | 精品国产91亚洲一区二区三区www | 色噜噜在线观看视频 | 香蕉影视在线观看 | 日日日爽爽爽 | 91亚洲精品在线观看 | 国产成人久久av免费高清密臂 | 成年人看片网站 | 国产精品久久久久久久久久免费 | 色干综合 | 久久国产精品一区二区三区 | 国产精品美女久久久久aⅴ 干干夜夜 | 久久xxxx| 亚洲高清在线视频 | 亚洲日本在线视频观看 | 日韩免费一区二区三区 | 久久免费国产电影 | 91手机视频| 97成人在线观看 | 色婷婷av一区二 | 国产精品破处视频 | 91精品久久久久久综合乱菊 | 成人av在线影视 | 亚洲 中文 欧美 日韩vr 在线 | 亚洲精品9 | 免费在线观看成人 | 欧美另类视频 | 国产精品福利在线 | 在线观看视频一区二区三区 | 欧美日韩精品二区第二页 | 中文字幕无吗 | 久久精品在线视频 | 国产免费观看久久 | 国产a国产 | 国产成人一级 | 天天鲁一鲁摸一摸爽一爽 | 人人dvd | av亚洲产国偷v产偷v自拍小说 | 亚洲日韩精品欧美一区二区 | 99热官网 | 成人免费网视频 | av免费在线观看1 | 偷拍福利视频一区二区三区 | 青青河边草免费观看完整版高清 | 国产一区在线免费观看视频 | av片一区二区| 天天射成人 | 欧美少妇xxx | 一级做a爱片性色毛片www | 亚洲区色 | 亚洲精品午夜一区人人爽 | 99re8这里有精品热视频免费 | 婷婷深爱五月 | 日韩免费观看一区二区 | 久草在线观看视频免费 | 久久国产精品免费观看 | 在线视频成人 | 免费v片| 深夜免费福利视频 | 免费在线成人av电影 | 国产又黄又硬又爽 | 99tvdz@gmail.com | 国色天香第二季 | 美女视频黄在线 | 日韩av在线看 | 在线观看一区二区视频 | 亚洲国产99 | 丁香花在线视频观看免费 | 永久精品视频 | 久久久久久国产一区二区三区 | 日韩精品一区二区三区水蜜桃 | 免费成人看片 | 伊人网综合在线观看 | 国产亚洲精品成人av久久影院 | 伊人六月| 亚洲第一色 | 亚洲毛片在线观看. | 欧美最猛性xxxxx亚洲精品 | 最新久久免费视频 | 超碰97在线人人 | 麻豆成人精品 | 狠狠躁18三区二区一区ai明星 | 中文字幕超清在线免费 | 最近中文字幕在线中文高清版 | 在线中文视频 | 亚洲精品美女久久久久网站 | 中文字幕在线视频免费播放 | 久久综合日 | 西西www444| 国产亚洲一级高清 | 天天干干 | 四虎免费av | 中文字幕视频三区 | 99热这里有精品 | 日韩在线中文字幕 | 久久久影院官网 | 911久久香蕉国产线看观看 | 国产高清视频在线 | 日韩在线字幕 | 午夜精品一区二区三区可下载 | 中文字幕丰满人伦在线 | 久久久伊人网 | 亚洲国产精品久久久久婷婷884 | 欧美一级视频免费看 | 九九热视频在线免费观看 | 亚洲一区尤物 | 四虎小视频 | 国产不卡高清 | 色综合久久88 | 4438全国亚洲精品在线观看视频 | 国产成人一区二区三区免费看 | 亚洲综合色av | www.com久久| 美女视频一区 | 这里只有精品视频在线观看 | 亚洲免费专区 | av超碰在线观看 | 在线成人观看 | 91入口在线观看 | 久久视频中文字幕 | 日韩在线电影一区 | 香蕉在线影院 | 99精品小视频 | 亚洲国产一二三 | av综合站 | 国产日韩中文字幕在线 | 在线日韩 | 网站在线观看你们懂的 | 欧美三级高清 | 欧美一区二区日韩一区二区 | 少妇av片 | 国产一区二区三区久久久 | 国产一区自拍视频 | 6699私人影院| 99精品在线视频播放 | 91丨九色丨91啦蝌蚪老版 | 91精品第一页 | 日韩在线不卡视频 | 国产在线999 | 欧美 日韩 国产 中文字幕 | 日日躁天天躁 | 日韩爱爱网站 | 成人全视频免费观看在线看 | 欧美a级在线免费观看 | 日韩欧美91| 久久久精品影视 | 国产在线观看你懂得 | 亚洲综合视频在线 | 国产中文 | 日韩中文在线观看 | 国产欧美综合在线观看 | 亚洲丁香久久久 | 色99视频 | 亚洲色图27p| 亚洲视频资源在线 | 日韩免费区 | 国产精品一区二区三区四区在线观看 | 欧美性色综合 | 激情网在线视频 | 中日韩男男gay无套 日韩精品一区二区三区高清免费 | 免费看三片 | 国产三级精品三级在线观看 | 四虎在线免费 | 综合影视 | 欧美一级看片 | 狠狠网站 | 国产麻豆果冻传媒在线观看 | 中文字幕乱码一区二区 | 国产专区在线视频 | 97av在线视频免费播放 | 国产69精品久久久久久 | 一区二区三区在线免费播放 | 一级片视频在线 | 在线国产中文 | 亚洲精品久久久久中文字幕二区 | 91精品免费在线观看 | 91精品在线视频观看 | 欧美另类色图 | а中文在线天堂 | 三级动图 | 五月婷婷综合色拍 | 九九热免费视频在线观看 | 免费高清看电视网站 | 亚洲九九精品 | 国产91在| 视频在线观看入口黄最新永久免费国产 | 五月天综合色 | 国产探花视频在线播放 | 久热av | 国产中文字幕在线视频 | 国产精品久久久久久久久软件 | 亚洲91精品| www.狠狠操 | 日韩一级网站 | 不卡av免费在线观看 | 91丨九色丨国产在线观看 | 夜夜干夜夜 | 欧美 日韩 性 | 一二区精品 | 国产一线二线三线性视频 | 在线观看国产一区 | 五月天中文字幕 | 亚洲国产一区二区精品专区 | 久草在线手机观看 | 午夜久久久久久久久久久 | 色久综合 | 国产黄色精品在线 | 四虎成人免费影院 | 九九热国产视频 | 国产精品网站一区二区三区 | 色五月情 | 日本性xxxxx 亚洲精品午夜久久久 | 国内精品在线看 | 国产精品女人网站 | 探花视频在线观看+在线播放 | 国产裸体无遮挡 | 狠狠色综合欧美激情 | 免费精品国产 | 亚洲国产美女精品久久久久∴ | 久久成人黄色 | 色婷婷国产 | www亚洲精品 | 国产美女黄网站免费 | 国产午夜三级一区二区三桃花影视 | 91精品婷婷国产综合久久蝌蚪 | 九九九在线 | 久久国产精品99精国产 | 免费男女羞羞的视频网站中文字幕 | 国产视频97 | 欧美日韩另类视频 | 国产精品二区三区 | 深爱激情综合 | 四虎影视成人 | 一区二区三区在线观看 | 美女视频黄在线 | 99热在线国产精品 | 中文字幕免费高清在线观看 | 国产精品久久一区二区三区不卡 | 国产xxxx| 波多野结衣一区二区三区中文字幕 | 国内精自线一二区永久 | 色在线中文字幕 | 一本一道波多野毛片中文在线 | 天天操天天操天天 | 美女天天操 | 日本精品久久久一区二区三区 | 在线观看视频一区二区 | 成人性生爱a∨ | 成人av免费 | 成人资源网 | 欧美日韩国产一二三区 | 亚洲桃花综合 | 欧美极品xxx | 国产精品一区免费看8c0m | 日韩中文幕| 久久精品精品电影网 | 又黄又爽的视频在线观看网站 | 亚洲午夜精品福利 | 综合精品久久久 | 波多野结衣在线播放一区 | 不卡的一区二区三区 | 97国产在线视频 | 成年人电影毛片 | 黄色亚洲大片免费在线观看 | 久草在线免费色站 | 最近中文国产在线视频 | 久久精品国产久精国产 | 亚洲欧美国产日韩在线观看 | 国产一区免费观看 | 日本精品视频一区 | 久久黄色片 | 天天操天天色天天射 | 在线观看视频精品 | 91亚洲激情 | 瑞典xxxx性hd极品 | 欧美精品久久人人躁人人爽 | 中文高清av | www.人人草 | 亚州性色 | bbb搡bbb爽爽爽 | 青青网视频| 久久久久五月 | 国产午夜精品一区二区三区欧美 | 麻豆影视在线播放 | 91精品国产一区二区在线观看 | av+在线播放在线播放 | 黄色成人影视 | 国产婷婷视频在线 | 色91av | 一级性视频 | 亚洲色视频 | 亚洲电影在线看 | 男女免费视频观看 | 又黄又爽又无遮挡的视频 | 五月婷婷影视 | 亚洲综合成人婷婷小说 | 国产精品久久久久久久久费观看 | 亚洲 中文 在线 精品 | 一级黄色免费网站 | 精品国产视频一区 | 日韩中文字幕网站 | 午夜精品99久久免费 | 久久午夜影院 | 最新国产精品视频 | 五月综合激情 | 久久久国产一区二区 | 天天干天天插 | 最新中文在线视频 | 国产精品一区二区免费视频 | 最新av在线播放 | 色视频网页| 欧美精品一区二区在线观看 | 黄色天堂在线观看 | 四虎国产精品成人免费影视 | 欧美一二三专区 | 国产精品一区一区三区 | av成人免费 | 三级黄色理论片 | 国产精品亚| 免费看一级特黄a大片 | 欧美精品九九 | 色综合天天狠狠 | 久久亚洲欧美 | 91精品在线播放 | 国产成人精品在线 | 正在播放国产一区 | 中国一级片在线 | 欧美一级电影免费观看 | 亚洲免费精品视频 | 亚洲人成免费 | 国产精品久久久久久麻豆一区 | 精品一区二区三区香蕉蜜桃 | 欧美日韩国产综合一区二区 | 国产精品美女久久久久久久 | 99视频国产精品 | 国产一区二区精品 | 国产91aaa| 亚洲精品国产精品国自产观看 | 国产一级电影 | 国产资源网站 | 亚洲美女精品视频 | 人人艹视频 | 日日日日日 | 久久久久免费精品视频 | 成人免费观看网站 | 麻豆成人网 | 91丨九色丨高潮丰满 | 日日夜夜爱 | 狠狠狠色丁香综合久久天下网 | 91精品久久久久久久久 | 久久免费福利视频 | 波多野结衣电影久久 | 婷婷久久网站 | 免费在线黄 | 国产一二三区av | 中文字幕av在线不卡 | 国产精品一码二码三码在线 | 国产福利中文字幕 | 亚洲精品1区2区3区 超碰成人网 | 国产精品午夜在线观看 | 国产精品99精品久久免费 | 在线观看国产永久免费视频 | 狠狠色丁香婷综合久久 | 国产精品久久久久久99 | 欧美性生活免费看 | 韩日三级av | 777奇米四色| 五月天丁香 | 国产69精品久久app免费版 | 日韩精品一区二区在线观看视频 | 一区二区三区精品在线 | 久久久久久久久久久网 | 精品爱爱 | 丰满少妇在线观看网站 | av免费观看网站 | 99在线高清视频在线播放 | 在线观看中文字幕dvd播放 | 午夜精品一区二区三区视频免费看 | 97电影院在线观看 | 久久久久久久久亚洲精品 | 青青久草在线视频 | 91视频 - 114av | 免费看一级黄色 | 五月婷婷丁香网 | 九九在线国产视频 | 99综合电影在线视频 | 日本中文字幕网站 | 在线观看免费高清视频大全追剧 | 日韩欧美成 | 在线观看中文字幕av | 一区精品在线 | 国产精品一区二区三区四 | 免费观看的黄色片 | av在线一级 | 久久夜色精品国产欧美一区麻豆 | 五月婷婷丁香网 | av在线免费观看不卡 | 在线观看中文字幕一区二区 | 久久精品一区二区三 | 国产精品久久久久免费观看 | 揉bbb玩bbb少妇bbb | 日韩欧美视频在线播放 | 久久综合给合久久狠狠色 | 97电影网站| 黄色a视频 | 在线看污网站 | 久草久视频 | 国产成人av一区二区三区在线观看 | 综合精品久久久 | 三级小视频在线观看 | 国产一级片播放 | 日本公妇在线观看高清 | 狠狠gao | 美女在线国产 | 97精品在线观看 | 国产视频999 | 成人免费在线视频观看 | 五月婷婷综合在线观看 | 国内久久久 | 日韩在线免费视频观看 | 国产精品久久久久av | 国产精品入口麻豆 | 中文字幕中文字幕 | 日韩精品播放 | 国产三级国产精品国产专区50 | 91精品免费| 国产精品视频在线看 | aⅴ视频在线 | 中文字幕免费高清av | 国产专区精品视频 | 一级理论片在线观看 | 99久久精品免费一区 | 色婷婷六月 | 人人爱爱 | 日韩成人中文字幕 | 日韩免费观看一区二区 | 日韩女同av | 国产淫片免费看 | 91精品国产麻豆国产自产影视 | 91一区啪爱嗯打偷拍欧美 | 久久有精品 | 中国一级片免费看 | 九色精品免费永久在线 | 不卡的av中文字幕 | 国产亚洲精品久久久久久大师 | av电影一区 | 欧美一区二区免费在线观看 | 国产男女无遮挡猛进猛出在线观看 | 成片免费| 麻豆视频免费在线播放 | 久久国产精品免费视频 | 人人爽人人爽人人爽人人爽 | 国产情侣一区 | 日韩专区中文字幕 | 欧美一进一出抽搐大尺度视频 | 免费黄色网止 | 国产精品露脸在线 | 69人人| 人人爽人人干 | 国产精品视频永久免费播放 | 极品久久久久 | 91亚洲精品乱码久久久久久蜜桃 | 91在线视频观看免费 | 91在线www | 精品国产一二三四区 | 九九视频网 | 一级淫片在线观看 | 免费在线国产 | 国产中文字幕精品 | 日韩a级免费视频 | a√天堂中文在线 | 热久久影视 | 久久免费视频6 | 国产视频2区 | 国产97在线视频 | 中文字幕免费中文 | 四虎国产精品永久在线国在线 | 国产一区电影在线观看 | 91日韩在线| 天天射天天做 | 久久综合加勒比 | 亚洲成av人片在线观看 | 日韩国产精品久久久久久亚洲 | 精一区二区| 免费福利小视频 | 国产精品v欧美精品v日韩 | 人人射人人爱 | 日韩午夜在线播放 | 国产视频 亚洲精品 | 日韩性xxxx | 欧美a级片免费看 | 黄色av成人在线 | 久久伊人婷婷 | 成人免费91 | 综合网天天 | 99视| 国产原创av在线 | 色婷婷在线视频 | 91精品啪在线观看国产线免费 | 欧美性生活大片 | 中文字幕免费在线 | 欧美日韩在线观看一区二区 | 日批网站免费观看 | 成年人毛片在线观看 | 中文字幕中文字幕在线中文字幕三区 | 欧美日韩一区二区三区免费视频 | 久久久久亚洲精品 | 97精品国产97久久久久久春色 | 国产精品专区在线观看 | 97超碰色偷偷| 在线观av| 最新91在线视频 | 中文字幕欧美日韩va免费视频 | 国产一级片免费播放 | 婷婷久久国产 | 美女免费黄网站 | 天天爱天天射 | 97热视频| 久久久精品国产免费观看同学 | 手机在线中文字幕 | 精品美女久久 | 色婷婷a | 国产婷婷精品 | a电影在线观看 | 玖玖在线观看视频 | 国产96av | 在线观看91久久久久久 | 一级电影免费在线观看 | 免费精品久久久 | 玖玖999| 午夜av在线 | 久久久精品网站 | 国产高清av免费在线观看 | 97超碰免费 | 欧美日韩伦理在线 | 成人黄色片免费看 | 久久国产成人午夜av影院宅 | www.狠狠操.com| 成人h在线播放 | 日日夜夜网站 | 亚洲国产精品久久久 | 国产精品一区二区在线看 | 91成人在线免费观看 | 四虎成人精品 | 国产热re99久久6国产精品 | 午夜精品久久久久久久久久久久 | 国产成人三级三级三级97 | 伊人黄色网 | 成人免费在线视频 | 日韩亚洲国产精品 | 国产精品午夜在线观看 | 亚洲国产黄色片 | 中文字幕视频一区二区 | 国产精品美女久久久久久久久 | 丝袜护士aⅴ在线白丝护士 天天综合精品 | www看片网站 | 天天干天天干 | 久久在线看 | 欧美另类亚洲 | ,午夜性刺激免费看视频 | 亚洲视频,欧洲视频 | 日韩欧美黄色网址 | 久久久久欠精品国产毛片国产毛生 | 99综合电影在线视频 | 激情久久小说 | 色视频在线免费观看 | 中文字幕国产精品 | 日日干干| 国内精品久久久久久久影视简单 | 国产日韩欧美在线 | 久久久久久久久久久黄色 | 成人av网站在线观看 | 国产视频在线观看免费 | 久久理论电影 | 色婷婷精品大在线视频 | 亚洲激情一区二区三区 | 久久久久免费电影 | 看av免费网站 | 99久久99久久精品 | 中文字幕日韩一区二区三区不卡 | 日韩欧美精品一区 | 一区在线观看视频 | 中文字幕一区二区在线观看 | 久久精品国产一区二区电影 | 香蕉视频在线看 | 日韩av电影免费观看 | 国产69精品久久99的直播节目 | 国产精品久久久久久久久久久久久久 | 国产精品毛片久久 | 国产精品视频久久久 | 成人 亚洲 欧美 | 黄色毛片视频免费观看中文 | 成人黄色在线视频 | 狠狠干美女 | 全黄网站 | 欧美激情精品久久 | 91大神精品视频在线观看 | 中文字幕乱在线伦视频中文字幕乱码在线 | 亚洲精品在线视频网站 | 国产在线精品国自产拍影院 | 亚洲精品tv久久久久久久久久 | 精品亚洲免费视频 | 色吧久久 | 黄色av大片| 久草免费电影 | 五月天婷亚洲天综合网鲁鲁鲁 | a视频在线观看免费 | 免费观看性生活大片 | 91免费观看国产 | 五月婷婷视频 | 欧美性一级观看 | 久草精品网 | 国产a国产a国产a | 国产精品久久久久免费a∨ 欧美一级性生活片 | 久久亚洲综合国产精品99麻豆的功能介绍 | av成人黄色 | 国产视频不卡一区 | 亚洲精区二区三区四区麻豆 | av软件在线观看 | 国产欧美日韩精品一区二区免费 | 精品久久久久久久久久久院品网 | 午夜久久成人 | 国产99久久久精品 | 中文字幕国产精品 | 日韩欧美在线播放 | 日韩av伦理片| 999日韩 | 久久天天躁夜夜躁狠狠躁2022 | 免费在线观看av网站 | 激情五月色播五月 | 欧美aaa视频 | 中文字幕一区二区在线播放 | 黄色a在线观看 | 国产护士hd高朝护士1 | 亚洲一区视频免费观看 | 片黄色毛片黄色毛片 | 五月婷久| 免费观看第二部31集 | 草久草久| 黄在线免费看 | 国产xxxxx在线观看 | 亚洲福利精品 | 久久久久久久久久久网站 | 91精品电影 | 最近中文字幕高清字幕免费mv | 高清av中文字幕 | 人人藻人人澡人人爽 | 免费在线观看一区 | 色视频在线免费 | 久精品在线观看 | 国产精品一区免费观看 | 中文字幕精品三级久久久 | 日韩在线电影观看 | 伊人伊成久久人综合网小说 | a色视频 | 18网站在线观看 | 国产黄色美女 | 欧美韩国日本在线观看 | 国产成人在线看 | 精品一区二区在线观看 | 免费在线观看午夜视频 | 免费男女羞羞的视频网站中文字幕 | 亚洲国产精品久久久久婷婷884 | 国产高清免费av | 粉嫩av一区二区三区四区在线观看 | 日韩欧美在线一区 | 久久久电影网站 | 午夜国产一区二区三区四区 | 五月婷婷在线视频观看 | 欧美久草视频 | 在线观看精品一区 | 久草线| 女人久久久久 | 精品欧美一区二区精品久久 | 在线免费中文字幕 | 中文字幕色站 | 免费看一级一片 | 国产精品久久久久久久久久久久午 | 国产午夜一区二区 | 91看片淫黄大片在线播放 | 在线观看视频免费大全 | 日韩在线视频二区 | 四虎影视成人精品国库在线观看 | 婷婷久久久| 国产精品久久久久久久久久久免费看 | 色吊丝在线永久观看最新版本 | 久久精品国产99国产 | 亚洲精品国偷自产在线99热 | 国产群p视频 | 日韩av中文| 中文字幕在线观看视频一区二区三区 | 玖玖国产精品视频 | 玖玖国产精品视频 | 最新真实国产在线视频 | 日韩国产精品一区 | 欧美夫妻性生活电影 | 特级西西444www大精品视频免费看 | 国产小视频在线观看免费 | 深爱婷婷激情 | 天天做天天爱夜夜爽 | 在线观看视频一区二区三区 | 日韩视频在线一区 | 久草在线免 | av在线影片 | 人人狠狠综合久久亚洲 | 丁香视频五月 | 91丨九色丨丝袜 | 日韩1级片| 91丨九色丨首页 | 日韩av在线看 | 人人狠 | 日日骑| 欧美日韩不卡一区 | 日韩高清免费观看 | 午夜电影久久久 | 伊人在线视频 | 成人在线观看av | 日韩精品久久一区二区 | 九九综合久久 | 久黄色| 国产精品久久久久久久久久久久午夜 | 狠狠的操你 | 特黄一级毛片 | 91视频 - v11av | 日韩精品五月天 | 久久五月精品 | 一区二区三区日韩在线 | 成人全视频免费观看在线看 | 麻豆传媒视频在线免费观看 | 国产成人精品久久二区二区 | 国产视频欧美视频 | 天天色天天干天天色 | 91精品久久久久久综合乱菊 | 国产精品系列在线播放 | 91精品一区二区三区蜜臀 | 5月丁香婷婷综合 | 国产精品久久久 | 丁香花在线视频观看免费 | 麻豆久久久 | 亚洲精品天天 | 久久情侣偷拍 | 深夜国产福利 | 97超碰在线久草超碰在线观看 | 国产看片免费 | 亚洲色图美腿丝袜 | 欧美做受69 | 婷婷5月色 | 国产超碰97 | 人人爽爽人人 | 免费的国产精品 | 免费观看一级视频 | 在线观看日本韩国电影 | 新版资源中文在线观看 | 狠狠的干狠狠的操 | 亚洲一区黄色 | 久久伊人爱| 欧美成年人在线视频 | 国产夫妻性生活自拍 | 丁香亚洲| 中文字幕之中文字幕 | 人人爱人人做人人爽 | 日韩精品一区二区三区在线视频 | 久久国产精品系列 | 中文字幕成人网 | 91精品国产一区 | 成人中文字幕av | 91片网 | 久久免费视频一区 | 一区二区久久久久 | 国产黄色免费 | 日本激情视频中文字幕 | 久久久精品小视频 | 黄色软件大全网站 | 91精品爽啪蜜夜国产在线播放 | 一级片视频免费观看 | 久久久久欠精品国产毛片国产毛生 | 欧美日韩电影在线播放 | 99热免费在线 | 亚洲国产中文在线观看 | 久久久久久国产精品免费 | 日韩精品一区二区三区外面 | 国产成人精品午夜在线播放 | 国产99久久99热这里精品5 | 免费看一级黄色 | 天天干天天摸天天操 | 久久久精品欧美 | 久久久久国产精品午夜一区 | 天堂av免费观看 | 中文字幕一区二区三区乱码在线 | 久久久香蕉视频 | 国产91丝袜在线播放动漫 | 美女免费黄视频网站 | 国产一区精品在线 | av观看免费在线 | 五月天久久久 | 高清av网 | 欧美日高清视频 | 亚洲成人av电影在线 | 中文字幕在线不卡国产视频 | 精品国产网址 | 亚洲精品久久久久中文字幕m男 | 色播99| 亚洲91中文字幕无线码三区 | 日本中文字幕高清 | 人人看人人做人人澡 | 九九热在线精品 | 免费观看一级成人毛片 | 精品国产aⅴ一区二区三区 在线直播av | 欧美日韩视频在线观看免费 | 亚洲国产精久久久久久久 | 永久免费精品视频网站 | 97日日碰人人模人人澡分享吧 | 国产午夜精品福利视频 | 国产人成免费视频 | 亚洲婷久久| 久久久在线 | 欧美日韩性生活 | 天天射色综合 | 精品一区二区亚洲 | 狠狠做六月爱婷婷综合aⅴ 日本高清免费中文字幕 | 日韩av一区二区在线播放 | 一区二区三区视频 | 久草9视频 | 欧美a影视| 日韩av在线不卡 | 黄色最新网址 | 中文字幕 国产视频 | 视频二区在线视频 | 欧美日韩伦理在线 | 九九涩涩av台湾日本热热 | 成人va视频| 色狠狠干 | 成人av免费网站 | 伊人中文网 | 四虎影视久久久 | 亚洲精品美女久久17c | 国产一区二区午夜 | 色综合天天天天做夜夜夜夜做 | 久久综合国产伦精品免费 | 黄色一级免费网站 | 久久香蕉电影网 | 成全免费观看视频 | 国产精品永久免费在线 | 国产高清中文字幕 | 999视频在线播放 | 91av在线视频免费观看 | 一区二区三区国 | 国产中文字幕av | av成人动漫| 欧美激情视频在线观看免费 | 久久婷婷激情 | 91九色视频观看 | 天天色综合1 | 午夜久久美女 | 婷婷网在线 | 欧美日本不卡视频 | 91av超碰| 视频一区在线免费观看 | 日本公妇色中文字幕 | 黄色看片| 国产成人精品一区二区三区网站观看 | 99国产精品一区 | 亚洲人视频在线 | 国产精品久久久久高潮 | 欧美精品天堂 | 久久精品一二三区白丝高潮 | 久久高清 | 国产精品久久久久四虎 | 日本黄色免费在线观看 | 中国一级片在线播放 | 成人免费91 | 天天综合入口 | 亚洲黄色小说网 | 97在线视频免费 | 免费av网站在线 | 国产高清在线不卡 | 在线看日韩av | 91久色蝌蚪| 国产日韩欧美精品在线观看 | 91传媒免费在线观看 | 久久久久久久久爱 | 欧美日本高清视频 | 国产精品免费看久久久8精臀av | 这里只有精品视频在线观看 | 国产精品第十页 | 婷婷伊人综合亚洲综合网 | 九九九视频在线 | 欧美精品久久久久久久久久久 | 国产黑丝袜在线 | 在线看污网站 | 亚洲日韩欧美一区二区在线 | 日本中文乱码卡一卡二新区 | 日韩免费一二三区 | 少妇bbw搡bbbb搡bbb | 在线看片中文字幕 | 亚洲精品美女免费 | 亚洲精品在线网站 | 国产精品麻豆欧美日韩ww | 久久手机免费观看 | 日日夜夜骑| 伊色综合久久之综合久久 | 国产亚洲欧洲 | 久久天天操 | 天堂av网站| 亚洲va在线va天堂 | 亚州精品一二三区 | 亚洲女人av | 国产片网站 | 18国产精品白浆在线观看免费 | 成人a视频 | 久久久在线视频 | 亚洲成av人片在线观看香蕉 | 中文字幕网址 | 婷婷综合av | 成人一区二区在线观看 | 免费男女羞羞的视频网站中文字幕 | 97成人在线免费视频 | 日本韩国在线不卡 | www操操| 99久久精品国产一区二区成人 | 欧美视频在线二区 | 久久免费国产精品 | 激情欧美xxxx | 成人免费毛片aaaaaa片 | 免费成人av网站 | 欧美日韩天堂 | 日韩高清一区 | 久久综合久久久久88 | 九九在线精品视频 | 黄色电影网站在线观看 | 免费看片黄色 | 日韩专区 在线 | 亚洲免费国产视频 | 中文字幕免费高清在线观看 | 成人福利在线观看 | 亚洲综合色激情五月 | 国产视频资源 | 美女网站视频免费都是黄 | 最近中文字幕高清字幕免费mv | 欧美一区二区三区在线观看 | 热九九精品| 五月激情五月激情 | 日韩天堂网 | 亚洲最新在线视频 | 国产特级毛片aaaaaa | 97精品国产一二三产区 | 国产在线高清视频 | 99久久国产免费免费 | 婷婷丁香花 | 亚洲精品乱码久久久久v最新版 | 中文字幕色婷婷在线视频 | 黄色a在线观看 | 2022久久国产露脸精品国产 | av一区二区三区在线 | 99爱精品视频 | 免费精品久久久 | 日韩免费在线观看视频 | 激情小说网站亚洲综合网 | 日本性生活免费看 | 在线观看免费版高清版 | 国产精品一区二区久久久 | 日韩在线免费不卡 | 亚洲 欧美 变态 国产 另类 | 欧美精品亚洲精品日韩精品 | 欧美另类69 | 国产精品久久在线 | 中文字幕人成不卡一区 | 亚洲精品国偷自产在线91正片 | 91成人网页版 | 精品在线观看视频 | 8090yy亚洲精品久久 | 久久欧洲视频 | 五月天久久精品 | 夜夜爽88888免费视频4848 | 欧美成人按摩 | 久久私人影院 | 国产精品久久久一区二区三区网站 | www.夜夜夜| 国产麻豆精品久久 | 999精品视频| 欧美精品久久久久久久久久 | 少妇bbw搡bbbb搡bbb | av女优中文字幕在线观看 | 亚洲美女免费精品视频在线观看 | 久久精品专区 | 日本最新高清不卡中文字幕 | 久久婷婷亚洲 | 日韩欧美精品在线 | 亚洲成人网av | av综合在线观看 | 午夜国产一区二区 |