socket 통신 상호 전송 읽 기 xml 인 스 턴 스

먼저 socket 통신 전송 데이터 의 특징 을 알 아 보 겠 습 니 다. 데 이 터 는 네트워크 전송 시 바이트 흐름 이나 문자 흐름 을 사용 합 니 다. Socket 도 예외 가 아 닙 니 다. 그래서 저희 가 데 이 터 를 보 낼 때 바이트 로 보 내야 합 니 다. 읽 을 때 도 바이트 단위 로 읽 어야 합 니 다. 
문 제 는 socket 통신 을 할 때 수신 자가 이번 데이터 가 얼마나 긴 지 모 르 기 때문에 버퍼 (바이트 배열) 를 정확하게 만 들 수 없습니다. 정 해 지지 않 은 통신 에서 일반적으로 사용 하 는 방식 은 8 * 1024 길이 의 바이트 를 기본 값 으로 읽 습 니 다. 입력 흐름 에 데이터 가 있 으 면 다시 읽 습 니 다. 입력 흐름 에 데이터 가 없 을 때 까지 입 니 다.그러나 데 이 터 를 너무 많이 보 낼 때 발송 자 는 데 이 터 를 하 도 급 으로 보 내 는데 이런 상황 에서 수신 자가 잘못 판단 하여 데이터 전송 이 완 료 된 것 으로 착각 하여 수신 이 불완전 하 다. 따라서 대부분의 경우 쌍방 이 socket 통신 을 사용 할 때 하나의 고정 머리 를 전송 데이터 의 맨 앞 에 놓 고 표지 데이터 체 의 길 이 를 사용 하 는 것 을 약정 합 니 다. 보통 고정 머리 는 정형 int, 짧 은 정형 short, 문자열 Strinng 세 가지 형식 이 있 습 니 다.
다음은 socket + xml 전송 인 스 턴 스 두 개 를 소개 합 니 다. 사례 하 나 는 writeUTF () 와 readUTF () 방법 으로 전송 한 데 이 터 를 보 내 고 읽 는 것 입 니 다.
사례 2 는 xml 를 조립 한 후 xml 의 바이트 길 이 를 계산 하여 메시지 헤더 에 놓 고 write () 방법 으로 데 이 터 를 보 내 고 read () 방법 으로 데 이 터 를 읽 는 것 이다.
writeUTF () 와 write () 방법의 차 이 를 소개 합 니 다.
writeUTF(String str);   
write(int b) ;   
두 사람의 매개 변수 가 다르다 는 것 을 알 수 있 습 니 다. writeUTF 는 조립 된 문자열 을 직접 보 낼 수 있 습 니 다. (방법 패키지, 변경 방법 내부 도 바이트 나 문자 로 전송 해 야 합 니 다) 그러나 수용 자 는 readUTF 방법 으로 읽 고 받 아들 여야 합 니 다. 똑 같이 유지 해 야 합 니 다.wirte 방법 은 상대 적 으로 첫 번 째 단계 에 속 하 는 패키지 입 니 다. 조립 된 xml 문자열 을 바이트 배열 로 전송 해 야 합 니 다.그리고
ASCII 코드: 하나의 영문 자 모 는 하나의 바이트 와 같 습 니 다.
UTF - 8 인 코딩: 하나의 영문 자 모 는 하나의 바이트 와 같다.
유 니 코드 인 코딩: 하나의 영문 자 모 는 두 바이트 와 같 습 니 다.서로 다른 인 코딩 형식 은 바이트 의 통계 에 도 차이 가 있 기 때문에 xml 바이트 의 길 이 를 계산 할 때 전송 하 는 인 코딩 형식 을 규정 해 야 합 니 다. 이런 것들 은 아래 의 코드 에 모두 나타 나 야 하 므 로 독자 가 스스로 체험 하 시기 바 랍 니 다.
사례 1 서버:
package tcpSocket;

import java.io.ByteArrayInputStream;
import java.io.ByteArrayOutputStream;
import java.io.DataInputStream;
import java.io.DataOutputStream;
import java.io.InputStream;
import java.net.ServerSocket;
import java.net.Socket;

import javax.xml.parsers.DocumentBuilder;
import javax.xml.parsers.DocumentBuilderFactory;
import javax.xml.transform.Transformer;
import javax.xml.transform.TransformerFactory;
import javax.xml.transform.dom.DOMSource;
import javax.xml.transform.stream.StreamResult;

import org.w3c.dom.Document;
import org.w3c.dom.Element;
import org.w3c.dom.NodeList;

