www.pudn.com > XYNetSocket.zip > XYNetJavaClient.java


import java.net.*; 
import java.io.*; 
//import java.util.*; 
 
public class XYNetJavaClient implements Runnable 
{ 
	Exception m_except; 
	Socket m_sock; 
	boolean m_bReconnect; 
	int m_nReadTimeout; 
	int m_nMaxDataSize; 
	String m_sRemoteAddress; 
	int m_nRemotePort; 
	byte[] m_pData; 
	boolean m_bIsBinary; 
	Thread m_threadRun; 
	boolean SendRawData(byte[] pData) 
	{ 
		m_except = null; 
		try 
		{ 
			m_sock.getOutputStream().write(pData); 
			return true; 
		} 
		catch(Exception oBug) 
		{ 
			Exception oExcept = oBug; 
			if(m_bReconnect) Connect(null, 0); 
			m_except = oExcept; 
			return false; 
		} 
	} 
	final public void run() 
	{ 
		try 
		{ 
			m_pData = null; 
			byte[] pHeader = new byte[4]; 
			int nTotal = 0; 
			while(true) 
			{ 
				int nRead = m_sock.getInputStream().read(pHeader, nTotal, 4-nTotal); 
				if(nRead>0) nTotal += nRead; 
				if(nTotal==4)  
				{ 
					if((pHeader[0]&0x0000000F)==2) nTotal = 0; 
					else break; 
				} 
				if(nRead<0) throw new Exception("Failed to read incoming data"); 
				Thread.currentThread().sleep(50); 
			} 
			if((pHeader[0]&0x0000000F)>1) throw new Exception("Invalid data type byte: "+(pHeader[0]&0x0000000F)); 
			m_bIsBinary = ((pHeader[0]&0x0000000F)==1); 
			int nSize = (pHeader[1]&0x000000FF)+(pHeader[2]&0x000000FF)*256+(pHeader[3]&0x000000FF)*65536+((pHeader[0]&0x000000FF)/16)*16777216; 
			if(nSize>m_nMaxDataSize) throw new Exception("Data size too large"); 
			if(m_bIsBinary==false&&(nSize%2)!=0) throw new Exception("Invalid string data size"); 
			m_pData = new byte[nSize]; 
			nTotal = 0; 
			while(nSize>0) 
			{ 
				int nRead = m_sock.getInputStream().read(m_pData, nTotal, nSize-nTotal); 
				if(nRead>0) nTotal += nRead; 
				if(nTotal==nSize) break; 
				if(nRead<0) throw new Exception("Failed to read incoming data"); 
				Thread.currentThread().sleep(50); 
			} 
		} 
		catch(Exception oBug) 
		{ 
			m_except = oBug; 
			m_pData = null;	 
		} 
		m_threadRun = null;	 
	} 
	public XYNetJavaClient() 
	{ 
		m_except = null; 
		m_sock = null; 
		m_bReconnect = true; 
		m_nReadTimeout = 30; 
		m_nMaxDataSize = 4*1024*1024; 
		m_sRemoteAddress = ""; 
		m_nRemotePort = 0; 
		m_pData = null; 
		m_bIsBinary = true; 
	} 
	public boolean Connect(String sRemoteAddress, int nRemotePort) 
	{ 
		m_except = null; 
		Reset(); 
		if(sRemoteAddress!=null) m_sRemoteAddress = sRemoteAddress; 
		if(nRemotePort>0) m_nRemotePort = nRemotePort; 
		try 
		{ 
			m_sock = new Socket(m_sRemoteAddress, m_nRemotePort); 
			return true; 
		} 
		catch(Exception oBug) 
		{ 
			m_except = oBug; 
			return false; 
		} 
	} 
	final public void Reset() 
	{ 
		m_bReconnect = false; 
		try 
		{ 
			if(m_sock!=null) 
			{ 
				byte[] pData = new byte[4]; 
				pData[0] =  (byte)255; 
				pData[1] = pData[2] = pData[3] = 0; 
				m_sock.getOutputStream().write(pData); 
				m_sock.close(); 
			} 
		} 
		catch(Exception oBug) 
		{ 
		} 
		m_bReconnect = true; 
	} 
	public boolean SendBinaryData(byte[] pData) 
	{ 
		byte[] pData2 = new byte[pData.length+4]; 
		pData2[0] = (byte)(1+(pData.length/16777216)*16); 
		pData2[1] = (byte)(pData.length%256); 
		pData2[2] = (byte)((pData.length%65536)/256); 
		pData2[3] = (byte)((pData.length/65536)%256); 
		System.arraycopy(pData, 0, pData2, 4, pData.length); 
		return SendRawData(pData2); 
	} 
	public boolean SendStringData(String sData) 
	{ 
		int nSize = sData.length(); 
		byte[] pData = new byte[2*nSize+4]; 
		pData[0] = (byte)(((2*nSize)/16777216)*16); 
		pData[1] = (byte)((2*nSize)%256); 
		pData[2] = (byte)(((2*nSize)%65536)/256); 
		pData[3] = (byte)(((2*nSize)/65536)%256); 
		for(int i=0;im_nReadTimeout*1000) 
					throw new Exception("Timeout while receiving incoming data"); 
			} 
			if(m_pData!=null) 
			{ 
				if(pSize!=null) pSize[0] = m_pData.length; 
				if(pIsBinary!=null) pIsBinary[0] = m_bIsBinary; 
				return true; 
			} 
			if(m_except!=null) throw m_except; 
		} 
		catch(Exception oBug) 
		{ 
			Exception oExcept = oBug; 
			if(m_threadRun!=null) 
			{ 
				try 
				{ 
					m_threadRun.interrupt(); 
					Thread.currentThread().sleep(50); 
				} 
				catch(Exception oError) {} 
			} 
			if(m_bReconnect) Connect(null, 0); 
			m_except = oExcept; 
			m_threadRun = null; 
		} 
		return false; 
	} 
	public String GetStringData() 
	{ 
		if(m_pData==null) return null; 
		int nSize = m_pData.length/2; 
		char[] pData = new char[nSize]; 
		for(int i=0;i=5&&nReadTimeout<=120) m_nReadTimeout = nReadTimeout; 
	} 
	public void SetMaxDataSize(int nMaxDataSize) 
	{ 
		if(nMaxDataSize>=1024) m_nMaxDataSize = nMaxDataSize; 
	} 
	public Exception GetLastException() 
	{ 
		return m_except; 
	} 
}