Javaベースのマルチスレッドのチャットルーム
クライアント:
パブリック クラスMultiThreadClient {
プライベート 静的 クラスRecMsgはRunnableを実装して、{
プライベートソケットクライアントを、
公共RecMsg(ソケットクライアント){
この .client = クライアント。
}
@Override
公共 ボイドラン(){
スキャナSC = NULL ;
試す{
SC = 新しいスキャナ(client.getInputStream())。
} キャッチ(IOExceptionを電子){
e.printStackTrace();
}
一方、(真){
場合(client.isClosed()){
システム。アウト .println(" 客户端退出" );
破ります;
}
であれば(sc.hasNextLine()){
システム。アウト .println(" 服务端说:" + sc.nextLine());
}
}
)(sc.close。
}
}
プライベート 静的 クラスSENDMSGは{Runnableを実装
プライベートソケットクライアント;
公共SENDMSG(ソケットクライアント){
この .client = クライアント。
}
@Override
公共 ボイドラン(){
スキャナSC = 新しいスキャナ(システム。で);
PrintStream psの = nullを。
試す{
PS = 新しいのPrintStream(client.getOutputStream()、真、" UTF-8 " );
} キャッチ(IOExceptionを電子){
e.printStackTrace();
}
一方(真){
システム。アウト .println(" 请输入内容" );
文字列str = sc.nextLine()。
ps.println(STR)。
もし(str.contains(" BYE " )){
ブレーク。
}
}
ps.close()。
sc.close();
}
}
パブリック 静的 ボイドメイン(文字列[]引数)はIOExceptionが{スロー
ソケットSC = 新しいソケット(「127.0.0.1 」、8888 )。
新しいスレッド(新しいRecMsg(SC))(開始)。
新しいスレッド(新しいSENDMSG(SC)))(開始。
}
}
サーバー:
public class MultiThreadServer {
//保存所有连接的客户端
private static Map<String, Socket> clientMap = new ConcurrentHashMap<>();
private static class ExecuteClientMap implements Runnable{
private Socket client;
public ExecuteClientMap(Socket client) {
this.client = client;
}
@Override
public void run() {
Scanner sc = null;
try {
sc = new Scanner(client.getInputStream());
} catch (IOException e) {
e.printStackTrace();
}
while(true){
if(sc.hasNextLine()){
String msgFromClient = sc.nextLine();
if(msgFromClient.startsWith("R:")){
//注册
//用户名
String username = msgFromClient.split(":")[1];
userRegister(username,client);
}else if(msgFromClient.startsWith("P:")){
//私聊P:用户名-信息
String userName = msgFromClient.split(":")[1].split("-")[0];
String msg = msgFromClient.split("-")[1];
sendPriUser(userName,msg);
}else if(msgFromClient.startsWith("G:")){
//群聊
String groupMsg = msgFromClient.split(":")[1];
group(groupMsg);
}
}
}
}
private void sendPriUser(String userName,String msg) {
Socket sc = clientMap.get(userName);
PrintStream ps = null;
try {
ps = new PrintStream(sc.getOutputStream());
} catch (IOException e) {
e.printStackTrace();
}
ps.println("私聊信息为:"+msg);
ps.close();
try {
sc.close();
} catch (IOException e) {
e.printStackTrace();
}
}
private void userRegister(String username, Socket client) {
clientMap.put(username,client);
String str = username+"上线了";
group(str);
}
private void group(String str) {
Collection<Socket> values = clientMap.values();
for(Socket sc : values){
PrintStream ps = null;
try {
ps = new PrintStream(sc.getOutputStream());
} catch (IOException e) {
e.printStackTrace();
}
ps.println(str);
}
}
}
public static void main(String[] args) throws IOException {
ServerSocket ss = new ServerSocket(8888);
ExecutorService executorService = Executors.newFixedThreadPool(20);
for(int i = 0;i<20;i++){
System.out.println("等待客户端连接");
Socket sc = ss.accept();
System.out.println("连接成功,端口号为:"+sc.getPort());
//新建一个线程处理客户端的连接
executorService.submit(new ExecuteClientMap(sc));
}
ss.close();
}
}