java socket长连接服务端的实现

网络编程都是最底层都是基于socket的,鉴于客户端需要一直发送消息,使用短连接就不适合了,因为建立socket连接后发送完数据又马上断开连接。而长连接通过客户端的心跳机制一直保持连接,不管当前是否接收和发送数据。长连接服务端代码如下:

package com.starit.ipran.socket;
 
 
import java.io.BufferedReader;
import java.io.BufferedWriter;
import java.io.InputStreamReader;
import java.io.OutputStreamWriter;
import java.net.ServerSocket;
import java.net.Socket;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
 
 
import com.starit.ipran.kafka.KafkaUtils;
import com.starit.ipran.load.Constants;
import com.starit.ipran.model.IpranAlarm;
import com.starit.ipran.util.EncodeUtils;
 
 
public class SocketServer {
	
	private final static Logger LOGGER = LoggerFactory.getLogger(SocketServer.class);
	   
    public void startAction(){  
        ServerSocket serverSocket=null;  
        try {  
            serverSocket=new ServerSocket(Constants.SOCKET_PORT);  //端口号
            LOGGER.info("服务端服务启动监听:");
            //通过死循环开启长连接,开启线程去处理消息
            while(true){  
                Socket socket=serverSocket.accept();  
                new Thread(new MyRuns(socket)).start();  
            }  
        } catch (Exception e) {  
            e.printStackTrace();  
        } finally {  
            try {  
                if (serverSocket!=null) {  
                    serverSocket.close();  
                }  
            } catch (Exception e2) {  
                e2.printStackTrace();  
            }  
        }  
    }  
      
    class MyRuns implements Runnable{
          
        Socket socket;  
        BufferedReader reader;  
        BufferedWriter writer;  
  
        public MyRuns(Socket socket) {  
            super();  
            this.socket = socket;  
        }  
  
        public void run() {  
            try {  
                reader = new BufferedReader(new InputStreamReader(socket.getInputStream()));//读取客户端消息  
                writer=new BufferedWriter(new OutputStreamWriter(socket.getOutputStream()));//向客户端写消息
                String lineString="";  
               
                while(!(lineString=reader.readLine()).equals("bye")){
                	LOGGER.info("收到来自客户端的发送的消息是:" + lineString);
                    writer.write("服务器返回:"+lineString+"\n");  
                    writer.flush();  
                }  
            } catch (Exception e) {  
                e.printStackTrace();  
            } finally {  
                try {  
                    if (reader!=null) {  
                        reader.close();  
                    }  
                    if (writer!=null) {  
                        writer.close();  
                    }  
                    if (socket!=null) {  
                        socket.close();  
                    }  
                } catch (Exception e2) {  
                    e2.printStackTrace();  
                }  
            }  
        }  
          
    }  
}

客户端程序:

package www.socket.test;
 
import java.io.BufferedReader;
import java.io.BufferedWriter;
import java.io.InputStreamReader;
import java.io.OutputStreamWriter;
import java.net.Socket;
 
public class Client {
	public static void main(String[] args) {  
		Client client=new Client();  
		client.startAction();  
    }  
      
    void readSocketInfo(BufferedReader reader){  
        new Thread(new MyRuns(reader)).start();  
    }  
      
    class MyRuns implements Runnable{  
          
        BufferedReader reader;  
          
        public MyRuns(BufferedReader reader) {  
            super();  
            this.reader = reader;  
        }  
  
        public void run() {  
            try {  
                String lineString="";  
                while( (lineString = reader.readLine())!=null ){  
                    System.out.println(lineString);  
                }  
            } catch (Exception e) {  
                e.printStackTrace();  
            }  
        }  
          
    }  
      
    public void startAction(){  
        Socket socket=null;  
        BufferedReader reader=null;  
        BufferedWriter writer=null;  
        BufferedReader reader2=null;  
        try {  
            socket=new Socket("127.0.0.1", 10000);  
            reader = new BufferedReader(new InputStreamReader(System.in));  
            reader2=new BufferedReader(new InputStreamReader(socket.getInputStream()));  
            writer = new BufferedWriter(new OutputStreamWriter(socket.getOutputStream()));  
            readSocketInfo(reader2);  
            String lineString="";  
            while(!(lineString=reader.readLine()).equals("exit")){  
                writer.write(lineString+"\n");  
                writer.flush();  
            }  
        } catch (Exception e) {  
            e.printStackTrace();  
        } finally {  
            try {  
                if (reader!=null) {  
                    reader.close();  
                }  
                if (writer!=null) {  
                    writer.close();  
                }  
                if (socket!=null) {  
                    socket.close();  
                }  
            } catch (Exception e2) {  
                e2.printStackTrace();  
            }  
        }  
    }  
}
  • 1
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
下面是一个基于 Java Socket长连接实现心跳检测的代码示例: 客户端代码: ```java public class Client { public static void main(String[] args) throws IOException { Socket socket = new Socket("127.0.0.1", 8888); BufferedReader in = new BufferedReader(new InputStreamReader(socket.getInputStream())); PrintWriter out = new PrintWriter(socket.getOutputStream(), true); // 发送心跳包 ScheduledExecutorService executorService = Executors.newScheduledThreadPool(1); executorService.scheduleAtFixedRate(() -> { out.println("ping"); }, 0, 3, TimeUnit.SECONDS); // 接收消息 String message; while ((message = in.readLine()) != null) { System.out.println(message); } } } ``` 服务端代码: ```java public class Server { public static void main(String[] args) throws IOException { ServerSocket serverSocket = new ServerSocket(8888); while (true) { Socket socket = serverSocket.accept(); BufferedReader in = new BufferedReader(new InputStreamReader(socket.getInputStream())); PrintWriter out = new PrintWriter(socket.getOutputStream(), true); // 接收心跳包 ScheduledExecutorService executorService = Executors.newScheduledThreadPool(1); executorService.scheduleAtFixedRate(() -> { try { String message = in.readLine(); if ("ping".equals(message)) { out.println("pong"); } } catch (IOException e) { e.printStackTrace(); } }, 0, 3, TimeUnit.SECONDS); } } } ``` 在客户端和服务端分别启动后,客户端会每隔 3 秒发送一个 "ping" 消息,服务端会每隔 3 秒接收客户端的消息并判断是否是心跳包,如果是则回复一个 "pong" 消息。这样就可以通过心跳检测来保持长连接的存活状态。
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值