(java)socket全双工长连接通信实例

(借鉴备忘)直接上代码:

client:

import java.io.InputStreamReader;
import java.io.OutputStreamWriter;
import java.io.PrintWriter;
import java.io.Reader;
import java.net.Socket;
import java.nio.CharBuffer;

public class TestSocketClient {

	public static void main(String[] args) {
		// TODO Auto-generated method stub
		new TestSocketClient().start();
	}
	class SendThread extends Thread{
		private Socket socket;
		public SendThread(Socket socket){
			this.socket=socket;
		}
		@Override
		public void run(){
			while(true){
				try{
					Thread.sleep(1000); 
					String send="<SOAP-ENV:Envelope>"+System.currentTimeMillis()+"</SOAP-ENV:Envelope>";
					PrintWriter pw=new PrintWriter(new OutputStreamWriter(socket.getOutputStream()));
					pw.write(send);
					pw.flush();
				}catch(Exception e){
					e.printStackTrace();
				}
			}
		}
	}
	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();//设置从0到刚刚读取到的位置
						System.out.println("client:"+charbuffer.toString());
					}
				}catch(Exception e){
					e.printStackTrace();
				}
			}
		}
	}
	public void start(){
		try{
		Socket socket=new Socket("127.0.0.1",18889);
		new SendThread(socket).start();
		new ReceiveThread(socket).start();
		}catch(Exception e){
			e.printStackTrace();
		}
		
	}
}

server:

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 TestSocketServer {

	private final static String SOAP_BEGIN = "<SOAP-ENV:Envelope"; 
    private final static String SOAP_END = "</SOAP-ENV:Envelope>"; 
	public static void main(String[] args) {
		// TODO Auto-generated method stub
		TestSocketServer testserver=new TestSocketServer();
		testserver.start();
	}
	public void start(){
		try{
		ServerSocket serversocket=new ServerSocket(18889);
		while(true){
			Socket socket=serversocket.accept();
			new SocketThread(socket).start();
		}
		}catch(Exception e){
			e.printStackTrace();
		}
		
	}
	class SocketThread extends Thread{
		private Socket socket;
		private String temp;
		public SocketThread(Socket socket){
			this.socket=socket;
		}
		public Socket getsocket(){
			return this.socket;
		}
		public void setsocjet(Socket socket){
			this.socket=socket;
		}
		
		@Override
		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){
						//System.out.println(new Date().toLocaleString()+"server:"+temp);
						temp="";
						writer.write("receive the soap message hahahah");
						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){
					try{
						if(!socket.isClosed()){
							socket.close();
						}
					}catch(Exception e){
						e.printStackTrace();
					}
				}
			}
		}
	}

}


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值