• 使用socket实现即时通讯


    服务端和客户端分为两个不同的项目
    服务端项目代码
    
    package com.tszr;
    
    import com.alibaba.fastjson.JSONObject;
    import org.slf4j.Logger;
    import org.slf4j.LoggerFactory;
    
    import java.io.ObjectInputStream;
    import java.io.ObjectOutputStream;
    import java.net.Socket;
    
    public class ServerReceiveThread implements Runnable {
    
        private Socket socket;
    
        private static Logger log = LoggerFactory.getLogger(ServerReceiveThread.class);
    
        public ServerReceiveThread(Socket socket) {
            this.socket = socket;
        }
    
        @Override
        public void run() {
            try {
                //输入流接收数据
                ObjectInputStream ois = new ObjectInputStream(socket.getInputStream());
                //输出流发送数据
                ObjectOutputStream oos = new ObjectOutputStream(socket.getOutputStream());
    
                while (true) {
                    JSONObject jsonObject = (JSONObject) ois.readObject();
                    System.out.println(jsonObject.toJSONString());
                    String message = jsonObject.getString("msg");
                    if ("close".equals(message)) {
                        oos.writeUTF("close");
                        oos.flush();
                        break;
                    } else {
                        oos.writeUTF("接收数据成功" + message);
                        oos.flush();
                    }
                }
                log.info("服务端关闭客户端[{}]", socket.getRemoteSocketAddress());
                oos.close();
                ois.close();
                socket.close();
            } catch (Exception e) {
                log.info("接收数据异常socket关闭");
                e.printStackTrace();
            } finally {
                log.info("数据异常数据要怎么保留");
            }
        }
    }
    package com.tszr;
    
    import org.slf4j.Logger;
    import org.slf4j.LoggerFactory;
    import org.springframework.context.annotation.Bean;
    import org.springframework.stereotype.Component;
    
    import java.io.IOException;
    import java.net.ServerSocket;
    import java.net.Socket;
    import java.util.concurrent.LinkedBlockingQueue;
    import java.util.concurrent.ThreadPoolExecutor;
    import java.util.concurrent.TimeUnit;
    
    @Component
    public class ServerSocketConfig {
    
        private static Logger log = LoggerFactory.getLogger(ServerSocketConfig.class);
    
        public static ServerSocket serverSocket = null;
    
        private static final ThreadPoolExecutor threadpool = new ThreadPoolExecutor(15, 15,
                10L, TimeUnit.SECONDS, new LinkedBlockingQueue<Runnable>());
    
        @Bean
        public void socketCreate() {
            try {
                serverSocket = new ServerSocket(5030);
                log.info("socket服务端开启");
                while (true){
                    Socket socket = serverSocket.accept();
                    System.out.println("接收到客户端socket" + socket.getRemoteSocketAddress());
                    threadpool.execute(new ServerReceiveThread(socket));
                }
            } catch (IOException e) {
                log.info("socket服务启动异常");
                e.printStackTrace();
            }
        }
    }
    package com.tszr;
    
    import org.springframework.boot.SpringApplication;
    import org.springframework.boot.autoconfigure.SpringBootApplication;
    
    @SpringBootApplication
    public class SocketServerApp {
        public static void main(String[] args){
            SpringApplication.run(SocketServerApp.class,args);
        }
    }
    server:
      port: 5030
    客户端代码
    
    package com.tszr;
    
    import com.alibaba.fastjson.JSONObject;
    
    import java.io.ObjectInputStream;
    import java.io.ObjectOutputStream;
    import java.net.Socket;
    
    public class ClientHeartThread implements Runnable{
    
        private String host;
        private int port;
    
        public ClientHeartThread(String host, int port){
            this.host = host;
            this.port = port;
        }
    
        @Override
        public void run() {
            try {
                Socket socket = new Socket(host,port);
                System.out.println("心跳socket链接成功");
                //输出流写数据
                ObjectOutputStream oos = new ObjectOutputStream(socket.getOutputStream());
                //输入流读数据
                ObjectInputStream ois = new ObjectInputStream(socket.getInputStream());
                int i =0;
                while (true){
                    Thread.sleep(3000);
                    JSONObject jsonObject = new JSONObject();
                    jsonObject.put("type","heart");
                    jsonObject.put("msg","第"+i+"次心跳");
                    System.out.println("发送心跳socket");
                    oos.writeObject(jsonObject);
                    oos.flush();
                    i++;
                    String message = ois.readUTF();
                    System.out.println("接收到服务端响应"+message);
                    if("close".equals(message)){
                        break;
                    }
                }
                ois.close();
                oos.close();
                socket.close();
            } catch (Exception e) {
                e.printStackTrace();
            }
        }
    }
    package com.tszr;
    
    import com.alibaba.fastjson.JSONObject;
    import java.io.IOException;
    import java.io.ObjectInputStream;
    import java.io.ObjectOutputStream;
    import java.net.Socket;
    import java.util.Scanner;
    
    public class ClientPrintThread implements Runnable{
    
        private String host;
        private int port;
    
        public ClientPrintThread(String host,int port){
            this.host = host;
            this.port = port;
        }
        @Override
        public void run() {
            try {
                Socket socket = new Socket(host,port);
                System.out.println("业务socket链接成功");
               // 输出流写数据
                ObjectOutputStream oos = new ObjectOutputStream(socket.getOutputStream());
                Scanner scanner = new Scanner(System.in);
                //输入流读数据
                ObjectInputStream ois = new ObjectInputStream(socket.getInputStream());
                while (true){
                    String str = scanner.nextLine();
                    JSONObject jsonObject = new JSONObject();
                    jsonObject.put("type","body");
                    jsonObject.put("msg",str);
                    oos.writeObject(jsonObject);
                    oos.flush();
                    //写的部分
                    String message = ois.readUTF();
                    System.out.println("接收到服务端响应"+message);
                    if("close".equals(message)){
                        break;
                    }
                }
                ois.close();
                oos.close();
                socket.close();
            } catch (IOException e) {
                e.printStackTrace();
            }
        }
    }
    package com.tszr;
    
    import java.util.concurrent.ExecutorService;
    import java.util.concurrent.Executors;
    
    public class App {
        private static final ExecutorService executorService = Executors.newFixedThreadPool(5);
        private static String host = "127.0.0.1";
        private static int port = 5030;
    
        public static void main(String[] args){
            executorService.execute(new ClientHeartThread(host,port));
            executorService.execute(new ClientPrintThread(host,port));
        }
    }
  • 相关阅读:
    面向对象程序设计第五次作业(修改)
    C++作业 一
    面向对象程序设计第四次作业
    面向对象程序设计第三次作业
    C++学习笔记3
    C++学习笔记2
    C++学习笔记1
    面向对象程序设计作业二
    面向对象程序设计第二次作业
    随笔
  • 原文地址:https://www.cnblogs.com/tszr/p/16181927.html
Copyright © 2020-2023  润新知