长连接主要用于在少数客户端与服务端的频繁通信,因为这时候如果用短连接频繁通信常会发生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长连接,支持一个服务器向多个客户端推送消息; 客户端和服务端互相监听,每一个一个客户端断开服务端都有监听。客户端和服务端都做了封装,调用简单。数据通信使用Gson,bean和json互转
- **关闭策略**:合理设置超时时间,当连接长时间无数据传输时,可以考虑关闭连接以释放资源。 **4. 应用场景** 短连接适合一次性、低延迟、资源有限的场景,如网页浏览。而长连接适合实时性强、需要持续交互的...
2. **资源释放**:虽然示例中没有明确展示资源的释放过程,但在实际开发中应该注意适当关闭不再使用的Socket连接和相关的输入输出流。 3. **并发安全**:由于涉及多线程操作,需要注意线程安全问题。 #### 七、总结...
Socket长连接是网络编程中的重要概念,主要用于保持客户端与服务器之间的持续通信状态,避免每次通信都需要重新建立连接的开销。在长连接中,一旦连接建立成功,就会保持该连接,直到某一方主动断开或者因为网络问题...
通过分析和学习这个项目,你可以更直观地了解上述知识点的实现方式,包括如何创建Socket连接、实现心跳包、处理消息回调以及服务端的多线程处理等。 总结,实现“Android-Socket长连接通信心跳包消息回调Java服务端...
"异步长连接"是Java Socket编程中一种高效且广泛使用的通信模式,它允许客户端和服务器保持连接状态,以便在需要时快速交换数据,而无需反复建立和关闭连接。 在Java中,通常使用`java.net.Socket`和`java.net....
总的来说,Java Socket连接池是解决高并发网络环境下性能问题的有效手段。通过合理的设计和管理,不仅可以减少系统资源的浪费,还能提升应用的整体响应速度和稳定性。在选择和使用Socket连接池时,应根据项目需求和...
1. 满足具有Socket客户端需求的基本应用. 2. 满足具有Socket服务端的基本应用. 具备并发能力, 能满足可设定个数客户端连接. 参考个人博客: http://blog.csdn.net/ostrichmyself/article/details/6618349
在Java网络编程中,Socket是实现TCP长连接的基础。然而,使用Socket进行数据传输时,可能会遇到`read()`方法阻塞的问题,导致程序挂起,无法继续执行。为了解决这个问题,通常有以下三种策略: 1. **约定数据长度**...
1. 重新连接:立即尝试重新建立Socket连接,以便尽快恢复通信。 2. 错误处理:捕获并记录异常,通知用户连接出现问题,可能需要用户检查网络或稍后再试。 3. 数据恢复:如果在连接断开前有未完成的数据传输,需要...
接着是`Connection.java`,它可能是代表单个Socket连接的类,具有以下组件和方法: 1. Socket实例:存储实际的Socket对象,用于数据传输。 2. 输入/输出流:通过`Socket`获取`InputStream`和`OutputStream`,用于...
当Socket连接中断时,会抛出`IOException`,客户端程序可以捕获这个异常,然后在适当的时间间隔后尝试重新建立连接。为了防止无限重试,可以设置最大重试次数或者使用指数退避策略。 5. **多线程**: 在实际应用中...
Java Socket连接池是一种优化网络通信性能的技术,它允许应用程序复用已经建立的Socket连接,从而减少因频繁创建和销毁Socket连接而产生的开销。在高并发的服务器环境中,Socket连接池能够有效地提升系统效率和响应...
总结起来,Java Socket编程中的长连接实现涉及TCP连接的创建、数据交换、心跳机制以及资源的管理和关闭。理解和掌握这些知识点对于开发高效、可靠的网络应用至关重要。在实际工作中,还需要考虑异常处理、线程安全...
- **Socket类**:在Java中,`java.net.Socket`类代表一个TCP连接,它封装了输入/输出流,用于与服务器进行数据交换。 - **ServerSocket类**:`java.net.ServerSocket`类用于监听客户端的连接请求,一旦有连接请求...
java socket client 断线重连的简单实现 有什么意见可以提哦