public class TCPServer2 {
	public static void main(String args[]) {
			int serverPort = 7896;
			ServerSocket listenSocket ;
			Socket clientSocket ;
			try {
//				******************            ******************************************
					listenSocket = new ServerSocket(serverPort);
				    clientSocket = listenSocket.accept();
				    DataInputStream in = new DataInputStream(clientSocket.getInputStream());
					String data = in.readUTF();
//					System.out.println("      :" + data);
					DOM(data);
					
//					******************     xml  ******************************************
					DataOutputStream out=new DataOutputStream(clientSocket.getOutputStream());
					//      API,         XML        DOM        
					DocumentBuilderFactory factory = DocumentBuilderFactory
							.newInstance();
					//    API,     XML      DOM     。    ,         XML      Document
					DocumentBuilder builder = factory.newDocumentBuilder();
					// Document        HTML   XML   。     ,       ,             
					Document document = builder.newDocument();
					//    xml    
					Element root = document.createElement("persons");
					document.appendChild(root);
					Element person = document.createElement("person");
					Element name = document.createElement("name");
					name.appendChild(document.createTextNode("java  "));
					person.appendChild(name);
					Element sex = document.createElement("sex");
					sex.appendChild(document.createTextNode("man"));
					person.appendChild(sex);
					Element age = document.createElement("age");
					age.appendChild(document.createTextNode("99"));
					person.appendChild(age);
					root.appendChild(person);
	
					TransformerFactory tf = TransformerFactory.newInstance();
					//                   
					Transformer transformer;
					transformer = tf.newTransformer();
	
					DOMSource source = new DOMSource(document);
					ByteArrayOutputStream bos = new ByteArrayOutputStream();
					transformer.transform(source, new StreamResult(bos));
					String xmlStr = bos.toString();
					out.writeUTF(xmlStr);
		} catch (Exception e) {
			System.out.println(e.getMessage());
		}
	}
	
	public static void DOM(String data) {
		try {
			//  xml    
			byte[] b = data.getBytes();
			InputStream inp = new ByteArrayInputStream(b);
			DocumentBuilderFactory factory = DocumentBuilderFactory
					.newInstance();
			DocumentBuilder builder = factory.newDocumentBuilder();
			Document doc = builder.parse(inp);
			NodeList nl = doc.getElementsByTagName("persons");
//			System.out.println(nl.getLength());
			for (int i = 0; i < nl.getLength(); i++) {
				System.out.println("person:  "
						+ doc.getElementsByTagName("person").item(i)
								.getFirstChild().getNodeValue());
				System.out.println("name:  "
						+ doc.getElementsByTagName("name").item(i)
								.getFirstChild().getNodeValue());
				System.out.println("sex:  "
						+ doc.getElementsByTagName("sex").item(i)
								.getFirstChild().getNodeValue());
				System.out.println("age:  "
						+ doc.getElementsByTagName("age").item(i)
								.getFirstChild().getNodeValue());
			}
		} catch (Exception e) {
			e.printStackTrace();
		}
	}
}

클 라 이언 트:
package tcpSocket;

import java.io.ByteArrayInputStream;
import java.io.ByteArrayOutputStream;
import java.io.DataInputStream;
import java.io.DataOutputStream;
import java.io.EOFException;
import java.io.IOException;
import java.io.InputStream;
import java.net.InetAddress;
import java.net.Socket;
import java.net.UnknownHostException;

import javax.xml.parsers.DocumentBuilder;
import javax.xml.parsers.DocumentBuilderFactory;
import javax.xml.transform.Transformer;
import javax.xml.transform.TransformerFactory;
import javax.xml.transform.dom.DOMSource;
import javax.xml.transform.stream.StreamResult;

import org.w3c.dom.Document;
import org.w3c.dom.Element;
import org.w3c.dom.NodeList;

public class TCPClient {

