2023年8月3日发(作者:)
WebService、Http请求、Socket请求WebService定义⼀种web程序访问⽅式,常见协议:SOAP(简单对象访问协议),其实就是Http+XML。利⽤对象进⾏数据交互。请求⽅法import 4j;import s;import nt;import ntHelper;import t;import tream;import Stream;import LConnection;import ;/** * @program:FoundationStudy * @Author: zhuyang * @Date: 2021/09/07/20:20 * @Description: WebService服务请求 */@Slf4jpublic class WebServiceUtils { public static String setSoapParam(String xml) throws Exception { StringBuilder parm = new StringBuilder(200); //包装壳需要根据不同的服务,进⾏不同的修改 xmlns:web="vice"> ("">rn") .append("rn") .append("rn") .append("rn") .append("") .append("") .append("rn") .append("rn") .append(" rn") .append(""); //n(ng()); return ng(); } /** * description
* param [soapHeader 参数, url 地址, host ?] * return * author zhuyang * createTime 2021/9/7 23:13 **/ public static String sendDataToWebService(String soapHeader,String url,String host) throws Exception { soapHeader = setSoapParam(soapHeader); String contentType = "text/xml;charset=UTF-8"; String SOAPAction = "urn:getService"; URL u = new URL(url); HttpURLConnection conn = (HttpURLConnection) nnection(); nectTimeout(60000); dTimeout(60000); nput(true); utput(true); Caches(false); aultUseCaches(false); /** * * 设置Host头部来让nginx识别,可以为IP,也可以为域名,也可以不设置,不⼀定要和url的ip相同 * 若nginx⽆法识别,添加下列代码,告诉程序,允许能使⽤这些限制的头部即可 * perty("estrictedHeaders", "true"); * * **/ uestProperty("Host", host); uestProperty("Content-Type", contentType); uestProperty("Content-Length", f(())); uestProperty("SOAPAction", ""); uestMethod("POST"); //定义输出流 OutputStream output = putStream(); if (null != soapHeader) { byte[] b = ng().getBytes("utf-8"); //发送soap请求报⽂ (b, 0, ); } (); (); //定义输⼊流,获取soap响应报⽂ InputStream input = utStream(); //需设置编码格式,否则会乱码 String s = ng(input, "UTF-8"); (); n("输出的xml=" + s); Document document = ext(s); Element root = tElement(); return ingValue(); }参考Http请求定义利⽤TCP/IP协议和json数据格式进⾏数据传输,现在也开始流⾏RestFul风格;是应⽤层协议,主要解决如何包装数据。1)在HTTP 1.0中,客户端的每次请求都要求建⽴⼀次单独的连接,在处理完本次请求后,就⾃动释放连接。2)在HTTP 1.1中则可以在⼀次连接中处理多个请求,并且多个请求可以重叠进⾏,不需要等待⼀个请求结束后再发送下⼀个请求。由于HTTP在每次请求结束后都会主动释放连接,因此HTTP连接是⼀种“短连接”,要保持客户端程序的在线状态,需要不断地向服务器发起连接请求。通常的做法是即时不需要获得任何数据,客户端也保持每隔⼀段固定的时间向服务器发送⼀次“保持连接”的请求,服务器在收到该请求后对客户端进⾏回复,表明知道客户端“在线”。若服务器长时间⽆法收到客户端的请求,则认为客户端“下线”,若客户端长时间⽆法收到服务器的回复,则认为⽹络已经断开。请求⽅法import edReader;import tputStream;import treamReader;import Stream;import LConnection;import ;import p;import ;import ; public static String sendByPost(String urlString, Object params) { Map> responseMap = new HashMap>(); String content = null; // 正⽂内容 BufferedReader bfr = null; DataOutputStream out = null; try { URL url = new URL(urlString); /** -- 创建URL连接 -- */ HttpURLConnection conn = (HttpURLConnection) nnection(); //设置请求⽅式 uestMethod("POST"); //设置获取连接时间 nectTimeout(10000); //设置阅读时间 dTimeout(10000); /** -- 设置通⽤的请求属性 -- */ //uestProperty("appId", ""); /** * utput(true);以后就可以使⽤putStream().write() * nput(true);以后就可以使⽤utStream().read(); * get请求⽤不到putStream(),因为参数直接追加在地址后⾯,因此默认是false。 * post请求(⽐如:⽂件上传)需要往服务区传输⼤量的数据,这些数据是放在http的body⾥⾯的,因此需要在建⽴连接以后,往服务端写数据。 * 因为总是使⽤utStream()获取服务端的响应,因此默认值是true。 */ utput(true); nput(true); //设置请求头 uestProperty("Accept-Charset", "UTF-8"); //uestProperty("Content-Type", "application/x-www-form-urlencoded"); uestProperty("Content-Type", "application/json"); t(); OutputStream writer = putStream(); // 写⼊请求的字符串 ((ng()).getBytes("UTF-8")); (); /** -- 获取所有响应头字段 -- */ responseMap = derFields(); /** -- 读取响应内容 -- */ bfr = new BufferedReader(new InputStreamReader(utStream(), "UTF-8")); String s = null; StringBuffer sbf = new StringBuffer(); while ((s = ne()) != null) { (s); } content = ng(); } catch (Exception ex) { n("发送请求错误 -- 错误信息:" + sage()); } finally { try { if (bfr != null) { (); } } catch (Exception ex) { n("关闭流错误 -- 错误信息:" + sage()); } } return content; }Socket请求定义Socket是对TCP/IP协议的封装,Socket本⾝并不是协议,⽽是⼀个调⽤接⼝(API),通过Socket,我们才能使⽤TCP/IP协议。socket连接就是所谓的长连接,理论上客户端和服务器端⼀旦建⽴起连接将不会主动断掉;但是由于各种环境因素可能会是连接断开,⽐如说:服务器端或客户端主机down了,⽹络故障,或者两者之间长时间没有数据传输,⽹络防⽕墙可能会断开该连接以释放⽹络资源。所以当⼀个socket连接中没有数据的传输,那么为了维持连接需要发送⼼跳消息~具体⼼跳消息格式是开发者⾃⼰定义的。服务器端import ;import ption;import tream;import Stream;import Socket;import ;import orService;import static ors.*;/** * @program:FoundationStudy * @Author: zhuyang * @Date: 2021/09/03/15:42 * @Description: */public class SocketServer { @Test public void socketServer() throws IOException, InterruptedException { ExecutorService newCacheThreadPool = newCachedThreadPool(); //创建Socket服务,监听10000端⼝ ServerSocket server = new ServerSocket(51503); n("服务启动"); while (true){ //获取⼀个套接字(阻塞) final Socket socket = (); n("来了⼀个客户端"); e(new Runnable() { @Override public void run() { handler(socket); } }); } } private static void handler(Socket socket) { byte[] bytes = new byte[1024]; try { InputStream inputStream = utStream(); String message=""; while (true){ //读取数据(阻塞) int read = (bytes); if(read != -1){ message+=new String(bytes,0,read); }else { break; } } n("客户端发送消息:"+message); OutputStream out = putStream(); // 6. 回写数据 // (1000*100); ("我很好,谢谢你我很好,谢谢你我很好,谢谢你我很好,谢谢你我很好,谢谢你我很好,谢谢你我很好,谢谢你我很好,谢谢你我很好,谢谢你我很好,谢谢你我很好,谢谢你我很好,谢谢你我很好,谢谢你我很好,谢谢你我很好,谢谢你我很好,谢谢你 // 7.关闭资源. (); } catch (IOException e) { tackTrace(); }finally { n("socket关闭"); try { if (socket != null) (); } catch (IOException e) { tackTrace(); } } }}客户端import ;import .*;import cketAddress;import ;import nHostException;/** * @program:FoundationStudy * @Author: zhuyang * @Date: 2021/09/03/10:11 * @Description: */public class SocketClient { //默认超时时间⼀分钟以上 2分钟以内 public static String socket(String ip, Integer port, String message) throws IOException { String info = ""; BufferedReader bufferedReader = null; InputStream inputStream = null; PrintWriter printWriter = null; OutputStream outputStream = null; Socket socket = null; long t1=0; try { t1=tTimeMillis(); socket = new Socket(); /** * 设置建⽴链接超时时间 * TimeoutException: connect timed out 建⽴链接超时 **/ t(new InetSocketAddress(ip,port),10000); /** * 设置读超时时间 * TimeoutException: Read timed out 设置读超时时间 **/ imeout(3*1000); // Socket写超时是基于TCP协议栈的超时重传机制,⼀般不需要设置write的超时时间,也没有提供这种⽅法。 //根据输⼊输出流和服务端连接 outputStream = putStream();//获取⼀个输出流,向服务端发送信息 printWriter = new PrintWriter(outputStream);//将输出流包装成打印流 (message); (); wnOutput();//关闭输出流 inputStream = utStream(); //获取⼀个输⼊流,接收服务端的信息 byte[] content2 = getContent2(inputStream); info = new String(content2); //关闭相对应的资源 } catch (UnknownHostException e) { tackTrace(); } catch (IOException e) { n(""+(tTimeMillis()-t1)); tackTrace(); } finally { if (bufferedReader != null) { (); } ; if (inputStream != null) { (); } ; if (printWriter != null) { (); } ; if (outputStream != null) { (); } ; if (socket != null) { (); } ; } return info; } //第⼆种获取⽂件内容⽅式,先把所有内容获取为⼀个byte数组 public static byte[] getContent2(InputStream inputStream) throws IOException { ByteArrayOutputStream out = new ByteArrayOutputStream(1024); byte[] temp = new byte[1024]; int size = 0; while ((size = (temp)) != -1) { (temp, 0, size); } (); byte[] bytes = Array(); return bytes; } @Test public void socketTest() throws IOException { String server = socket("127.0.0.1", 51503, "服务端你好吗"); n("服务端返回:" + ing(26,()-16)); }}Gitee地址
2023年8月3日发(作者:)
WebService、Http请求、Socket请求WebService定义⼀种web程序访问⽅式,常见协议:SOAP(简单对象访问协议),其实就是Http+XML。利⽤对象进⾏数据交互。请求⽅法import 4j;import s;import nt;import ntHelper;import t;import tream;import Stream;import LConnection;import ;/** * @program:FoundationStudy * @Author: zhuyang * @Date: 2021/09/07/20:20 * @Description: WebService服务请求 */@Slf4jpublic class WebServiceUtils { public static String setSoapParam(String xml) throws Exception { StringBuilder parm = new StringBuilder(200); //包装壳需要根据不同的服务,进⾏不同的修改 xmlns:web="vice"> ("">rn") .append("rn") .append("rn") .append("rn") .append("") .append("") .append("rn") .append("rn") .append(" rn") .append(""); //n(ng()); return ng(); } /** * description
* param [soapHeader 参数, url 地址, host ?] * return * author zhuyang * createTime 2021/9/7 23:13 **/ public static String sendDataToWebService(String soapHeader,String url,String host) throws Exception { soapHeader = setSoapParam(soapHeader); String contentType = "text/xml;charset=UTF-8"; String SOAPAction = "urn:getService"; URL u = new URL(url); HttpURLConnection conn = (HttpURLConnection) nnection(); nectTimeout(60000); dTimeout(60000); nput(true); utput(true); Caches(false); aultUseCaches(false); /** * * 设置Host头部来让nginx识别,可以为IP,也可以为域名,也可以不设置,不⼀定要和url的ip相同 * 若nginx⽆法识别,添加下列代码,告诉程序,允许能使⽤这些限制的头部即可 * perty("estrictedHeaders", "true"); * * **/ uestProperty("Host", host); uestProperty("Content-Type", contentType); uestProperty("Content-Length", f(())); uestProperty("SOAPAction", ""); uestMethod("POST"); //定义输出流 OutputStream output = putStream(); if (null != soapHeader) { byte[] b = ng().getBytes("utf-8"); //发送soap请求报⽂ (b, 0, ); } (); (); //定义输⼊流,获取soap响应报⽂ InputStream input = utStream(); //需设置编码格式,否则会乱码 String s = ng(input, "UTF-8"); (); n("输出的xml=" + s); Document document = ext(s); Element root = tElement(); return ingValue(); }参考Http请求定义利⽤TCP/IP协议和json数据格式进⾏数据传输,现在也开始流⾏RestFul风格;是应⽤层协议,主要解决如何包装数据。1)在HTTP 1.0中,客户端的每次请求都要求建⽴⼀次单独的连接,在处理完本次请求后,就⾃动释放连接。2)在HTTP 1.1中则可以在⼀次连接中处理多个请求,并且多个请求可以重叠进⾏,不需要等待⼀个请求结束后再发送下⼀个请求。由于HTTP在每次请求结束后都会主动释放连接,因此HTTP连接是⼀种“短连接”,要保持客户端程序的在线状态,需要不断地向服务器发起连接请求。通常的做法是即时不需要获得任何数据,客户端也保持每隔⼀段固定的时间向服务器发送⼀次“保持连接”的请求,服务器在收到该请求后对客户端进⾏回复,表明知道客户端“在线”。若服务器长时间⽆法收到客户端的请求,则认为客户端“下线”,若客户端长时间⽆法收到服务器的回复,则认为⽹络已经断开。请求⽅法import edReader;import tputStream;import treamReader;import Stream;import LConnection;import ;import p;import ;import ; public static String sendByPost(String urlString, Object params) { Map> responseMap = new HashMap>(); String content = null; // 正⽂内容 BufferedReader bfr = null; DataOutputStream out = null; try { URL url = new URL(urlString); /** -- 创建URL连接 -- */ HttpURLConnection conn = (HttpURLConnection) nnection(); //设置请求⽅式 uestMethod("POST"); //设置获取连接时间 nectTimeout(10000); //设置阅读时间 dTimeout(10000); /** -- 设置通⽤的请求属性 -- */ //uestProperty("appId", ""); /** * utput(true);以后就可以使⽤putStream().write() * nput(true);以后就可以使⽤utStream().read(); * get请求⽤不到putStream(),因为参数直接追加在地址后⾯,因此默认是false。 * post请求(⽐如:⽂件上传)需要往服务区传输⼤量的数据,这些数据是放在http的body⾥⾯的,因此需要在建⽴连接以后,往服务端写数据。 * 因为总是使⽤utStream()获取服务端的响应,因此默认值是true。 */ utput(true); nput(true); //设置请求头 uestProperty("Accept-Charset", "UTF-8"); //uestProperty("Content-Type", "application/x-www-form-urlencoded"); uestProperty("Content-Type", "application/json"); t(); OutputStream writer = putStream(); // 写⼊请求的字符串 ((ng()).getBytes("UTF-8")); (); /** -- 获取所有响应头字段 -- */ responseMap = derFields(); /** -- 读取响应内容 -- */ bfr = new BufferedReader(new InputStreamReader(utStream(), "UTF-8")); String s = null; StringBuffer sbf = new StringBuffer(); while ((s = ne()) != null) { (s); } content = ng(); } catch (Exception ex) { n("发送请求错误 -- 错误信息:" + sage()); } finally { try { if (bfr != null) { (); } } catch (Exception ex) { n("关闭流错误 -- 错误信息:" + sage()); } } return content; }Socket请求定义Socket是对TCP/IP协议的封装,Socket本⾝并不是协议,⽽是⼀个调⽤接⼝(API),通过Socket,我们才能使⽤TCP/IP协议。socket连接就是所谓的长连接,理论上客户端和服务器端⼀旦建⽴起连接将不会主动断掉;但是由于各种环境因素可能会是连接断开,⽐如说:服务器端或客户端主机down了,⽹络故障,或者两者之间长时间没有数据传输,⽹络防⽕墙可能会断开该连接以释放⽹络资源。所以当⼀个socket连接中没有数据的传输,那么为了维持连接需要发送⼼跳消息~具体⼼跳消息格式是开发者⾃⼰定义的。服务器端import ;import ption;import tream;import Stream;import Socket;import ;import orService;import static ors.*;/** * @program:FoundationStudy * @Author: zhuyang * @Date: 2021/09/03/15:42 * @Description: */public class SocketServer { @Test public void socketServer() throws IOException, InterruptedException { ExecutorService newCacheThreadPool = newCachedThreadPool(); //创建Socket服务,监听10000端⼝ ServerSocket server = new ServerSocket(51503); n("服务启动"); while (true){ //获取⼀个套接字(阻塞) final Socket socket = (); n("来了⼀个客户端"); e(new Runnable() { @Override public void run() { handler(socket); } }); } } private static void handler(Socket socket) { byte[] bytes = new byte[1024]; try { InputStream inputStream = utStream(); String message=""; while (true){ //读取数据(阻塞) int read = (bytes); if(read != -1){ message+=new String(bytes,0,read); }else { break; } } n("客户端发送消息:"+message); OutputStream out = putStream(); // 6. 回写数据 // (1000*100); ("我很好,谢谢你我很好,谢谢你我很好,谢谢你我很好,谢谢你我很好,谢谢你我很好,谢谢你我很好,谢谢你我很好,谢谢你我很好,谢谢你我很好,谢谢你我很好,谢谢你我很好,谢谢你我很好,谢谢你我很好,谢谢你我很好,谢谢你我很好,谢谢你 // 7.关闭资源. (); } catch (IOException e) { tackTrace(); }finally { n("socket关闭"); try { if (socket != null) (); } catch (IOException e) { tackTrace(); } } }}客户端import ;import .*;import cketAddress;import ;import nHostException;/** * @program:FoundationStudy * @Author: zhuyang * @Date: 2021/09/03/10:11 * @Description: */public class SocketClient { //默认超时时间⼀分钟以上 2分钟以内 public static String socket(String ip, Integer port, String message) throws IOException { String info = ""; BufferedReader bufferedReader = null; InputStream inputStream = null; PrintWriter printWriter = null; OutputStream outputStream = null; Socket socket = null; long t1=0; try { t1=tTimeMillis(); socket = new Socket(); /** * 设置建⽴链接超时时间 * TimeoutException: connect timed out 建⽴链接超时 **/ t(new InetSocketAddress(ip,port),10000); /** * 设置读超时时间 * TimeoutException: Read timed out 设置读超时时间 **/ imeout(3*1000); // Socket写超时是基于TCP协议栈的超时重传机制,⼀般不需要设置write的超时时间,也没有提供这种⽅法。 //根据输⼊输出流和服务端连接 outputStream = putStream();//获取⼀个输出流,向服务端发送信息 printWriter = new PrintWriter(outputStream);//将输出流包装成打印流 (message); (); wnOutput();//关闭输出流 inputStream = utStream(); //获取⼀个输⼊流,接收服务端的信息 byte[] content2 = getContent2(inputStream); info = new String(content2); //关闭相对应的资源 } catch (UnknownHostException e) { tackTrace(); } catch (IOException e) { n(""+(tTimeMillis()-t1)); tackTrace(); } finally { if (bufferedReader != null) { (); } ; if (inputStream != null) { (); } ; if (printWriter != null) { (); } ; if (outputStream != null) { (); } ; if (socket != null) { (); } ; } return info; } //第⼆种获取⽂件内容⽅式,先把所有内容获取为⼀个byte数组 public static byte[] getContent2(InputStream inputStream) throws IOException { ByteArrayOutputStream out = new ByteArrayOutputStream(1024); byte[] temp = new byte[1024]; int size = 0; while ((size = (temp)) != -1) { (temp, 0, size); } (); byte[] bytes = Array(); return bytes; } @Test public void socketTest() throws IOException { String server = socket("127.0.0.1", 51503, "服务端你好吗"); n("服务端返回:" + ing(26,()-16)); }}Gitee地址
发布评论