`
coach
  • 浏览: 382488 次
  • 性别: 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();
						}
					}
				}
			}

		}
	}
}
分享到:
评论

相关推荐

Global site tag (gtag.js) - Google Analytics