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

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁(yè) > 编程资源 > 编程问答 >内容正文

编程问答

完成聊天室的私聊功能

發(fā)布時(shí)間:2023/12/10 编程问答 36 豆豆
生活随笔 收集整理的這篇文章主要介紹了 完成聊天室的私聊功能 小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

1 完成聊天室的私聊功能

完成聊天室私聊功能。私聊功能是指,客戶端之間可以實(shí)現(xiàn)一對(duì)一的聊天。

服務(wù)器端程序啟動(dòng)后,將等待客戶端連接,界面效果如圖-1所示:

圖-1

客戶端程序運(yùn)行時(shí),需要用戶先輸入昵稱。用戶輸入昵稱之后,提示用戶可以開始聊天。界面效果如圖-2所示:

圖-2

另一個(gè)客戶端運(yùn)行起來后,也需要輸入昵稱,界面效果如圖-3所示:

圖-3

此時(shí),其他運(yùn)行中的客戶端會(huì)收到昵稱為“jerry”的客戶端上線的消息。比如,之前運(yùn)行起來的客戶端“mary”的界面效果如圖-4所示:

圖-4

其他客戶端可以通過輸入類似“\jerry:你好”這樣的字樣和昵稱為“jerry”的客戶端私聊。比如,昵稱為“mary”的客戶端可以輸入如圖-5所示的信息:

圖-5

注意:如果需要進(jìn)行私聊,必需使用“\昵稱:信息”的格式發(fā)送消息。其中,“\昵稱:”為固定格式,“昵稱”表示要私聊的客戶端的昵稱;“信息”表示需要發(fā)送的消息。例如:"\jerry:你好",表示發(fā)送消息“你好”給昵稱為“jerry”的客戶端。

昵稱為“jerry”的客戶端將接收到客戶端“mary”發(fā)來的信息,界面效果如圖-6所示:

圖-6

如果某客戶端程序停止運(yùn)行,其他客戶端程序可以接收到消息并顯示。例如,昵稱為“jerry”的客戶端停止運(yùn)行,昵稱為“mary”的客戶端的界面效果如圖-7所示:

圖-7

對(duì)于服務(wù)器端而言,只要有客戶端連接,就會(huì)在界面輸出提示信息。界面效果如圖-8所示:

圖-8

參考答案

實(shí)現(xiàn)此案例需要按照如下步驟進(jìn)行。

步驟一:創(chuàng)建客戶端類

新建名為com.tarena.homework的包,并在包下新建名為Client的類,用于表示客戶端。

