乐趣区

关于javascript:java实现多客户聊天功能

java 实现多客户端聊天(TCP),供大家参考,具体内容如下

  1. 编程思维:
    1)、要想实现多客户端聊天,首先须要有多个客户端,而这些客户端须要随时发送音讯和承受音讯,所以收发音讯须要放入不同的线程中。

2)、多客户聊天并不是多个客户之间进行两两通信,而是须要所有客户端与服务端进行交互,再由服务端对立下发信息到其余参加聊天的客户端。

  1. 代码实现:
    2.1 实现专用于接管音讯的子线程 ReceiveThread

将接管音讯和发送音讯分为两个线程,其中将发送音讯写入主线程中,开启新的线程用于接管音讯。

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.net.Socket;
 
public class ReceiveThread extends Thread{
 
 private Socket socket; // 公有的成员变量,套接字
 
 public ReceiveThread(Socket socket) {this.socket = socket;}
 
 @Override
 public void run() {
  BufferedReader br = null;// 应用带缓冲区的字符输出流接管信息
  try {br = new BufferedReader(new InputStreamReader(socket.getInputStream()));
  } catch (IOException e) {e.printStackTrace();
  }
  while(true){
   try {System.out.println(br.readLine());
   } catch (IOException e) {e.printStackTrace();
   }
  }
 }
}

2.2 客户端代码

import java.io.IOException;
import java.io.PrintStream;
import java.net.Socket;
import java.net.UnknownHostException;
import java.util.Scanner;
 
public class Client {@SuppressWarnings("all")
 public static void main(String[] args) throws UnknownHostException, IOException {
        //ip:须要连贯的服务端所在的 ip
        // 端口:客户端连贯的端口必须和服务端端口统一
  Socket socket = new Socket("192.168.*.*",8080);
  Scanner scan = new Scanner(System.in);
  new ReceiveThread(socket).start();
  // 发送给服务端信息
  while(true){PrintStream ps = new PrintStream(socket.getOutputStream());
   ps.println("一号:"+scan.next());
  }
 }
}

注:

1)、客户端代码能够在局域网下的多台电脑上运行,只须要将 ip 地址改为服务端的 ip,就可能连贯。

2)、如果想要应用同台电脑实现一个服务端和两个客户端运行,进行测试多人聊天,可创立客户端 2,应用本机 ip

Socket socket = new Socket("127.0.0.1",8080);
Scanner scan = new Scanner(System.in);
new ReceiveThread(socket).start();
// 发送给服务端信息
while(true){PrintStream ps = new PrintStream(socket.getOutputStream());
    ps.println("二号:"+scan.next());
}

2.3 服务端接管和转发信息的线程 ServerThread

服务端在每一个客户端进行连贯时,都会产生一个线程,用于服务这个客户,负责接管该客户发送的信息,并转发到参加多人聊天的其余客户。

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.PrintStream;
import java.net.InetAddress;
import java.net.Socket;
import java.util.Map.Entry;
import java.util.Set;
 
public class ServerThread  extends Thread{
 
 private Socket socket;
 
 public ServerThread(Socket socket) {this.socket = socket;}
 @Override
 public void run() {
  BufferedReader br = null;
  String str=null;
  try {br = new BufferedReader(new InputStreamReader(socket.getInputStream()));
  } catch (IOException e) {e.printStackTrace();
  }
  while(true){
   try {str=br.readLine();
                // 在服务端输入,能够监测到所有人的聊天信息。System.out.println(str);
 
    // 发送到其余客户端
    Set<Entry<InetAddress, Socket>> entrySet = Server.map.entrySet();
    for (Entry<InetAddress, Socket> entry : entrySet) {InetAddress key = entry.getKey();
     Socket value = entry.getValue();
     if(socket.getInetAddress()!=key){PrintStream printStream = new PrintStream(value.getOutputStream());
      printStream.println(str);
     }
    }
 
   } catch (IOException e) {e.printStackTrace();
   }
  }
 }
}

2.4 服务端代码

import java.io.IOException;
import java.net.InetAddress;
import java.net.ServerSocket;
import java.net.Socket;
import java.util.concurrent.ConcurrentHashMap;
 
public class Server {@SuppressWarnings("all")
 
 public static ConcurrentHashMap<InetAddress, Socket> map =new ConcurrentHashMap<>();
 public static void main(String[] args) throws IOException, InterruptedException {
 
  // 创立服务端的 ServerSocket
  ServerSocket server = new ServerSocket(8080);
  while(true){
            // 接管到客户连贯就创立一个对应的套接字
   Socket socket = server.accept();
            // 获取该客户的 ip
   InetAddress inetAddress = socket.getInetAddress();
   // 将该客户的 ip 和套接字装入 map 汇合
   map.put(inetAddress, socket);
            // 创立新的线程服务该客户
   new ServerThread(socket).start();}
 }
}

以上就是本文的全部内容,心愿对大家的学习有所帮忙

退出移动版