聊天软件Socket网络编程循环收发消息群聊实现-----聊天软件

#全新智己L6全国试驾开启#

Socket网络编程循环收发消息群聊实现

package com.alatus.ourApp.test;

import java.io.*;
import java.net.ServerSocket;
import java.net.Socket;
import java.util.HashMap;
import java.util.Map;

public class SocketServer {
    public static void main(String[] args) {
        Map<String,Socket> socketMap = new HashMap<>();
        try {
//            首先我们建立了服务用于接收所有访问我这个IP这个端口的请求
            ServerSocket ss = new ServerSocket(8868);
            System.out.println("服务已启动,等待客户端连接");
            while(true){
                //            任何请求进来都是一个Socket
                Socket accept = ss.accept();
                String ip = accept.getInetAddress().getHostAddress();
                System.out.println("有客户端连接了"+ip+"端口"+accept.getPort());
                socketMap.put(ip+accept.getPort(),accept);
                new Thread(new Runnable() {
                    @Override
                    public void run() {
                        while (true){
                            try{
//            我们这边要做流式连接
//            我可以通过这个Socket获取输入流
                                InputStream inputStream = accept.getInputStream();
                                InputStreamReader inputStreamReader = new InputStreamReader(inputStream);
//            输入流信息是不能直接获取的,需要通过BufferedReader装载
                                BufferedReader bufferedReader = new BufferedReader(inputStreamReader);
                                String readLine = bufferedReader.readLine();
                                System.out.println("客户端的消息:"+readLine);
//            接下来从我们包装过的BufferedReader中读取信息
                                for (Map.Entry<String, Socket> entry : socketMap.entrySet()) {
                                    Socket socket = entry.getValue();
                                    try {
                                        OutputStream outputStream = socket.getOutputStream();
                                        PrintWriter printWriter = new PrintWriter(outputStream);
                                        printWriter.println(accept.getPort()+":" + readLine);
                                        printWriter.flush();
                                    } catch (Exception e) {
                                        e.printStackTrace();
                                        break;
                                    }
                                }
                            }
                            catch (Exception e) {
                                break;
                            }
                        }
                    }
                }).start();
            }
        } catch (Exception e) {
            e.printStackTrace();
        }
    }
}
package com.alatus.ourApp.test;

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

public class SocketClient {
    public static void main(String[] args) {
        try {
//            只要我们知道对方的ip和端口号,就可以直接连接上对方
            Socket socket = new Socket("127.0.0.1",8868);
//            我们需要发送消息,就需要这个虚拟连接的输出流
            OutputStream out = socket.getOutputStream();
//            输出流封装,使用PrintWriter来输出,我们需要输入流,写入这个输出流内
            PrintWriter printWriter = new PrintWriter(out);
            System.out.println("请输入内容");
            Scanner scanner = new Scanner(System.in);
            new Thread(()->{
                while(true){
                    String input = scanner.nextLine();
//            输入流就直接把客户端输入的东西写进去这个输出流,对方就会收到
                    printWriter.println(input);
//            关闭这个输出流
                    printWriter.flush();
                }
            }).start();
            new Thread(()->{
                while(true){
                    try{
                        InputStream inputStream = socket.getInputStream();
                        InputStreamReader inputStreamReader = new InputStreamReader(inputStream);
                        BufferedReader bufferedReader = new BufferedReader(inputStreamReader);
                        System.out.println(bufferedReader.readLine());
                    }
                    catch (Exception e){
                        break;
                    }
                }
            }).start();
        }
        catch (Exception e) {
            e.printStackTrace();
        }
    }
}
原文链接:,转发请注明来源!