	public static void main(String[] args) throws Exception {
		// 2017 12 29    1:43:11
		Socket soc = null;
		String data = "";
		InetAddress addr = InetAddress.getByName("127.0.0.1");
		int serverPort = 7896;
		if (addr.isReachable(5000)) {
			try {
				soc = new Socket(addr, serverPort);
				
//************************     xml  ******************************************
				DataOutputStream out=new DataOutputStream(soc.getOutputStream());
				//      API,         XML        DOM        
				DocumentBuilderFactory factory = DocumentBuilderFactory
						.newInstance();
				//    API,     XML      DOM     。    ,         XML      Document
				DocumentBuilder builder = factory.newDocumentBuilder();
				// Document        HTML   XML   。     ,       ,             
				Document document = builder.newDocument();
				//    xml    
				Element root = document.createElement("persons");
				document.appendChild(root);
				Element person = document.createElement("person");
				Element name = document.createElement("name");
				name.appendChild(document.createTextNode("java  "));
				person.appendChild(name);
				Element sex = document.createElement("sex");
				sex.appendChild(document.createTextNode("man"));
				person.appendChild(sex);
				Element age = document.createElement("age");
				age.appendChild(document.createTextNode("99"));
				person.appendChild(age);
				root.appendChild(person);

				TransformerFactory tf = TransformerFactory.newInstance();
				//                   
				Transformer transformer;
				transformer = tf.newTransformer();

				DOMSource source = new DOMSource(document);
				ByteArrayOutputStream bos = new ByteArrayOutputStream();
				transformer.transform(source, new StreamResult(bos));
				String xmlStr = bos.toString();
				out.writeUTF(xmlStr);
				
//********************************            ******************************************
				//          ,     
				DataInputStream in = new DataInputStream(soc.getInputStream());
				data = in.readUTF();
//				System.out.println("      :" + data);
				DOM(data);
			} catch (UnknownHostException e) {
				System.out.println("Socket Error:" + e.getMessage());
			} catch (EOFException e) {
				System.out.println("EOF:" + e.getMessage());
			} catch (IOException e) {
				System.out.println("IO:" + e.getMessage());
			} finally {
				if (soc != null)
					try {
						soc.close();
					} catch (IOException e) {/* close failed */
					}
			}
		} else {
			System.out.println("FAILURE - ping " + addr
					+ " with no interface specified");
		}
	}

	public static void DOM(String data) {
		try {
			byte[] b = data.getBytes();
			InputStream inp = new ByteArrayInputStream(b);
			DocumentBuilderFactory factory = DocumentBuilderFactory
					.newInstance();
			DocumentBuilder builder = factory.newDocumentBuilder();
			Document doc = builder.parse(inp);
			NodeList nl = doc.getElementsByTagName("persons");
//			System.out.println(nl.getLength());
			for (int i = 0; i < nl.getLength(); i++) {
				System.out.println("person:  "
						+ doc.getElementsByTagName("person").item(i)
								.getFirstChild().getNodeValue());
				System.out.println("name:  "
						+ doc.getElementsByTagName("name").item(i)
								.getFirstChild().getNodeValue());
				System.out.println("sex:  "
						+ doc.getElementsByTagName("sex").item(i)
								.getFirstChild().getNodeValue());
				System.out.println("age:  "
						+ doc.getElementsByTagName("age").item(i)
								.getFirstChild().getNodeValue());
			}
		} catch (Exception e) {
			e.printStackTrace();
		}
	}

}

사용 한 jar 패키지 보기:http://download.csdn.net/download/csdnliuxin123524/10180445
사례 2,
클 라 이언 트,
package socket;
import java.io.DataInputStream;
import java.io.DataOutputStream;
import java.net.InetAddress;
import java.net.Socket;

import org.apache.commons.lang.StringUtils;
public class CallExtPboc {
	@SuppressWarnings("resource")
	public static void main(String[] args) throws Exception {
		Socket soc = null;
		String data = "";
		InetAddress addr = InetAddress.getByName("127.0.0.1");
		int serverPort = 7896;
		soc = new Socket(addr, serverPort);
		DataOutputStream out=new DataOutputStream(soc.getOutputStream());
		String xmlReq = builderReqXml();
		byte[] b = xmlReq.getBytes("UTF-8");
		long len=b.length;
		String length=String.format("%06d",len);
		 xmlReq = length+xmlReq;
		byte[] bt = xmlReq.getBytes("utf-8");
		 out.write(bt);
//		out.writeUTF(builderReqXml());
		//              ,     
		//DataInputStream in = new DataInputStream(soc.getInputStream());
		//byte[] buf =new byte[1024];
		//int readb=in.read(buf);
		//System.out.println("**************************************");
		//if(readb != -1){
		//	System.out.println(new String(buf,0,readb));
		//}
		//in.close();
	}
	
