socket 통신 상호 전송 읽 기 xml 인 스 턴 스
17422 단어 자바네트워크 통신io 흐름 다양한 방식 의 사례
문 제 는 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-17412748 12100 org1 01 tt 20050621123000 01 0123456789ABCDEF aps tt 123 I czy ";
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){
}
}
}
이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 AI 엔진은 머신러닝 분석(스마트 모델이 방금 만들어져 부정확한 경우가 있을 수 있음)을 통해 가장 유사한 기사를 추천합니다:
Is Eclipse IDE dying?In 2014 the Eclipse IDE is the leading development environment for Java with a market share of approximately 65%. but ac...
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
CC BY-SA 2.5, CC BY-SA 3.0 및 CC BY-SA 4.0에 따라 라이센스가 부여됩니다.