在Client 類中聲明全局變量 socket 表示一個(gè)客戶端Socket對(duì)象,并在實(shí)例化 Client 類時(shí)使用構(gòu)造方法“Socket(String ip,int port)”來創(chuàng)建Socket類的對(duì)象。此時(shí),需要進(jìn)行異常處理。代碼如下所示:

  • package com.tarena.homework;
  • import java.io.BufferedReader;
  • import java.io.IOException;
  • import java.io.InputStream;
  • import java.io.InputStreamReader;
  • import java.io.OutputStream;
  • import java.io.OutputStreamWriter;
  • import java.io.PrintWriter;
  • import java.net.Socket;
  • import java.util.Scanner;
  • /**
  • * 客戶端應(yīng)用程序
  • */
  • public class Client {
  • ????//客戶端Socket
  • ????private Socket socket;
  • ????/**
  • ???? * 構(gòu)造方法,用于初始化
  • ???? */
  • ????public Client(){
  • ????????try {
  • ????????????socket = new Socket("localhost",8088);
  • ????????} catch (Exception e) {
  • ????????????e.printStackTrace();
  • ????????}
  • ????}
  • }
  • 步驟二:定義客戶端線程要執(zhí)行的任務(wù)

    在Client類中定義成員內(nèi)部類ServerHander。該內(nèi)部類需要實(shí)現(xiàn)Runnable接口并實(shí)現(xiàn)該接口的run() 方法。在該方法中實(shí)現(xiàn)線程要執(zhí)行的任務(wù),在此,線程要執(zhí)行的任務(wù)為循環(huán)接收服務(wù)端的消息并打印到控制臺(tái)。代碼如下所示:

  • public class Client {
  • ????//其他代碼,略
  • ????
  • ????/**
  • ???? * 該線程用于接收服務(wù)端發(fā)送過來的信息
  • ???? */
  • ????private class ServerHander implements Runnable{
  • ????????@Override
  • ????????public void run() {
  • ????????????try {
  • ????????????????InputStream in = socket.getInputStream();
  • ????????????????InputStreamReader isr = new InputStreamReader(in, "UTF-8");
  • ????????????????BufferedReader br = new BufferedReader(isr);
  • ????????????????while(true){
  • ????????????????????System.out.println(br.readLine());
  • ????????????????}
  • ????????????} catch (Exception e) {
  • ????????????????e.printStackTrace();
  • ????????????}
  • ????????}
  • ????}
  • }
  • 步驟三:定義方法inputNickName(),用于輸入昵稱

    為Client類定義方法inputNickName(),用于輸入昵稱。代碼如下所示:

  • public class Client {
  • ????//其他代碼,略
  • ????
  • ????/**
  • ???? * 輸入昵稱
  • ???? */
  • ????private void inputNickName(Scanner scanner)throws Exception{
  • ????????//定義昵稱
  • ????????String nickName = null;
  • ????????//創(chuàng)建輸出流
  • ????????PrintWriter pw = new PrintWriter(
  • ????????????????????????????new OutputStreamWriter(
  • ????????????????????????????????socket.getOutputStream(),"UTF-8")
  • ???????????????????????? ,true);
  • ????????//創(chuàng)建輸入流
  • ????????BufferedReader br = new BufferedReader(
  • ????????????????????????????????new InputStreamReader(
  • ????????????????????????????????????????socket.getInputStream(),"UTF-8")
  • ???????????????????????? );
  • ????????/*
  • ???????? * 循環(huán)以下操作
  • ???????? * 輸入用戶名,并上傳至服務(wù)器,等待服務(wù)器回應(yīng),若昵稱可用就結(jié)束循環(huán),否則通知用戶后
  • ???????? * 重新輸入昵稱
  • ???????? */
  • ????????while(true){
  • ????????????System.out.println("請(qǐng)輸入昵稱:");
  • ????????????nickName = scanner.nextLine();
  • ????????????if(nickName.trim().equals("")){
  • ????????????????System.out.println("昵稱不能為空");
  • ????????????}else{
  • ????????????????pw.println(nickName);
  • ????????????????String pass = br.readLine();
  • ????????????????if(pass!=null&&!pass.equals("OK")){
  • ????????????????????System.out.println("昵稱已被占用,請(qǐng)更換。");
  • ????????????????}else{
  • ????????????????????System.out.println("你好!"+nickName+",開始聊天吧!");
  • ????????????????????break;
  • ????????????????}
  • ????????????}
  • ????????}
  • ????}
  • }
  • 步驟四:創(chuàng)建客戶端工作方法 start()

    為 Client 類創(chuàng)建客戶端工作方法 start()。在該方法中,首先調(diào)用方法inputNickName()得到用戶昵稱,然后啟動(dòng)接收服務(wù)端信息的線程,接收數(shù)據(jù)后打印顯示。

    代碼如下所示:

  • public class Client {
  • ????//其他代碼,略
  • ????/**
  • ???? * 客戶端工作方法
  • ???? */
  • ????public void start(){
  • ????????try {
  • ????????????//創(chuàng)建Scanner讀取用戶輸入內(nèi)容
  • ????????????Scanner scanner = new Scanner(System.in);
  • ????????????//首先輸入昵稱
  • ????????????inputNickName(scanner);
  • ????????????
  • ????????????//將接收服務(wù)端信息的線程啟動(dòng)
  • ????????????ServerHander handler = new ServerHander();
  • ????????????Thread t = new Thread(handler);
  • ????????????t.setDaemon(true);
  • ????????????t.start();
  • ????????????
  • ????????????OutputStream out = socket.getOutputStream();????????????
  • ????????????OutputStreamWriter osw = new OutputStreamWriter(out,"UTF-8");????????????
  • ????????????PrintWriter pw = new PrintWriter(osw,true);
  • ????????????while(true){
  • ????????????????pw.println(scanner.nextLine());
  • ????????????}
  • ????????} catch (Exception e) {
  • ????????????e.printStackTrace();
  • ????????} finally{
  • ????????????if(socket != null){
  • ????????????????try {
  • ????????????????????socket.close();
  • ????????????????} catch (IOException e) {
  • ????????????????????e.printStackTrace();
  • ????????????????}
  • ????????????}
  • ????????}
  • ????}
  • }
  • 步驟五:為客戶端類定義 main() 方法

    為類 Client 定義 main() 方法,并在該方法中,創(chuàng)建 Client 對(duì)象,調(diào)用上一步中所創(chuàng)建的 start() 方法。代碼如下所示:

  • /**
  • * 客戶端應(yīng)用程序
  • */
  • public class Client {
  • ????//其他代碼,略
  • ????
  • ????public static void main(String[] args) {
  • ????????Client client = new Client();
  • ????????client.start();
  • ????}
  • }
  • 步驟六:定義 Server類

    定義Server類,并在Server類中添加ExecutorService類型的屬性threadPool,并在構(gòu)造方法中將其初始化。初始化時(shí),使用固定大小的線程池,線程數(shù)量為40。這里使用Executors類的newFixedThreadPool(int threads)方法來創(chuàng)建固定大小的線程池。定義屬性serverSocket,其類型為ServerSocket,并在構(gòu)造方法中將其初始化,申請(qǐng)的服務(wù)端口為8088。再定義屬性allOut,其類型為HashMap,其中key用于保存用戶昵稱,value用于保存該客戶端的輸出流,并在構(gòu)造方法中初始化以便服務(wù)端可以轉(zhuǎn)發(fā)信息。

    代碼如下所示:

  • package com.tarena.homework;
  • import java.io.BufferedReader;
  • import java.io.IOException;
  • import java.io.InputStream;
  • import java.io.InputStreamReader;
  • import java.io.OutputStream;
  • import java.io.OutputStreamWriter;
  • import java.io.PrintWriter;
  • import java.net.ServerSocket;
  • import java.net.Socket;
  • import java.util.HashMap;
  • import java.util.Map;
  • import java.util.concurrent.ExecutorService;
  • import java.util.concurrent.Executors;
  • /**
  • * 服務(wù)端應(yīng)用程序
  • */
  • public class Server {
  • ????// 服務(wù)端Socket
  • ????private ServerSocket serverSocket;
  • ????// 所有客戶端輸出流,key為用戶的昵稱,value為該用戶的輸出流
  • ????private Map<String,PrintWriter> allOut;
  • ????// 線程池
  • ????private ExecutorService threadPool;
  • ????/**
  • ???? * 構(gòu)造方法,用于初始化
  • ???? */
  • ????public Server() {
  • ????????try {
  • ????????????serverSocket = new ServerSocket(8088);????????????
  • ????????????allOut = new HashMap<String,PrintWriter>();????????????
  • ????????????threadPool = Executors.newFixedThreadPool(40);
  • ????????} catch (Exception e) {
  • ????????????e.printStackTrace();
  • ????????}
  • ????}
  • }
  • 步驟七:為 Server 類定義 addOut()和removeOut()方法

    定義 addOut()方法,該方法向Server的屬性allOut集合中添加輸出流,并使用synchronized關(guān)鍵字修飾,使該方法變?yōu)橥椒椒ā?/p>

    再定義removeOut()方法,該方法從Server的屬性allOut集合中刪除輸出流,并使用synchronized關(guān)鍵字修飾,使該方法變?yōu)橥椒椒ā?/p>

    代碼如下所示:

  • public class Server {
  • ????//其他代碼,略
  • ????/**
  • ???? * 將輸出流存入共享集合,與下面兩個(gè)方法互斥,保證同步安全
  • ???? * @param out
  • ???? */
  • ????private synchronized void addOut(String nickName,PrintWriter out){
  • ????????allOut.put(nickName,out);
  • ????}
  • ????/**
  • ???? * 將給定輸出流從共享集合刪除
  • ???? * @param out
  • ???? */
  • ????private synchronized void removeOut(String nickName){
  • ????????allOut.remove(nickName);
  • ????}
  • }
  • 步驟八:為 Server 類定義sendMessage()方法

    定義sendMessage()方法,該方法用于遍歷Server的屬性allOut集合元素,將信息寫入每一個(gè)輸出流來完成廣播消息的功能,并使用synchronized關(guān)鍵字修飾,使該方法變?yōu)橥椒椒ā4a如下所示:

  • public class Server {
  • ????//其他代碼,略
  • ????/**
  • ???? * 將消息轉(zhuǎn)發(fā)給所有客戶端
  • ???? * @param message
  • ???? */
  • ????private synchronized void sendMessage(String message){
  • ????????for(PrintWriter o : allOut.values()){
  • ????????????o.println(message);
  • ????????}
  • ????}
  • }
  • 步驟九:為 Server 類定義sendMessageToOne() 方法

    定義sendMessageToOne()方法,該方法用于將消息發(fā)送給指定昵稱的客戶端來實(shí)現(xiàn)私聊功能。代碼如下所示:

  • public class Server {
  • ????//其他代碼,略
  • ????/**
  • ???? * 將消息發(fā)送給指定昵稱的客戶端
  • ???? * @param nickName
  • ???? * @param message
  • ???? */
  • ????private synchronized void sendMessageToOne(String nickName,String message){
  • ????????PrintWriter out = allOut.get(nickName);
  • ????????if(out!=null){
  • ????????????out.println(message);
  • ????????}
  • ????}
  • }
  • 步驟十:創(chuàng)建內(nèi)部類

    創(chuàng)建 Server的內(nèi)部類ClientHandler,在內(nèi)部類中定義run()方法。在run()方法中,讀取用戶昵稱以發(fā)送用戶上線信息,并進(jìn)行消息轉(zhuǎn)發(fā),其中先判斷是否為私聊信息,若是則調(diào)用發(fā)送私聊信息的方法,否則向所有客戶端廣播消息 。代碼如下所示:

  • ????/**
  • ???? * 線程體,用于并發(fā)處理不同客戶端的交互
  • ???? */
  • ????private class ClientHandler implements Runnable {
  • ????????// 該線程用于處理的客戶端
  • ????????private Socket socket;
  • ????????// 開客戶端的昵稱
  • ????????private String nickName;
  • ????????public ClientHandler(Socket socket) {
  • ????????????this.socket = socket;
  • ????????}
  • ????????@Override
  • ????????public void run() {
  • ????????????PrintWriter pw = null;
  • ????????????try {
  • ????????????????//將客戶端的輸出流存入共享集合,以便廣播消息
  • ????????????????OutputStream out = socket.getOutputStream();
  • ????????????????OutputStreamWriter osw = new OutputStreamWriter(out,"UTF-8");
  • ????????????????pw = new PrintWriter(osw,true);
  • ????????????????/*
  • ???????????????? * 將用戶信息存入共享集合
  • ???????????????? * 需要同步
  • ???????????????? */
  • ????????????????//先獲取該用戶昵稱
  • ????????????????nickName = getNickName();
  • ????????????????addOut(nickName,pw);
  • ????????????????Thread.sleep(100);
  • ????????????????/*
  • ???????????????? * 通知所有用戶該用戶已上線
  • ???????????????? */
  • ????????????????sendMessage(nickName+"上線了");
  • ????????????????
  • ????????????????InputStream in = socket.getInputStream();
  • ????????????????InputStreamReader isr = new InputStreamReader(in, "UTF-8");
  • ????????????????BufferedReader br = new BufferedReader(isr);
  • ????????????????
  • ????????????????String message = null;
  • ????????????????// 循環(huán)讀取客戶端發(fā)送的信息
  • ????????????????while ((message = br.readLine())!=null) {
  • ????????????????????//首先查看是不是私聊
  • ????????????????????if(message.startsWith("\\")){
  • ????????????????????????/*
  • ???????????????????????? * 私聊格式:\昵稱:內(nèi)容
  • ???????????????????????? */
  • ????????????????????????//找到:的位置
  • ????????????????????????int index = message.indexOf(":");
  • ????????????????????????if(index>=0){
  • ????????????????????????????//截取昵稱
  • ????????????????????????????String name = message.substring(1,index);
  • ????????????????????????????//截取內(nèi)容
  • ????????????????????????????String info = message.substring(
  • ???????????????????????????????????????????????? index+1,message.length()
  • ???????????????????????????????????????????????? );
  • ????????????????????????????//拼接內(nèi)容
  • ????????????????????????????info = nickName+"對(duì)你說:"+info;
  • ????????????????????????????//發(fā)送私聊信息給指定用戶
  • ????????????????????????????sendMessageToOne(name, info);
  • ????????????????????????????//發(fā)送完私聊后就不在廣播了。
  • ????????????????????????????continue;
  • ????????????????????????}
  • ????????????????????}
  • ????????????????????/*
  • ???????????????????? * 遍歷所有輸出流,將該客戶端發(fā)送的信息轉(zhuǎn)發(fā)給所有客戶端
  • ???????????????????? * 需要同步
  • ???????????????????? */
  • ????????????????????sendMessage(nickName+"說:"+message);
  • ????????????????}
  • ????????????} catch (Exception e) {
  • ????????????????e.printStackTrace();
  • ????????????} finally {
  • ????????????????/*
  • ???????????????? * 當(dāng)客戶端斷線,要將輸出流從共享集合中刪除
  • ???????????????? * 需要同步
  • ???????????????? */
  • ????????????????removeOut(nickName);
  • ????????????????/*
  • ???????????????? * 通知所有用戶該用戶已下線
  • ???????????????? */
  • ????????????????sendMessage(nickName+"下線了");
  • ????????????????System.out.println("當(dāng)前在線人數(shù):"+allOut.size());
  • ????????????????if (socket != null) {
  • ????????????????????try {
  • ????????????????????????socket.close();
  • ????????????????????} catch (IOException e) {
  • ????????????????????????e.printStackTrace();
  • ????????????????????}
  • ????????????????}
  • ????????????}
  • ????????}
  • }
  • 步驟十一:為內(nèi)部類定義方法getNickName()

    為 Server的內(nèi)部類ClientHandler定義方法getNickName(),用于獲取用戶的昵稱。代碼如下所示:

  • ????private class ClientHandler implements Runnable {
  • ????????//其他代碼,略
  • ????????/**
  • ???????? * 獲取該用戶的昵稱
  • ???????? * @return
  • ???????? */
  • ????????private String getNickName()throws Exception{
  • ????????????try {
  • ????????????????//獲取該用戶的輸出流
  • ????????????????OutputStream out = socket.getOutputStream();
  • ????????????????OutputStreamWriter osw = new OutputStreamWriter(out,"UTF-8");
  • ????????????????PrintWriter pw = new PrintWriter(osw,true);
  • ????????????????//獲取該用戶的輸入流
  • ????????????????InputStream in = socket.getInputStream();
  • ????????????????InputStreamReader isr = new InputStreamReader(in, "UTF-8");
  • ????????????????BufferedReader br = new BufferedReader(isr);
  • ????????????????//讀取客戶端發(fā)送過來的昵稱
  • ????????????????String nickName = br.readLine();
  • ????????????????while(true){
  • ????????????????????//若昵稱為空發(fā)送失敗代碼
  • ????????????????????if(nickName.trim().equals("")){
  • ????????????????????????pw.println("FAIL");
  • ????????????????????}
  • ????????????????????//若昵稱已經(jīng)存在發(fā)送失敗代碼
  • ????????????????????if(allOut.containsKey(nickName)){
  • ????????????????????????pw.println("FAIL");
  • ????????????????????//若成功,發(fā)送成功代碼,并返回昵稱
  • ????????????????????}else{
  • ????????????????????????pw.println("OK");
  • ????????????????????????return nickName;
  • ????????????????????}
  • ????????????????????//若改昵稱被占用,等待用戶再次輸入昵稱
  • ????????????????????nickName = br.readLine();
  • ????????????????}
  • ????????????} catch (Exception e) {
  • ????????????????throw e;
  • ????????????}????????????
  • ????????}
  • ????}
  • 步驟十二:為 Server 類創(chuàng)建 start()方法

    為 Server 類創(chuàng)建 start()方法。在該方法中,循環(huán)監(jiān)聽8088端口,等待客戶端的連接,一旦一個(gè)客戶端連接后,向線程池申請(qǐng)一個(gè)線程來完成針對(duì)該客戶端的交互。代碼如下所示:

  • public class Server {
  • ????//其他代碼,略
  • ????/**
  • ???? * 服務(wù)端開啟方法
  • ???? */
  • ????public void start() {
  • ????????try {
  • ????????????//循環(huán)監(jiān)聽客戶端的連接
  • ????????????while(true){
  • ????????????????System.out.println("等待客戶端連接...");
  • ????????????????// 監(jiān)聽客戶端的連接
  • ????????????????Socket socket = serverSocket.accept();
  • ????????????????System.out.println("客戶端已連接!");
  • ????????????????
  • ????????????????//啟動(dòng)一個(gè)線程來完成針對(duì)該客戶端的交互
  • ????????????????ClientHandler handler = new ClientHandler(socket);
  • ????????????????threadPool.execute(handler);
  • ????????????}????????????
  • ????????} catch (Exception e) {
  • ????????????e.printStackTrace();
  • ????????}
  • ????}
  • }
  • 步驟十三:為 Server類定義 main() 方法

    為 Server 類定義 main() 方法,并在 main() 方法中,創(chuàng)建 Server 對(duì)象,調(diào)用上一步中所創(chuàng)建的 start() 方法。代碼如下所示:

  • public class Server {
  • ????//其他代碼,略
  • ????public static void main(String[] args) {
  • ????????Server server = new Server();
  • ????????server.start();
  • ????}
  • }
  • 本案例中,類Server的完整代碼如下所示:

  • package com.tarena.homework;
  • import java.io.BufferedReader;
  • import java.io.IOException;
  • import java.io.InputStream;
  • import java.io.InputStreamReader;
  • import java.io.OutputStream;
  • import java.io.OutputStreamWriter;
  • import java.io.PrintWriter;
  • import java.net.ServerSocket;
  • import java.net.Socket;
  • import java.util.HashMap;
  • import java.util.Map;
  • import java.util.concurrent.ExecutorService;
  • import java.util.concurrent.Executors;
  • /**
  • * 服務(wù)端應(yīng)用程序
  • */
  • public class Server {
  • ????// 服務(wù)端Socket
  • ????private ServerSocket serverSocket;
  • ????// 所有客戶端輸出流,key為用戶的昵稱,value為該用戶的輸出流
  • ????private Map<String,PrintWriter> allOut;
  • ????// 線程池
  • ????private ExecutorService threadPool;
  • ????/**
  • ???? * 構(gòu)造方法,用于初始化
  • ???? */
  • ????public Server() {
  • ????????try {
  • ????????????serverSocket = new ServerSocket(8088);????????????
  • ????????????allOut = new HashMap<String,PrintWriter>();????????????
  • ????????????threadPool = Executors.newFixedThreadPool(40);
  • ????????} catch (Exception e) {
  • ????????????e.printStackTrace();
  • ????????}
  • ????}
  • ????/**
  • ???? * 服務(wù)端開啟方法
  • ???? */
  • ????public void start() {
  • ????????try {
  • ????????????//循環(huán)監(jiān)聽客戶端的連接
  • ????????????while(true){
  • ????????????????System.out.println("等待客戶端連接...");
  • ????????????????// 監(jiān)聽客戶端的連接
  • ????????????????Socket socket = serverSocket.accept();
  • ????????????????System.out.println("客戶端已連接!");
  • ????????????????
  • ????????????????//啟動(dòng)一個(gè)線程來完成針對(duì)該客戶端的交互
  • ????????????????ClientHandler handler = new ClientHandler(socket);
  • ????????????????threadPool.execute(handler);
  • ????????????}????????????
  • ????????} catch (Exception e) {
  • ????????????e.printStackTrace();
  • ????????}
  • ????}
  • ????/**
  • ???? * 將輸出流存入共享集合,與下面兩個(gè)方法互斥,保證同步安全
  • ???? * @param out
  • ???? */
  • ????private synchronized void addOut(String nickName,PrintWriter out){
  • ????????allOut.put(nickName,out);
  • ????}
  • ????/**
  • ???? * 將給定輸出流從共享集合刪除
  • ???? * @param out
  • ???? */
  • ????private synchronized void removeOut(String nickName){
  • ????????allOut.remove(nickName);
  • ????}
  • ????/**
  • ???? * 將消息轉(zhuǎn)發(fā)給所有客戶端
  • ???? * @param message
  • ???? */
  • ????private synchronized void sendMessage(String message){
  • ????????for(PrintWriter o : allOut.values()){
  • ????????????o.println(message);
  • ????????}
  • ????}
  • ????/**
  • ???? * 將消息發(fā)送給指定昵稱的客戶端
  • ???? * @param nickName
  • ???? * @param message
  • ???? */
  • ????private synchronized void sendMessageToOne(String nickName,String message){
  • ????????PrintWriter out = allOut.get(nickName);
  • ????????if(out!=null){
  • ????????????out.println(message);
  • ????????}
  • ????}
  • ????
  • ????public static void main(String[] args) {
  • ????????Server server = new Server();
  • ????????server.start();
  • ????}
  • ????/**
  • ???? * 線程體,用于并發(fā)處理不同客戶端的交互
  • ???? */
  • ????private class ClientHandler implements Runnable {
  • ????????// 該線程用于處理的客戶端
  • ????????private Socket socket;
  • ????????// 開客戶端的昵稱
  • ????????private String nickName;
  • ????????public ClientHandler(Socket socket) {
  • ????????????this.socket = socket;
  • ????????}
  • ????????@Override
  • ????????public void run() {
  • ????????????PrintWriter pw = null;
  • ????????????try {
  • ????????????????//將客戶端的輸出流存入共享集合,以便廣播消息
  • ????????????????OutputStream out = socket.getOutputStream();
  • ????????????????OutputStreamWriter osw = new OutputStreamWriter(out,"UTF-8");
  • ????????????????pw = new PrintWriter(osw,true);
  • ????????????????/*
  • ???????????????? * 將用戶信息存入共享集合
  • ???????????????? * 需要同步
  • ???????????????? */
  • ????????????????//先獲取該用戶昵稱
  • ????????????????nickName = getNickName();
  • ????????????????addOut(nickName,pw);
  • ????????????????Thread.sleep(100);
  • ????????????????/*
  • ???????????????? * 通知所有用戶該用戶已上線
  • ???????????????? */
  • ????????????????sendMessage(nickName+"上線了");
  • ????????????????
  • ????????????????InputStream in = socket.getInputStream();
  • ????????????????InputStreamReader isr = new InputStreamReader(in, "UTF-8");
  • ????????????????BufferedReader br = new BufferedReader(isr);
  • ????????????????
  • ????????????????String message = null;
  • ????????????????// 循環(huán)讀取客戶端發(fā)送的信息
  • ????????????????while ((message = br.readLine())!=null) {
  • ????????????????????//首先查看是不是私聊
  • ????????????????????if(message.startsWith("\\")){
  • ????????????????????????/*
  • ???????????????????????? * 私聊格式:\昵稱:內(nèi)容
  • ???????????????????????? */
  • ????????????????????????//找到:的位置
  • ????????????????????????int index = message.indexOf(":");
  • ????????????????????????if(index>=0){
  • ????????????????????????????//截取昵稱
  • ????????????????????????????String name = message.substring(1,index);
  • ????????????????????????????//截取內(nèi)容
  • ????????????????????????????String info = message.substring(index+1,message.length());
  • ????????????????????????????//拼接內(nèi)容
  • ????????????????????????????info = nickName+"對(duì)你說:"+info;
  • ????????????????????????????//發(fā)送私聊信息給指定用戶
  • ????????????????????????????sendMessageToOne(name, info);
  • ????????????????????????????//發(fā)送完私聊后就不在廣播了。
  • ????????????????????????????continue;
  • ????????????????????????}
  • ????????????????????}
  • ????????????????????/*
  • ???????????????????? * 遍歷所有輸出流,將該客戶端發(fā)送的信息轉(zhuǎn)發(fā)給所有客戶端
  • ???????????????????? * 需要同步
  • ???????????????????? */
  • ????????????????????sendMessage(nickName+"說:"+message);
  • ????????????????}
  • ????????????} catch (Exception e) {
  • ????????????????e.printStackTrace();
  • ????????????} finally {
  • ????????????????/*
  • ???????????????? * 當(dāng)客戶端斷線,要將輸出流從共享集合中刪除
  • ???????????????? * 需要同步
  • ???????????????? */
  • ????????????????removeOut(nickName);
  • ????????????????/*
  • ???????????????? * 通知所有用戶該用戶已下線
  • ???????????????? */
  • ????????????????sendMessage(nickName+"下線了");
  • ????????????????System.out.println("當(dāng)前在線人數(shù):"+allOut.size());
  • ????????????????if (socket != null) {
  • ????????????????????try {
  • ????????????????????????socket.close();
  • ????????????????????} catch (IOException e) {
  • ????????????????????????e.printStackTrace();
  • ????????????????????}
  • ????????????????}
  • ????????????}
  • ????????}
  • ????????/**
  • ???????? * 獲取該用戶的昵稱
  • ???????? * @return
  • ???????? */
  • ????????private String getNickName()throws Exception{
  • ????????????try {
  • ????????????????//獲取該用戶的輸出流
  • ????????????????OutputStream out = socket.getOutputStream();
  • ????????????????OutputStreamWriter osw = new OutputStreamWriter(out,"UTF-8");
  • ????????????????PrintWriter pw = new PrintWriter(osw,true);
  • ????????????????//獲取該用戶的輸入流
  • ????????????????InputStream in = socket.getInputStream();
  • ????????????????InputStreamReader isr = new InputStreamReader(in, "UTF-8");
  • ????????????????BufferedReader br = new BufferedReader(isr);
  • ????????????????//讀取客戶端發(fā)送過來的昵稱
  • ????????????????String nickName = br.readLine();
  • ????????????????while(true){
  • ????????????????????//若昵稱為空發(fā)送失敗代碼
  • ????????????????????if(nickName.trim().equals("")){
  • ????????????????????????pw.println("FAIL");
  • ????????????????????}
  • ????????????????????//若昵稱已經(jīng)存在發(fā)送失敗代碼
  • ????????????????????if(allOut.containsKey(nickName)){
  • ????????????????????????pw.println("FAIL");
  • ????????????????????//若成功,發(fā)送成功代碼,并返回昵稱
  • ????????????????????}else{
  • ????????????????????????pw.println("OK");
  • ????????????????????????return nickName;
  • ????????????????????}
  • ????????????????????//若改昵稱被占用,等待用戶再次輸入昵稱
  • ????????????????????nickName = br.readLine();
  • ????????????????}
  • ????????????} catch (Exception e) {
  • ????????????????throw e;
  • ????????????}????????????
  • ????????}
  • ????}
  • }
  • ?

    本案例中,類Client的完整代碼如下所示:

  • package com.tarena.homework;
  • import java.io.BufferedReader;
  • import java.io.IOException;
  • import java.io.InputStream;
  • import java.io.InputStreamReader;
  • import java.io.OutputStream;
  • import java.io.OutputStreamWriter;
  • import java.io.PrintWriter;
  • import java.net.Socket;
  • import java.util.Scanner;
  • /**
  • * 客戶端應(yīng)用程序
  • */
  • public class Client {
  • ????//客戶端Socket
  • ????private Socket socket;
  • ????/**
  • ???? * 構(gòu)造方法,用于初始化
  • ???? */
  • ????public Client(){
  • ????????try {
  • ????????????socket = new Socket("localhost",8088);
  • ????????} catch (Exception e) {
  • ????????????e.printStackTrace();
  • ????????}
  • ????}
  • ????/**
  • ???? * 客戶端工作方法
  • ???? */
  • ????public void start(){
  • ????????try {
  • ????????????//創(chuàng)建Scanner讀取用戶輸入內(nèi)容
  • ????????????Scanner scanner = new Scanner(System.in);
  • ????????????//首先輸入昵稱
  • ????????????inputNickName(scanner);
  • ????????????
  • ????????????//將接收服務(wù)端信息的線程啟動(dòng)
  • ????????????ServerHander handler = new ServerHander();
  • ????????????Thread t = new Thread(handler);
  • ????????????t.setDaemon(true);
  • ????????????t.start();
  • ????????????
  • ????????????OutputStream out = socket.getOutputStream();????????????
  • ????????????OutputStreamWriter osw = new OutputStreamWriter(out,"UTF-8");????????????
  • ????????????PrintWriter pw = new PrintWriter(osw,true);
  • ????????????while(true){
  • ????????????????pw.println(scanner.nextLine());
  • ????????????}
  • ????????} catch (Exception e) {
  • ????????????e.printStackTrace();
  • ????????} finally{
  • ????????????if(socket != null){
  • ????????????????try {
  • ????????????????????socket.close();
  • ????????????????} catch (IOException e) {
  • ????????????????????e.printStackTrace();
  • ????????????????}
  • ????????????}
  • ????????}
  • ????}
  • ????
  • ????public static void main(String[] args) {
  • ????????Client client = new Client();
  • ????????client.start();
  • ????}
  • ????
  • ????/**
  • ???? * 輸入昵稱
  • ???? */
  • ????private void inputNickName(Scanner scanner)throws Exception{
  • ????????//定義昵稱
  • ????????String nickName = null;
  • ????????//創(chuàng)建輸出流
  • ????????PrintWriter pw = new PrintWriter(
  • ????????????????????????????new OutputStreamWriter(
  • ????????????????????????????????socket.getOutputStream(),"UTF-8")
  • ???????????????????????? ,true);
  • ????????//創(chuàng)建輸入流
  • ????????BufferedReader br = new BufferedReader(
  • ????????????????????????????????new InputStreamReader(
  • ????????????????????????????????????????socket.getInputStream(),"UTF-8")
  • ???????????????????????? );
  • ????????/*
  • ???????? * 循環(huán)以下操作
  • ???????? * 輸入用戶名,并上傳至服務(wù)器,等待服務(wù)器回應(yīng),若昵稱可用就結(jié)束循環(huán),否則通知用戶后
  • ???????? * 重新輸入昵稱
  • ???????? */
  • ????????while(true){
  • ????????????System.out.println("請(qǐng)輸入昵稱:");
  • ????????????nickName = scanner.nextLine();
  • ????????????if(nickName.trim().equals("")){
  • ????????????????System.out.println("昵稱不能為空");
  • ????????????}else{
  • ????????????????pw.println(nickName);
  • ????????????????String pass = br.readLine();
  • ????????????????if(pass!=null&&!pass.equals("OK")){
  • ????????????????????System.out.println("昵稱已被占用,請(qǐng)更換。");
  • ????????????????}else{
  • ????????????????????System.out.println("你好!"+nickName+",開始聊天吧!");
  • ????????????????????break;
  • ????????????????}
  • ????????????}
  • ????????}
  • ????}
  • ????
  • ????/**
  • ???? * 該線程用于接收服務(wù)端發(fā)送過來的信息
  • ???? */
  • ????private class ServerHander implements Runnable{
  • ????????@Override
  • ????????public void run() {
  • ????????????try {
  • ????????????????InputStream in = socket.getInputStream();
  • ????????????????InputStreamReader isr = new InputStreamReader(in, "UTF-8");
  • ????????????????BufferedReader br = new BufferedReader(isr);
  • ????????????????while(true){
  • ????????????????????System.out.println(br.readLine());
  • ????????????????}
  • ????????????} catch (Exception e) {
  • ????????????????e.printStackTrace();
  • ????????????}
  • ????????}
  • ????}
  • }
  • ?

    轉(zhuǎn)載于:https://www.cnblogs.com/xyk1987/p/8330970.html

    總結(jié)

    以上是生活随笔為你收集整理的完成聊天室的私聊功能的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問題。

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

    成人a毛片 | 免费一区在线 | 国产+日韩欧美 | 亚洲日本一区二区在线 | 在线观看黄网站 | 国产一区二区久久精品 | 久久免费视频8 | 91精品免费视频 | 欧美狠狠色 | 国产精品va视频 | 五月天色丁香 | 免费黄色在线播放 | 久热精品国产 | 欧美色图东方 | 六月激情婷婷 | 又湿又紧又大又爽a视频国产 | 九色琪琪久久综合网天天 | 欧美亚洲免费在线一区 | 国产日产高清dvd碟片 | 欧美一级视频在线观看 | 免费在线观看黄色网 | 在线观看av小说 | 91重口视频| www.久热| 国产一区二区视频在线播放 | 六月丁香在线视频 | 国产黄在线看 | 久久黄色免费视频 | 五月天网页 | 99国产精品久久久久老师 | 日本久久久久久科技有限公司 | 99久久日韩精品视频免费在线观看 | 婷婷视频在线观看 | 国产1区2区3区在线 亚洲自拍偷拍色图 | 亚洲国产小视频在线观看 | 成人亚洲精品久久久久 | 成人在线播放网站 | 在线观看成人网 | 中文一区二区三区在线观看 | 色婷婷导航 | 国内精品视频在线播放 | 99视频精品在线 | 97视频中文字幕 | 丝袜+亚洲+另类+欧美+变态 | 日本一区二区三区免费观看 | 久久久久久国产精品久久 | www免费在线观看 | 精品欧美一区二区三区久久久 | 国产我不卡 | 激情综合国产 | 日韩精品最新在线观看 | 在线看国产日韩 | 一级黄色在线视频 | 欧美日韩免费在线观看视频 | 亚洲美女视频网 | 久草视频中文在线 | 色婷婷激情 | 麻豆视频在线免费看 | 久久久三级视频 | 91麻豆精品国产91久久久无限制版 | 精品久久久久亚洲 | 91九色网站 | 欧美日韩国产一区 | 久久99国产视频 | 99精品国产福利在线观看免费 | 992tv人人网tv亚洲精品 | 欧美国产日韩一区二区三区 | 最近中文字幕完整高清 | 美女免费视频一区二区 | 欧美日韩国产高清视频 | 欧美日韩另类在线观看 | 久久免费毛片视频 | 久久久久久电影 | 久久久久久久久久久久久久av | 黄在线免费观看 | 日日爱av| 五月天av在线 | 激情综合色图 | 日韩电影一区二区在线观看 | 久久成人亚洲欧美电影 | 69国产盗摄一区二区三区五区 | 射射射av| 国产精品久久久免费看 | 日韩大片免费在线观看 | 在线免费观看黄色小说 | 久久免费av电影 | 日本激情视频中文字幕 | 中文字幕第一页在线视频 | 亚洲影院国产 | 亚洲视频,欧洲视频 | 69精品 | 午夜精品视频一区 | 久久久久国产一区二区三区 | 久久综合精品一区 | 狠狠狠色丁香婷婷综合久久五月 | 人人澡视频| 黄污网站在线观看 | 中文乱幕日产无线码1区 | 精品久久久国产 | 99久久www | 亚洲视频h | 欧美精品一区二区免费 | 最近2019年日本中文免费字幕 | 国产中文字幕在线免费观看 | 日韩久久视频 | 五月婷久 | 国产精品日韩久久久久 | 91在线看 | 国产精品一区二区久久精品爱涩 | 久久超 | 黄色a级片在线观看 | 亚洲第一区在线观看 | 亚洲国产午夜精品 | 91视频在线免费下载 | 日韩色在线 | 99久久综合狠狠综合久久 | 日韩网站中文字幕 | 亚洲在线视频观看 | 亚洲视频h | 久久久www成人免费精品张筱雨 | 久草在线最新视频 | 特级a毛片 | 日日干影院| 特级毛片在线免费观看 | 久久欧洲视频 | 日韩av偷拍 | 一区二区三区免费在线观看视频 | 久久老司机精品视频 | 久久国产成人午夜av影院宅 | 精品久久久久久亚洲综合网 | 欧美夫妻性生活电影 | 久久精品久久久久久久 | 丁香一区二区 | 亚洲影视资源 | 叶爱av在线| 欧美整片sss| 久久久蜜桃一区二区 | 亚洲视频免费在线观看 | 免费看特级毛片 | 国产理论一区二区三区 | 在线免费色 | 91看片淫黄大片91 | 福利视频导航网址 | 亚洲日日夜夜 | 久久综合久久伊人 | 亚洲欧美精品在线 | 麻豆一二 | 最新99热 | 精品日本视频 | 99精品在这里 | 五月综合在线观看 | www.一区二区三区 | 91精品久久久久久久久久久久久 | 干干日日 | 国产精品久久久久久一区二区 | 久操伊人 | 久久高清精品 | 人人草在线视频 | 狠狠色狠狠色合久久伊人 | 黄色三级免费 | 奇米7777狠狠狠琪琪视频 | 日产乱码一二三区别免费 | 成人在线视频你懂的 | 天堂av观看| 久久久不卡影院 | 麻豆免费视频观看 | 91xav| 色久av| 亚洲国产高清在线观看视频 | 亚洲涩涩一区 | 色综合狠狠干 | 2019天天干夜夜操 | 又黄又爽又刺激的视频 | 少妇高潮流白浆在线观看 | 免费日韩 精品中文字幕视频在线 | av在线播放亚洲 | 狠狠做深爱婷婷综合一区 | 91色视频 | 新版资源中文在线观看 | av三级在线免费观看 | 婷婷久久网 | 欧美国产三区 | 亚洲精品网站 | 欧美十八| 一本一本久久a久久精品综合小说 | 97视频免费播放 | 亚洲视频2 | 亚洲最新精品 | 九九天堂 | 91亚色视频在线观看 | 天堂av免费 | 亚洲精品国内 | 久久久免费看片 | 欧美十八 | av免费成人| 亚洲精品系列 | 日韩精品免费在线视频 | 国产麻豆果冻传媒在线观看 | 久久久久久久久久久国产精品 | 欧美精品久久久久久久久久久 | 亚洲日本欧美在线 | 自拍超碰在线 | 久久草在线免费 | 免费在线精品视频 | 免费视频xnxx com | 中文字幕不卡在线88 | 久久综合电影 | 波多野结衣在线播放一区 | 国产精品福利一区 | 国产一级免费片 | 欧美日韩国产精品一区二区三区 | 久久久国产精品电影 | 久久久www成人免费毛片麻豆 | 国产精品18久久久久久久久 | 91精品视频一区二区三区 | 99久久精品久久久久久动态片 | 五月开心婷婷 | 天天想夜夜操 | 在线日韩亚洲 | 2024av | 亚洲精品456在线播放 | 一级片免费在线 | 懂色av一区二区三区蜜臀 | 最新国产在线视频 | 国产成人精品电影久久久 | 日本久久久久久久久久久 | 91x色| 色在线免费| 成年人免费av网站 | 久久九九免费视频 | 久久看毛片 | 日韩一区二区三区观看 | 狠狠色噜噜狠狠狠狠2022 | 超碰在线最新网址 | 亚洲精品欧美视频 | 久久99精品久久久久久秒播蜜臀 | 五月婷婷在线观看 | av在线电影免费观看 | 高清免费在线视频 | 在线亚州| 久久蜜臀av | 欧美亚洲专区 | 色综合亚洲精品激情狠狠 | 992tv在线观看网站 | 免费一级片观看 | 国产中文字幕视频在线观看 | 亚洲一区欧美激情 | 国产视频精品视频 | 毛片a级片 | 91成人看片 | 免费美女久久99 | 伊人伊成久久人综合网站 | 国产免费激情久久 | 成人一级片免费看 | 精品国产成人在线影院 | aaawww| 天天操夜夜想 | 日韩a在线播放 | 十八岁以下禁止观看的1000个网站 | 成人网页在线免费观看 | 日韩精品免费一区 | 亚洲视频 中文字幕 | 69视频在线| 69国产在线观看 | 99精品欧美一区二区三区黑人哦 | 精品理论片 | 天天操夜夜逼 | 免费a v在线 | 国产这里只有精品 | www.色五月| 色婷婷狠狠五月综合天色拍 | 91麻豆精品国产自产 | 狠狠色丁香婷婷综合视频 | 99久高清在线观看视频99精品热在线观看视频 | av高清一区 | 久久a v视频 | 久久99精品久久久久久三级 | 中文字幕日本在线观看 | 日韩欧美视频免费观看 | 91福利视频在线 | av日韩在线网站 | 中文字幕免费在线 | 天天干天天干天天操 | 在线观看成人网 | 国产精品videoxxxx | 中文字幕在线看视频国产 | 国产精品久久久久一区 | 色视频在线| 91av视频在线观看 | 久久久久久久久久久网 | 久久九九免费视频 | 日韩av片在线 | 欧美亚洲免费在线一区 | 免费在线一区二区 | 人人爽人人澡人人添人人人人 | 午夜av免费在线观看 | 在线婷婷| 一区二区视 | 99久热 | 97视频在线观看免费 | av在线网站免费观看 | 日韩精品视频在线观看免费 | 国产亚洲视频在线免费观看 | www国产一区 | 久久久婷 | 亚洲在线免费视频 | 精品婷婷 | 天天操天天操天天操天天操天天操 | 一区二区三区在线视频观看58 | 色婷婷播放 | 免费视频久久久 | 在线播放国产一区二区三区 | 99这里只有久久精品视频 | 丁香伊人网 | 国产色a在线观看 | 亚洲春色奇米影视 | 永久免费精品视频网站 | 日日操网站 | av7777777| 高清免费在线视频 | 男女激情免费网站 | 久久久久99999 | 精品嫩模福利一区二区蜜臀 | 又黄又爽又色无遮挡免费 | 天堂av高清| 日韩久久精品一区二区 | 免费看黄色91 | 激情五月婷婷激情 | 亚洲精品视频在线观看免费视频 | 在线成人小视频 | 99精品视频在线 | 狠狠色丁香婷婷综合久小说久 | 精品资源在线 | 久久一区国产 | 成年人视频在线 | 97超碰人人| 欧美一区免费观看 | 性色xxxxhd| 天天干天天干天天射 | 99视频在线免费 | 国产精品va在线观看入 | 国产精品美女久久久免费 | 日韩av影片在线观看 | av大片免费在线观看 | 操天天操| 国内精品久久久久久久久久清纯 | 91av电影在线观看 | 国产免费观看高清完整版 | 99国产成+人+综合+亚洲 欧美 | 97综合网 | av一级在线 | 国产一二区在线观看 | 国产日韩中文字幕 | www.久草.com| 97国产在线 | a级一a一级在线观看 | 99国产一区二区三精品乱码 | 97国产精品视频 | 国产精品久久久免费 | 久久久久久久久久久网 | 在线观看一级 | 手机在线小视频 | 国产精品综合久久 | 色婷婷综合在线 | 日韩免费电影一区二区 | 天天艹天天 | 精品一区二三区 | 欧洲一区精品 | 久久免费99精品久久久久久 | 午夜精品麻豆 | 成人三级黄色 | 国产视频99 | 在线黄色观看 | 欧美a在线看 | 国产美腿白丝袜足在线av | 摸bbb搡bbb搡bbbb | 夜夜操狠狠操 | av成人资源 | 久久久福利视频 | 免费网站黄 | 亚州人成在线播放 | 亚洲 成人 欧美 | 九九久久久久久久久激情 | av天天澡天天爽天天av | 91亚洲精品在线 | 国产手机在线播放 | 国产精品入口传媒 | 人人玩人人添人人澡超碰 | 国产aa免费视频 | 国产在线精品一区二区三区 | 欧美日韩精品在线视频 | 操碰av | 黄在线免费看 | 九色激情网 | 国内精品久久久久久久久 | 日韩黄色在线电影 | 亚洲欧美日韩一级 | 国产老太婆免费交性大片 | 久久噜噜少妇网站 | 18av在线视频 | 欧美极品在线播放 | 激情网五月 | 亚洲一区二区高潮无套美女 | 99久久久国产精品免费观看 | 午夜精品婷婷 | 国产精品视频久久 | 成人免费观看av | 开心激情五月网 | 久久久久久久久久久久亚洲 | www.色综合.com | 亚洲资源视频 | 亚洲四虎影院 | 日本最新一区二区三区 | 丁香亚洲| 黄色小说在线观看视频 | 欧美污污网站 | 久草爱视频 | 免费观看完整版无人区 | 国产精品久久久久aaaa九色 | av资源网在线播放 | 亚洲黄色高清 | av在线播放网址 | 欧美黄色免费 | 午夜电影av | 日韩系列 | 午夜精品视频一区 | 日韩videos高潮hd| 免费看的黄色片 | 免费在线看成人av | 中文字幕av在线免费 | 国产99久久99热这里精品5 | a√资源在线 | 欧美动漫一区二区三区 | 国产精品视屏 | 国产精品久久久久久av | adn—256中文在线观看 | 黄污视频网站 | 精品国产1区 | 国产中文字幕一区 | 久久另类小说 | 人人插人人射 | 国产视频精品免费播放 | 国产成人三级在线观看 | 日本精品久久久久 | 二区三区中文字幕 | www狠狠操| 国产 在线 日韩 | 九九热久久久 | 亚洲黄色a | 国内视频在线 | 日韩最新在线视频 | 免费观看成人网 | 精品999久久久 | 99精品视频在线播放观看 | 亚洲区二区 | 国产精品久久久久aaaa | 99精品国产在热久久 | 福利视频网址 | 国产一级淫片在线观看 | 亚洲精品天天 | 国产一级免费电影 | 综合网在线视频 | 久久av电影 | 国产第一页在线播放 | 亚洲国产操 | 久久免费视频观看 | 久久久久这里只有精品 | 久久人操| 麻豆国产露脸在线观看 | 四虎影视久久久 | 国产美女精彩久久 | 天天操天天干天天插 | 在线a人片免费观看视频 | 久久久国产视频 | 久久久久久黄色 | 精品国产成人av在线免 | 肉色欧美久久久久久久免费看 | 91成人免费观看视频 | 日韩在线在线 | 91免费的视频在线播放 | 日韩在线网址 | 久久99在线视频 | 久草av在线播放 | а天堂中文最新一区二区三区 | 久草视频免费看 | 爱干视频 | 国产精品欧美一区二区三区不卡 | 玖玖在线免费视频 | 伊人狠狠干 | 久久精品国产一区二区 | 久久少妇免费视频 | 色婷婷狠狠干 | 免费精品在线观看 | 中文字幕日韩在线播放 | 精品一区二区三区电影 | 久久99网 | 精品网站999www| 十八岁以下禁止观看的1000个网站 | 日韩免费在线播放 | 黄色成人影视 | 在线视频黄 | 99免费在线播放99久久免费 | 开心婷婷色| 日韩在线观看一区二区三区 | 国内精品中文字幕 | 亚洲蜜桃在线 | av免费看网站 | 免费高清在线观看成人 | av在线日韩| 91成品视频 | 日韩在线视频免费播放 | 亚洲黄色免费 | 玖玖在线看 | 欧美日韩亚洲在线观看 | 亚洲免费色 | 999视频在线播放 | 国产精品高清在线 | 欧美精品久久久久久 | 天天干天天综合 | 国产精品成人av久久 | 美女搞黄国产视频网站 | 99视频精品免费视频 | 中文不卡视频在线 | 成人性生交大片免费看中文网站 | 欧美影片 | 涩涩网站免费 | 久久永久免费 | 国内三级在线 | 天天躁天天狠天天透 | 日韩视频a | 午夜av在线播放 | 亚洲日本欧美在线 | 国产成人精品综合久久久 | 日韩免费视频在线观看 | 国产成年人av | av在线播放中文字幕 | 色婷婷九月 | 五月婷婷香蕉 | 亚洲视频一 | 日韩av视屏 | 天天做天天爱夜夜爽 | 五月婷婷激情网 | 在线免费中文字幕 | 五月婷色| 欧美9999 | 亚洲在线视频播放 | 美女黄视频免费 | 久久久在线 | 91在线视频播放 | 欧美日韩在线观看一区二区三区 | 91色网址| 天天干天天摸 | 狠狠干干 | 久久久久草 | 精品国产成人在线影院 | 亚洲撸撸 | 亚洲视频免费在线 | 欧美精品黑人性xxxx | 精品国产欧美 | 日韩精品中文字幕在线观看 | 成人h视频在线播放 | 狠狠干综合网 | av免费黄色 | 婷婷激情五月 | 婷婷国产一区二区三区 | 黄色性av| 天天弄天天操 | 在线观看黄色免费视频 | 2022久久国产露脸精品国产 | 亚洲日本va午夜在线电影 | 国产精品ⅴa有声小说 | 亚洲91精品在线观看 | 日韩剧| 成年人在线观看视频免费 | 国产在线探花 | 成人动漫一区二区 | 亚洲 欧洲 国产 精品 | 免费成人在线网站 | 日韩三级精品 | 免费亚洲电影 | 美女黄频 | 特级西西444www高清大视频 | 人人射网站 | 在线av资源 | 五月天亚洲婷婷 | 免费在线观看国产精品 | 成人av高清| 视频在线99 | 久久字幕网 | 免费在线观看黄 | 黄色日视频 | 99久久国产免费,99久久国产免费大片 | 日韩三级视频在线观看 | 国产精品中文久久久久久久 | 99久久婷婷 | 欧美日韩中文在线观看 | 色欲综合视频天天天 | a在线播放 | 欧美日韩aa | 九九综合九九 | 伊人永久 | 亚洲综合色网站 | 亚洲精品字幕在线观看 | 成人精品视频久久久久 | 顶级欧美色妇4khd | 97人人模人人爽人人少妇 | 精品国产_亚洲人成在线 | 国产看片网站 | 国产精华国产精品 | 免费h精品视频在线播放 | 亚洲午夜久久久久久久久电影网 | 丁香婷婷自拍 | 91精品国产九九九久久久亚洲 | 天天操天天干天天爱 | 国产一级视屏 | 中文电影网| 日韩v在线91成人自拍 | 国产精品情侣视频 | 国产精品视频免费在线观看 | 91成年人视频 | 狠狠色丁香 | 国产伦理一区二区三区 | 人人爽久久涩噜噜噜网站 | 五月婷婷在线视频 | 亚洲伊人网在线观看 | 国产老太婆免费交性大片 | 国产欧美日韩一区 | av手机在线播放 | 日产乱码一二三区别免费 | 中文字幕中文字幕在线中文字幕三区 | 91九色视频国产 | 在线观看久 | 精品一区二区在线免费观看 | 色综合色综合久久综合频道88 | 91人人澡人人爽人人精品 | 91精品欧美一区二区三区 | 精品国产综合区久久久久久 | 麻豆久久久 | 日韩高清在线一区二区 | 欧美日本不卡高清 | 人人玩人人添人人 | 涩涩网站在线 | 91成人区 | 国产精品一区二区三区观看 | 亚洲专区欧美 | 日韩激情网 | 天天射网 | 99久久精品国产毛片 | 久久图 | 激情动态 | 91精品国自产在线观看欧美 | 国产v亚洲v | 人成在线免费视频 | 日本一区二区三区视频在线播放 | 久久久一本精品99久久精品66 | 国产美女免费看 | 午夜精品久久久久久中宇69 | 日韩久久精品一区二区三区 | 狠狠88综合久久久久综合网 | 色婷婷免费 | 在线观看成年人 | 精品中文字幕在线播放 | 色视频国产直接看 | 狠狠干网 | 日韩1页 | 久久久精品国产免费观看一区二区 | 日韩高清在线一区二区 | 日韩区欠美精品av视频 | av网站大全免费 | 精选久久 | 国产精品成人免费一区久久羞羞 | 99久久久国产精品免费观看 | 99国产精品免费网站 | 看国产黄色片 | 欧美激情第八页 | 亚洲精品视频在线免费播放 | 就色干综合 | 狠色在线 | 玖玖在线视频观看 | 精品国产一区在线观看 | 国产成人一区二区三区影院在线 | 国产精品久久久久久久99 | 亚洲免费av一区二区 | 日韩精品久久久 | 国产精品69久久久久 | 亚洲在线视频观看 | 亚洲精品视频在线观看网站 | 天天激情综合 | 69性欧美 | 久久精品视频免费 | 四虎成人精品在永久免费 | 99精品国产免费久久 | 亚洲三级黄色 | 99久久久久成人国产免费 | 国产一卡二卡四卡国 | 在线看成人 | 99精品久久久久 | 在线观看91网站 | 香蕉色综合 | 永久精品视频 | 能在线观看的日韩av | 免费网站观看www在线观看 | 五月婷婷中文网 | 亚洲成人家庭影院 | 国产精品综合av一区二区国产馆 | 亚洲福利精品 | 免费日韩视| 99视频一区二区 | 日韩中文字幕视频在线观看 | 99国产精品久久久久久久久久 | 亚洲精品国久久99热 | 韩国av电影网 | 欧美一区三区四区 | 97免费公开视频 | 丁香av | 国产精品久久久久影院日本 | 91视频在线免费下载 | 久久久www | 波多野结衣视频一区二区 | 国产精品久久久久四虎 | 91精品啪在线观看国产 | 日日干日日色 | 亚洲精品综合一区二区 | 日韩视频在线观看免费 | 国产最新视频在线观看 | 欧美淫视频| 色噜噜在线观看 | 超碰人人射 | 久久成人在线视频 | 在线观看911视频 | 看毛片的网址 | 久久久久国产精品免费 | 日韩网站在线 | 四虎欧美 | 日韩欧美在线视频一区二区三区 | 久久久久国产精品www | 免费观看版 | 国产日韩欧美视频在线观看 | 国产精品尤物 | 欧美大片在线观看一区 | 午夜精品一区二区三区视频免费看 | 亚洲天堂网在线视频 | 深夜免费小视频 | 亚洲精品久久久久58 | 黄色动态图xx | 天干啦夜天干天干在线线 | 香蕉在线视频观看 | 人人爽影院| 视频三区 | 中文字幕色婷婷在线视频 | 亚洲精品美女视频 | 日韩成人免费在线 | 国产黄色成人av | 日韩av一区二区在线影视 | 亚洲精品男人的天堂 | 国语精品免费视频 | 中日韩三级视频 | 欧美日本高清视频 | 91成人在线看 | 国产成人久 | 亚洲天堂网在线播放 | 久久五月婷婷丁香 | 日韩午夜大片 | 久久99这里只有精品 | 中文字幕在线观看一区二区 | 98超碰人人| 免费观看性生活大片 | 91免费视频国产 | 久久精品国产一区 | 国产一区二区在线播放视频 | 国产成人精品女人久久久 | 日本精品久久久久中文字幕 | 最近2019中文免费高清视频观看www99 | 狠狠干在线 | 欧洲视频一区 | 国产一卡在线 | 中文字幕日韩有码 | 国产精品久久久久久久久免费 | 日本精品一区二区三区在线播放视频 | 日韩欧美国产激情在线播放 | 精品福利视频在线 | 日日夜夜综合网 | 97高清视频 | 最新黄色av网址 | 日韩国产欧美在线视频 | 精品国产免费av | 久久一区二区三区国产精品 | 亚洲成人软件 | 久久国产精品99久久人人澡 | 五月婷婷丁香在线观看 | 国产精品久99| 久久草在线免费 | 免费热情视频 | 免费看一级黄色大全 | 在线黄色毛片 | 免费视频成人 | 成人在线免费视频 | 丁香婷婷激情 | 亚洲精品一区二区网址 | 蜜臀久久99精品久久久无需会员 | 九九久久国产 | av一级片网站 | 人人插人人搞 | 午夜影院一级片 | 国内视频一区二区 | 天天超碰 | 最近日本字幕mv免费观看在线 | 99久久久精品 | 欧美精品久久久久久久亚洲调教 | 久久成人免费 | 欧美激情精品久久久久久免费 | 中文字幕一区二 | 人人爽影院| 国产精品久久久久久av | 日本中文字幕在线播放 | 欧美久久精品 | 中文字幕一区二区三区在线观看 | 久久精品96 | 欧美在线18 | 黄色app网站在线观看 | 我要色综合天天 | 97精品国产97久久久久久粉红 | 国产一区麻豆 | 97超碰人人澡人人爱学生 | 91人人澡人人爽 | 激情综合网在线观看 | 国产五月天婷婷 | 免费在线观看视频一区 | 久久激情网站 | 中文字幕永久在线 | 特级黄录像视频 | 在线 精品 国产 | 精品黄色在线 | 亚洲 成人 一区 | 亚洲国产精品成人va在线观看 | 国产黄网站在线观看 | 超碰97在线资源 | 久久99最新地址 | 女人18片 | 国产女人40精品一区毛片视频 | 久久国产精品久久w女人spa | 国产成人一区二区在线观看 | 日韩免费视频在线观看 | 在线播放精品一区二区三区 | 国产精品中文久久久久久久 | 日韩午夜av | 中文字幕在线一二 | 色综合天天 | 日本中文在线播放 | 91久久精品一区二区三区 | 久久av免费 | 蜜桃av综合网| 久艹在线播放 | 人人天天夜夜 | 99精品国产一区二区三区不卡 | 久久久久免费精品视频 | 蜜桃麻豆www久久囤产精品 | 97色视频在线 | 91女子私密保健养生少妇 | 成人在线播放网站 | av网站地址| 五月天网站在线 | 亚洲国产高清视频 | 99福利片 | av免费在线免费观看 | 香蕉色综合 | 天天射天天干天天插 | 日本特黄特色aaa大片免费 | 亚洲日本va午夜在线影院 | av在线一 | 欧美日韩国产精品久久 | 亚洲五月婷 | 国产精品久久久久久久久免费 | 久久精品成人欧美大片古装 | 欧洲成人免费 | 亚洲国产理论片 | 久久新| 天天综合成人 | 欧美国产精品久久久久久免费 | 五月黄色| 天天干天天爽 | 久草在线观 | 免费观看一区 | 欧美日韩高清一区 | 精品视频免费观看 | 国产在线播放一区二区三区 | 9在线观看免费高清完整 | 国产破处在线视频 | 久久欧美精品 | 日韩高清在线一区 | 欧美日韩国产免费视频 | 亚洲欧洲精品久久 | 日韩一区二区三区高清在线观看 | 丁香五月缴情综合网 | 99精品一级欧美片免费播放 | 久草青青在线观看 | 久草在线视频资源 | 国产在线国偷精品产拍 | 成人三级黄色 | 在线视频欧美日韩 | 久久久久日本精品一区二区三区 | 久热免费 | 国产精品一区二区在线看 | 免费aa大片 | 99精品国产一区二区三区不卡 | 欧洲激情综合 | 色婷婷国产在线 | 久久视频免费在线观看 | 999久久国产| 欧美日本高清视频 | 日韩久久一区 | 六月激情久久 | 久久久久观看 | 国产一区观看 | 97超在线视频 | 亚洲国产精品久久久 | 波多野结衣视频一区 | 五月天亚洲婷婷 | 成人欧美一区二区三区黑人麻豆 | 99国内精品久久久久久久 | 在线a亚洲视频播放在线观看 | 亚洲精品高清在线观看 | 深爱开心激情网 | 日韩精品一区二区在线观看 | 午夜少妇av | 日日草天天草 | 亚洲免费不卡 | 欧美日本在线视频 | 伊人亚洲综合网 | 黄色国产在线观看 | 中文视频一区二区 | av免费在线观看网站 | 97品白浆高清久久久久久 | 成人网在线免费视频 | av在线免费播放 | av九九九 | 精品产品国产在线不卡 | 成人国产精品一区二区 | 亚洲欧美国产精品 | 五月婷网站 | 人人射av | 欧美国产亚洲精品久久久8v | av片在线观看免费 | 一级黄网| 美女在线观看av | 三上悠亚在线免费 | 婷婷六月丁 | 国产在线视频一区 | 亚洲日本va午夜在线电影 | 国内视频1区 | a v在线观看| 久久这里精品视频 | 欧美日韩国产精品一区二区亚洲 | 色综合久久久久综合体桃花网 | 国产一二区视频 | 国产精品porn | 久久综合国产伦精品免费 | 欧美一区二区三区激情视频 | 国产精品黄色 | 综合网婷婷 | 香蕉国产91 | 亚洲v精品| 久久精品中文字幕一区二区三区 | 91亚洲精品视频 | 九九热中文字幕 | 午夜12点 | 成年人在线播放视频 | 色香蕉网| 成人在线免费观看网站 | 精品国产伦一区二区三区免费 | 又大又硬又黄又爽视频在线观看 | 欧美精品久久久久久久久久白贞 | 亚洲国产av精品毛片鲁大师 | 99精品视频免费在线观看 | 天无日天天操天天干 | 成人a在线观看高清电影 | 久久人人爽爽人人爽人人片av | 99久久婷婷国产一区二区三区 | 国产午夜精品视频 | 国内精品久久久久影院日本资源 | 日日成人网| 久久视频二区 | 久久视频在线看 | 欧洲亚洲女同hd | 久久怡红院 | 久久婷婷一区二区三区 | 顶级bbw搡bbbb搡bbbb | av在线看网站| 国产精彩视频一区 | 在线观看国产永久免费视频 | 一区二区三区四区五区在线 | 色婷婷激婷婷情综天天 | 在线播放亚洲激情 | 99久久久国产精品免费观看 | 久久精品99国产精品亚洲最刺激 | 福利一区二区三区四区 | 亚洲国产欧美一区二区三区丁香婷 | 在线 影视 一区 |