	private static String builderReqXml(){
		StringBuffer xmlReq = new StringBuffer();
//		xmlReq.append("");
		xmlReq.append("");
		//  SERVICE_HEADER       
		StringBuilder serviceHeader = new StringBuilder();
		serviceHeader.append(getNode("SERVICE_SN","198234712374-17412748"));
		serviceHeader.append(getNode("SERVICE_ID","12100"));//   
		serviceHeader.append(getNode("ORG","org1"));
		serviceHeader.append(getNode("CHANNEL_ID","01"));//      ----    
		serviceHeader.append(getNode("OP_ID","tt"));
		serviceHeader.append(getNode("REQUST_TIME","20050621123000"));
		serviceHeader.append(getNode("VERSION_ID","01"));
		serviceHeader.append("");
		// SERVICE_HEADER         
		xmlReq.append(getNode("SERVICE_HEADER", serviceHeader.toString()));
		
		//  SERVICE_BODY       
		StringBuilder serviceBody = new StringBuilder();
		//  extAttributes     
		StringBuffer extAttributes =new StringBuffer();
		//  auth    
		StringBuffer auth =new StringBuffer();
		auth.append(getNode("Q_PIN", "0123456789ABCDEF"));
		// auth     EXT_ATTRIBUTES 
		extAttributes.append(getNode("AUTH", auth.toString()));
		// extAttributes     SERVICE_BODY 
		serviceBody.append(getNode("EXT_ATTRIBUTES", extAttributes.toString()));
		//  REQUEST       
		StringBuilder request = new StringBuilder();
		request.append(getNode("SYS_ID","aps"));
		request.append(getNode("OPERATOR_ID", "tt"));
		request.append(getNode("ID_NO", "123"));
		request.append(getNode("ID_TYPE", "I"));
		request.append(getNode("NAME", "czy"));
		// REQUEST       SERVICE_BODY 
		serviceBody.append(getNode("REQUEST", request.toString()));
		// SERVICE_BODY          EXT_ATTRIBUTES
		xmlReq.append(getNode("SERVICE_BODY", serviceBody.toString()));
		xmlReq.append("");
		System.out.println(xmlReq);
		return xmlReq.toString();
	}
	
	/**
	 *             ,       
	 * @param nodeName     
	 * @param nodeValue     
	 * @return	         
	 */
	private static String getNode(String nodeName,String nodeValue){
		StringBuilder node = new StringBuilder();
		if(!StringUtils.isEmpty(nodeName)){
			node.append("");
			if(!StringUtils.isEmpty(nodeValue)){
				node.append(nodeValue);
			}
			node.append(""+nodeName+">");
		}
		return node.toString();
	}
}

이 xml 데 이 터 는 dom4j 로 조립 하지 않 고 다음 과 같은 문자열 로 연결 할 수 있 습 니 다. 클 라 이언 트
package test.s;

import java.io.DataOutputStream;
import java.io.IOException;
import java.net.Socket;
import java.util.HashMap;
import java.util.Map;
import java.util.Map.Entry;

public class CallApsService {
	private Socket s;
	private DataOutputStream out;

	public CallApsService() throws IOException {
	}

	public static void main(String[] args) throws Exception {
		CallApsService c = new CallApsService();
		int i = 0;
		Map infoMap = initInput();
		for(Entry enty: infoMap.entrySet()){
			i++;
			c.talk(enty.getKey(),enty.getValue(),i);
			System.out.println("      !");
		}
	}

	//     
	// ObjectOutputStream oos;
	// TransferObj obj;
	public void sendMessage(Socket s,String idNo,String name,int i) {
		try {

			// socket    
			out = new DataOutputStream(s.getOutputStream());
			//     
			String xmlReq = "198234712374-1741274812100org101tt20050621123000010123456789ABCDEFapstt123Iczy";
			
			
			String lenthEncode = "UTF-8";
			long len = xmlReq.getBytes(lenthEncode).length;
			String length=String.format("%06d",len);
			xmlReq = length+ xmlReq;
			byte[] bt = xmlReq.getBytes(lenthEncode);
			out.write(bt);

		} catch (IOException e) {
			e.printStackTrace();
		}

	}

	public void talk(String idNo,String name,int i) throws Exception {
		try {
			//     
			s = new Socket("127.0.0.1", 7896);
			System.out.println("   :    ");
			sendMessage(s,idNo,name, i);
			System.out.println("      !");
			//     
//			 receiveMessage(s);
			out.close();
			// in.close();
		} catch (Exception e) {
			e.printStackTrace();
		} finally {
			try {
				if (s != null)
					s.close(); //     
			} catch (IOException e) {
				e.printStackTrace();
			}
		}
	}
	
	
	public static Map initInput(){
		
		Map infoMap = new HashMap();
		infoMap.put("140106198506020369","    ");
		
		return infoMap;
	}
	
	
}

서버
package socket;

import java.io.DataInputStream;
import java.net.ServerSocket;
import java.net.Socket;

public class CallExtPbocServer {

	public static void main(String[] args) {
		int serverPort = 7896;
		ServerSocket listenSocket ;
		Socket clientSocket ;
		try {
//			******************            ******************************************
				listenSocket = new ServerSocket(serverPort);
			    clientSocket = listenSocket.accept();
			    DataInputStream in = new DataInputStream(clientSocket.getInputStream());
			    byte[] buf=new byte[1024];
			    int tag=in.read(buf);
			    if(tag!=-1){
			    	System.out.println(new String(buf,0,tag));
			    }
			    in.close();
		}catch(Exception e){
			
		}
		
	}

}

좋은 웹페이지 즐겨찾기