`
coach
  • 浏览: 386968 次
  • 性别: Icon_minigender_2
  • 来自: 印度
社区版块
存档分类
最新评论

java socket 长连接

    博客分类:
  • http
阅读更多
长连接主要用于在少数客户端与服务端的频繁通信,因为这时候如果用短连接频繁通信常会发生Socket出错,并且频繁创建Socket连接也是对资源的浪费
简单说,如果是频繁通讯,使用长连接

长:connect连上后不断开,进行N次收发操作。
短:每次都connect,完成任务后立即断开。下次重连。
一般都是accept后启动一个线程去处理,该线程中的处理大致如下  
 
短连接: 
  run(){ 
      read           //读取请求包 
      process     //处理 
      write         //应答处理结果 
  }  
   
长连接: 
  run(){ 
    while(NotEnd){ 
        read 
        process 
        write 
      } 
  }



SocketClient.java

import java.io.IOException;
import java.io.InputStreamReader;
import java.io.OutputStreamWriter;
import java.io.PrintWriter;
import java.io.Reader;
import java.net.Socket;
import java.net.UnknownHostException;
import java.nio.CharBuffer;
import java.util.concurrent.ArrayBlockingQueue;
import java.util.concurrent.BlockingQueue;

public class SocketClient {

	public static final Object locked = new Object();
	public static final BlockingQueue<String> queue = new ArrayBlockingQueue<String>(
			1024 * 100);

	class SendThread extends Thread{
		private Socket socket;
		public SendThread(Socket socket) {
			this.socket = socket;
		}
		@Override
		public void run() {
			while(true){
				try {
					String send = getSend();			
					PrintWriter pw = new PrintWriter(new OutputStreamWriter(socket.getOutputStream()));
					pw.write(send);
					pw.flush();
				} catch (Exception e) {
					e.printStackTrace();
				}
			}
		}
		public String getSend() throws InterruptedException{
			Thread.sleep(1000);
			return "<SOAP-ENV:Envelope>"+System.currentTimeMillis()+"</SOAP-ENV:Envelope>";
		}
	}

	class ReceiveThread extends Thread{
		private Socket socket;
		
		public ReceiveThread(Socket socket) {
			this.socket = socket;
		}

		@Override
		public void run() {
			while(true){
				try {					
					Reader reader = new InputStreamReader(socket.getInputStream());
					CharBuffer charBuffer = CharBuffer.allocate(8192);
					int index = -1;
					while((index=reader.read(charBuffer))!=-1){
						charBuffer.flip();
						System.out.println("client:"+charBuffer.toString());
					}
				} catch (Exception e) {
					e.printStackTrace();
				}
			}
		}
	}
	
	public void start() throws UnknownHostException, IOException{
		Socket socket = new Socket("10.10.148.40",18889);
		new SendThread(socket).start();
		new ReceiveThread(socket).start();
	}
	public static void main(String[] args) throws UnknownHostException, IOException {
		new SocketClient().start();
	}
}


SocketServer.java

import java.io.IOException;
import java.io.InputStreamReader;
import java.io.OutputStreamWriter;
import java.io.PrintWriter;
import java.io.Reader;
import java.io.Writer;
import java.net.ServerSocket;
import java.net.Socket;
import java.nio.CharBuffer;
import java.util.Date;

public class SocketServer {

	private final static String SOAP_BEGIN = "<SOAP-ENV:Envelope";
	private final static String SOAP_END = "</SOAP-ENV:Envelope>";

	public static void main(String[] args) throws IOException {
		SocketServer socketServer = new SocketServer();
		socketServer.start();
	}

	public void start() throws IOException {
		ServerSocket serverSocket = new ServerSocket(18889);
		while (true) {
			Socket socket = serverSocket.accept();
			new SocketThread(socket).start();
		}
	}

	class SocketThread extends Thread {
		private Socket socket;
		private String temp;

		public Socket getSocket() {
			return socket;
		}

		public void setSocket(Socket socket) {
			this.socket = socket;
		}

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

		public void run() {
			try {
				Reader reader = new InputStreamReader(socket.getInputStream());
				Writer writer = new PrintWriter(new OutputStreamWriter(socket
						.getOutputStream(), "GBK"));
				CharBuffer charBuffer = CharBuffer.allocate(8192);
				int readIndex = -1;
				while ((readIndex = reader.read(charBuffer)) != -1) {
					charBuffer.flip();
					temp += charBuffer.toString();
					if (temp.indexOf(SOAP_BEGIN) != -1
							&& temp.indexOf(SOAP_END) != -1) {
						// 传送一个soap报文
						System.out.println(new Date().toLocaleString()+"server:"+temp);
						temp="";
						writer.write("receive the soap message");
						writer.flush();
					} else if (temp.indexOf(SOAP_BEGIN) != -1) {
						// 包含开始,但不包含
						temp = temp.substring(temp.indexOf(SOAP_BEGIN));
					}	
					if (temp.length() > 1024 * 16) {
						break;
					}
				}
			} catch (Exception e) {
				e.printStackTrace();
			} finally {
				if (socket != null) {
					if (!socket.isClosed()) {
						try {
							socket.close();
						} catch (IOException e) {
							e.printStackTrace();
						}
					}
				}
			}

		}
	}
}
分享到:
评论

相关推荐

    java socket 长连接实例

    "Java Socket 长连接实例"是关于如何实现一个持久连接的服务器和客户端程序的示例,这种连接能够保持开放,直到一方明确地关闭它。这在需要频繁通信或者需要长时间保持连接状态的应用场景中非常有用,比如聊天应用、...

    java socket长连接

    java socket长连接,支持一个服务器向多个客户端推送消息; 客户端和服务端互相监听,每一个一个客户端断开服务端都有监听。客户端和服务端都做了封装,调用简单。数据通信使用Gson,bean和json互转

    Java实现Socket长连接和短连接

    - **关闭策略**:合理设置超时时间,当连接长时间无数据传输时,可以考虑关闭连接以释放资源。 **4. 应用场景** 短连接适合一次性、低延迟、资源有限的场景,如网页浏览。而长连接适合实时性强、需要持续交互的...

    java socket长连接客户端服务端(标准实例)

    2. **资源释放**:虽然示例中没有明确展示资源的释放过程,但在实际开发中应该注意适当关闭不再使用的Socket连接和相关的输入输出流。 3. **并发安全**:由于涉及多线程操作,需要注意线程安全问题。 #### 七、总结...

    Socket长连接+心跳包+发送读取

    Socket长连接是网络编程中的重要概念,主要用于保持客户端与服务器之间的持续通信状态,避免每次通信都需要重新建立连接的开销。在长连接中,一旦连接建立成功,就会保持该连接,直到某一方主动断开或者因为网络问题...

    Android-Socket长连接通信心跳包消息回调Java服务端

    通过分析和学习这个项目,你可以更直观地了解上述知识点的实现方式,包括如何创建Socket连接、实现心跳包、处理消息回调以及服务端的多线程处理等。 总结,实现“Android-Socket长连接通信心跳包消息回调Java服务端...

    java socket异步长连接demo

    "异步长连接"是Java Socket编程中一种高效且广泛使用的通信模式,它允许客户端和服务器保持连接状态,以便在需要时快速交换数据,而无需反复建立和关闭连接。 在Java中,通常使用`java.net.Socket`和`java.net....

    java socket连接池 实现

    总的来说,Java Socket连接池是解决高并发网络环境下性能问题的有效手段。通过合理的设计和管理,不仅可以减少系统资源的浪费,还能提升应用的整体响应速度和稳定性。在选择和使用Socket连接池时,应根据项目需求和...

    Java socket的一个封装

    1. 满足具有Socket客户端需求的基本应用. 2. 满足具有Socket服务端的基本应用. 具备并发能力, 能满足可设定个数客户端连接. 参考个人博客: http://blog.csdn.net/ostrichmyself/article/details/6618349

    java socket长连接中解决read阻塞的3个办法

    在Java网络编程中,Socket是实现TCP长连接的基础。然而,使用Socket进行数据传输时,可能会遇到`read()`方法阻塞的问题,导致程序挂起,无法继续执行。为了解决这个问题,通常有以下三种策略: 1. **约定数据长度**...

    java Socket 长链接拔网线检测

    1. 重新连接:立即尝试重新建立Socket连接,以便尽快恢复通信。 2. 错误处理:捕获并记录异常,通知用户连接出现问题,可能需要用户检查网络或稍后再试。 3. 数据恢复:如果在连接断开前有未完成的数据传输,需要...

    Java的socket长连接实例

    接着是`Connection.java`,它可能是代表单个Socket连接的类,具有以下组件和方法: 1. Socket实例:存储实际的Socket对象,用于数据传输。 2. 输入/输出流:通过`Socket`获取`InputStream`和`OutputStream`,用于...

    java写的socket通信客户端

    当Socket连接中断时,会抛出`IOException`,客户端程序可以捕获这个异常,然后在适当的时间间隔后尝试重新建立连接。为了防止无限重试,可以设置最大重试次数或者使用指数退避策略。 5. **多线程**: 在实际应用中...

    java socket连接池

    Java Socket连接池是一种优化网络通信性能的技术,它允许应用程序复用已经建立的Socket连接,从而减少因频繁创建和销毁Socket连接而产生的开销。在高并发的服务器环境中,Socket连接池能够有效地提升系统效率和响应...

    socket长连接demo

    总结起来,Java Socket编程中的长连接实现涉及TCP连接的创建、数据交换、心跳机制以及资源的管理和关闭。理解和掌握这些知识点对于开发高效、可靠的网络应用至关重要。在实际工作中,还需要考虑异常处理、线程安全...

    JAVA socket收发数据,并支持断网自动连接

    - **Socket类**:在Java中,`java.net.Socket`类代表一个TCP连接,它封装了输入/输出流,用于与服务器进行数据交换。 - **ServerSocket类**:`java.net.ServerSocket`类用于监听客户端的连接请求,一旦有连接请求...

    java socket客户端断线重连

    java socket client 断线重连的简单实现 有什么意见可以提哦

Global site tag (gtag.js) - Google Analytics