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();  
            }  
        }  
    }  
}

猜你喜欢

转载自blog.csdn.net/weixin_43513644/article/details/83444018