`
jiewo
  • 浏览: 47998 次
  • 性别: Icon_minigender_1
  • 来自: 上海
社区版块
存档分类
最新评论

java socket 长连接

    博客分类:
  • java
阅读更多
最近做SSO的项目,其中用到了socket长连接.一直都是看代码的,但是要求socket做成SSL的,不得不动手写写代码了.下面我给出一个简单的socket长连接.
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;

/*{  user:jiangwh }*/

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;

/*{user:jiangwh }*/

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

		}
	}
}
分享到:
评论
8 楼 jiewo 2015-04-18  
Thomsonxu 写道
jiewo 写道
廖世勇 写道
finally { 
                if (socket != null) { 
                    if (!socket.isClosed()) { 
                        try { 
                            socket.close(); 
                        } catch (IOException e) { 
                            e.printStackTrace(); 
                        } 
                    } 
                } 
            } 

都把客户端socket给关闭了,是长连接吗?

socket异常才会走到finaly,正常情况不会关闭!!!!

finally是必须要执行的啊,无论异常与否!


finally的用法是这样的,但是上面的循环不会结束。你可以做下代码测试,看看server端接收了多少个连接。
7 楼 submaze 2015-04-07  
这个不是长连接啊
6 楼 myumen 2014-11-25  
这个真不叫长连接。示例只是读取了一条完整的SOAP消息而已(分多次read),而且读取完就关闭掉了SOCKET(While循环结束)。长连接应该是这样的:有消息就接收消息,没消息就定时发送心跳包并接收服务器返回以此来判断连接是否还在,Socket或者SocketChannel一般不会关闭。通常会有个异步线程定时发送心跳包。
5 楼 cuiyong_xu 2014-11-24  
这都看不懂,还做什么开发?
4 楼 Thomsonxu 2014-11-04  
jiewo 写道
廖世勇 写道
finally { 
                if (socket != null) { 
                    if (!socket.isClosed()) { 
                        try { 
                            socket.close(); 
                        } catch (IOException e) { 
                            e.printStackTrace(); 
                        } 
                    } 
                } 
            } 

都把客户端socket给关闭了,是长连接吗?

socket异常才会走到finaly,正常情况不会关闭!!!!

finally是必须要执行的啊,无论异常与否!
3 楼 wupy 2014-10-14  
finnal是必须走的把,无论怎么样都走的
2 楼 jiewo 2014-06-05  
廖世勇 写道
finally { 
                if (socket != null) { 
                    if (!socket.isClosed()) { 
                        try { 
                            socket.close(); 
                        } catch (IOException e) { 
                            e.printStackTrace(); 
                        } 
                    } 
                } 
            } 

都把客户端socket给关闭了,是长连接吗?

socket异常才会走到finaly,正常情况不会关闭!!!!
1 楼 廖世勇 2014-05-27  
finally { 
                if (socket != null) { 
                    if (!socket.isClosed()) { 
                        try { 
                            socket.close(); 
                        } catch (IOException e) { 
                            e.printStackTrace(); 
                        } 
                    } 
                } 
            } 

都把客户端socket给关闭了,是长连接吗?

相关推荐

    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