基于Socket实现的简易聊天程序【JAVA】

简单的聊天程序:

客户端

  • 开启了两个线程,分别是监听线程,用于监听服务端发过来或者转发过来的信息

  • 输入线程,用于实时监听键盘的输入

服务端

  • 实现了好友互发信息
  • 上线好友通知
package com.lee.code.replace;

import java.io.*;
import java.net.Socket;
import java.util.Scanner;

/**
 * @description:
 * @author: 
 * @create: 2020-12-28
 */
public class Client {


    public static void main(String[] args) {
        try {
            Socket socket = new Socket("127.0.0.1",8882);
            Thread t1 = new Thread(new Writer(socket));
            Thread t2 = new Thread(new Listener(socket));
            t1.start();
            t2.start();

        } catch (IOException e) {
            e.printStackTrace();
        }

    }
     static class Writer implements Runnable{
         Socket socket;

         public Writer(Socket socket){
             this.socket = socket;
         }
         @Override
         public void run() {

             try{
             InputStream in = socket.getInputStream();
                 BufferedReader reader = new BufferedReader(new InputStreamReader(in));
                 while(true){
                 String msg = reader.readLine();
                 System.out.println(msg);
             }
             }catch (Exception e){

             }
         }
     }
     //监听线程
     static class Listener implements Runnable{
         Socket socket ;
         public Listener(Socket socket){
             this.socket = socket;
         }

         @Override
         public void run() {
             try {
                     OutputStream out = socket.getOutputStream();
                     BufferedWriter pw = new BufferedWriter(new OutputStreamWriter(out));
                 while(true){
                     Scanner scanner = new Scanner(System.in);
                     String text = scanner.next() + "\n";
                     pw.write(text);
                     pw.flush();
                 }

             } catch (IOException e) {
                 e.printStackTrace();
             }
         }
     }


}
package com.lee.code.replace;

import java.io.*;
import java.net.ServerSocket;
import java.net.Socket;
import java.util.*;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;

/**
 * @description:  Server
 * @author: 
 * @create: 2020-12-28
 */
public class Server {
    /**
     * 在线用户列表
     */
    Map<String, PrintWriter> loginUsers = new HashMap<>();

    //在线好友列表
    static Map<String, List<String>> friendsList = new HashMap<>();

    static {
        friendsList.put("杨老板", Arrays.asList(new String[]{"黄老二"}));
        friendsList.put("黄老二", Arrays.asList(new String[]{"杨老板", "李老板"}));
        friendsList.put("李老板", Arrays.asList(new String[]{"黄老二", "李老三"}));
    }

    public void listen() {
        try {
            ServerSocket serverSocket = new ServerSocket(8882);
            while (true) {
                Socket socket = serverSocket.accept();
                ClientHandler clientHandler = new ClientHandler(socket);
                ExecutorService executorService = Executors.newFixedThreadPool(100);
                executorService.execute(clientHandler);
            }
        } catch (IOException e) {
            e.printStackTrace();
        }
    }


    public static void main(String[] args) {
        LeeServer server = new LeeServer();
        server.listen();

    }


    public List<String> getOnlineFriends(String username) {
        List<String> onlinePersons = new ArrayList<>(loginUsers.keySet());
        List<String> tempList = new ArrayList<>();
        tempList.addAll(friendsList.get(username));
        tempList.retainAll(onlinePersons);
        return tempList;
    }

    public class ClientHandler implements Runnable {

        private Socket socket;

        public ClientHandler(Socket socket) {
            this.socket = socket;
        }



        public synchronized  void sendMsg(String msg) throws IOException {
            if(socket == null) throw new RuntimeException("socket is null");
            OutputStream out = socket.getOutputStream();
            PrintWriter pw = new PrintWriter(new OutputStreamWriter(out), true);
            pw.println(msg);
        }

        public synchronized  void sendMsg(PrintWriter writer,String msg) throws IOException {
            writer.println(msg);
        }
        @Override
        public void run() {
            try {
                InputStream in = socket.getInputStream();
                OutputStream out = socket.getOutputStream();
                PrintWriter pw;
                BufferedReader bufferedReader;
                String loginUserName;
                pw = new PrintWriter(new OutputStreamWriter(out), true);
                bufferedReader = new BufferedReader(new InputStreamReader(in));
                while (true) {
                    sendMsg("【登录】请输入用户名:");
                    loginUserName = bufferedReader.readLine();
                    if (!friendsList.containsKey(loginUserName)) {
                        sendMsg("没有查到该用户" + "\n");
                    } else {
                        loginUsers.put(loginUserName, pw);
                        List<String> friends = friendsList.get(loginUserName);
                        List<String> onlineFriends = getOnlineFriends(loginUserName);
                        sendMsg("您的好友列表:" + friends);
                        sendMsg("您的在线好友:" + onlineFriends);
                        //并将上线的消息广播给所有在线好友
                        for (String onlineFriend : onlineFriends) {
                            PrintWriter outPrint = loginUsers.get(onlineFriend);
                            sendMsg(outPrint,loginUserName+"上线啦");
                        }
                        break;
                    }
                }
                while (true) {
                    //想谁发信息
                    sendMsg("发送给:");
                    String friendName = bufferedReader.readLine();
                    if (friendsList.get(loginUserName).indexOf(friendName) != -1) {
                        if (loginUsers.get(friendName) != null) {
                            sendMsg("[TO:]" + friendName + ":" + "\n");
                            String line = bufferedReader.readLine();
                            PrintWriter outPut = loginUsers.get(friendName);
                            sendMsg(outPut,"[from:" + loginUserName + "]" + line );
                        } else {
                            sendMsg("该好友不在线");
                        }
                    } else {
                        sendMsg("该好友不存在");
                    }
                }
            } catch (IOException e) {
                e.printStackTrace();
            }

        }
    }


}





 

  • 0
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值