<ruby id="bdb3f"></ruby>

    <p id="bdb3f"><cite id="bdb3f"></cite></p>

      <p id="bdb3f"><cite id="bdb3f"><th id="bdb3f"></th></cite></p><p id="bdb3f"></p>
        <p id="bdb3f"><cite id="bdb3f"></cite></p>

          <pre id="bdb3f"></pre>
          <pre id="bdb3f"><del id="bdb3f"><thead id="bdb3f"></thead></del></pre>

          <ruby id="bdb3f"><mark id="bdb3f"></mark></ruby><ruby id="bdb3f"></ruby>
          <pre id="bdb3f"><pre id="bdb3f"><mark id="bdb3f"></mark></pre></pre><output id="bdb3f"></output><p id="bdb3f"></p><p id="bdb3f"></p>

          <pre id="bdb3f"><del id="bdb3f"><progress id="bdb3f"></progress></del></pre>

                <ruby id="bdb3f"></ruby>

                ThinkChat2.0新版上線,更智能更精彩,支持會話、畫圖、視頻、閱讀、搜索等,送10W Token,即刻開啟你的AI之旅 廣告
                # 概述 通訊,源于網絡,網絡從下到上,分為7層:物理層、數據鏈路層、網絡層、傳輸層、會話層、表示層和應用層;通訊,基于協議,常用的協議有很多,比如網絡層協議IP、傳輸層協議TCP/UDP、應用層協議HTTP/SOAP/REST等。 我們還會經常聽到Socket,TCP/IP也要提供可供程序員做網絡開發所用的接口,這就是Socket編程接口。有個形象的比喻:HTTP是轎車,提供了封裝或者顯示數據的具體形式;Socket是發動機,提供了網絡通信的能力。 任何語言,都會提供對通訊的支持,我們今天用Java語言,演示幾種在Java中比較常用的通訊技術,包括:Socket、Http、REST、Dubbo、Thrift、FTP。 # Socket **SocketServer.java** ~~~ import java.io.BufferedReader; import java.io.BufferedWriter; import java.io.IOException; import java.io.InputStreamReader; import java.io.OutputStreamWriter; import java.io.PrintWriter; import java.net.ServerSocket; import java.net.Socket; public class SocketServer { public static void main(String[] args) { SocketServer ss = new SocketServer(); //設定服務端的端口號 ServerSocket s = null; try { s = new ServerSocket(10099); System.out.println("ServerSocket Start:"+s); while(true) { Socket socket = s.accept(); //這個地方是阻塞的 System.out.println("Server_Accept:"+socket); SocketServer.HandleSocket vsm = ss.new HandleSocket(socket); new Thread(vsm).start(); } } catch (IOException e) { e.printStackTrace(); } finally { try { s.close(); } catch (IOException e) { } } } class HandleSocket implements Runnable { private Socket socket; public HandleSocket(Socket socket) { this.socket = socket; } @Override public void run() { BufferedReader br = null; PrintWriter pw = null; try { //用于接收客戶端發來的請求 br = new BufferedReader(new InputStreamReader(socket.getInputStream())); //用于發送返回信息,可以不需要裝飾這么多io流使用緩沖流時發送數據要注意調用.flush()方法 pw = new PrintWriter(new BufferedWriter(new OutputStreamWriter(socket.getOutputStream())),true); String str = br.readLine(); if(str != null) { pw.println("OK_"+Thread.currentThread().getName()); pw.flush(); System.out.println("Command:"+str); } } catch (Exception e) { e.printStackTrace(); }finally{ System.out.println("Server_Close:"+socket); try { br.close(); pw.close(); socket.close(); } catch (Exception e2) { } } } } } ~~~ **SocketClient.java** ~~~ import java.io.BufferedReader; import java.io.BufferedWriter; import java.io.InputStreamReader; import java.io.OutputStreamWriter; import java.io.PrintWriter; import java.net.Socket; public class SocketClient { public static void main(String[] args) throws InterruptedException { for(int i=0;i<10;i++) { call( "Hello" + i); } } public static void call(String command) { Socket socket = null; BufferedReader br = null; PrintWriter pw = null; try { //客戶端socket指定服務器的地址和端口號 socket = new Socket("127.0.0.1", 10099); System.out.println("Client_Open" + socket + " Command:" + command); //同服務器原理一樣 br = new BufferedReader(new InputStreamReader(socket.getInputStream())); pw = new PrintWriter(new BufferedWriter(new OutputStreamWriter(socket.getOutputStream()))); pw.println(command); pw.flush(); String str = br.readLine(); System.out.println("Client_Receive:"+str); } catch (Exception e) { e.printStackTrace(); } finally { try { System.out.println("Client_Close:"+socket); br.close(); pw.close(); socket.close(); } catch (Exception e) { e.printStackTrace(); } } } } ~~~ # Http ### **HttpConnection演示** ~~~ import java.io.BufferedReader; import java.io.InputStreamReader; import java.io.OutputStream; import java.io.OutputStreamWriter; import java.net.HttpURLConnection; import java.net.URL; public class HttpConnectionTest { public static void main(String[] args) throws Exception { System.out.println("begin send"); String inputParam = "<?xml version=\"1.0\" encoding=\"UTF-8\"?><content>Test</content></page>"; URL url = null; HttpURLConnection httpConn = null; OutputStream output = null; OutputStreamWriter outr = null; //url = new URL("http://127.0.0.1:8888/iotest/ReadServlet"); url = new URL("http://www.baidu.com"); httpConn = (HttpURLConnection) url.openConnection(); httpConn.setConnectTimeout(30000); httpConn.setReadTimeout(30000); HttpURLConnection.setFollowRedirects(true); httpConn.setDoOutput(true); httpConn.setRequestMethod("POST"); httpConn.setRequestProperty("Content-Type", "text/xml"); httpConn.connect(); output = httpConn.getOutputStream(); outr = new OutputStreamWriter(output); // 寫入請求參數 outr.write(inputParam.toString().toCharArray(), 0, inputParam.toString().length()); outr.flush(); outr.close(); System.out.println("send ok"); int code = httpConn.getResponseCode(); System.out.println("code " + code); System.out.println(httpConn.getResponseMessage()); //讀取響應內容 String sCurrentLine = ""; String sTotalString = ""; if (code == 200) { java.io.InputStream is = httpConn.getInputStream(); BufferedReader reader = new BufferedReader(new InputStreamReader(is)); while ((sCurrentLine = reader.readLine()) != null) if (sCurrentLine.length() > 0) sTotalString = sTotalString + sCurrentLine.trim(); } else { sTotalString = "遠程服務器連接失敗,錯誤代碼:" + code; } System.out.println("response:" + sTotalString); } } ~~~ ### **Apache HttpComponents** 官網:[http://hc.apache.org/](http://hc.apache.org/) 已經廢棄的Jar(這個項目,自從2007年8月份就不再維護了,已經遷移到org.apache.httpcomponents了): ~~~ <dependency> <groupId>commons-httpclient</groupId> <artifactId>commons-httpclient</artifactId> <version>3.1</version> </dependency> ~~~ org.apache.httpcomponents maven依賴: ~~~ <dependency> <groupId>org.apache.httpcomponents</groupId> <artifactId>httpcore</artifactId> <version>4.2.3</version> </dependency> <dependency> <groupId>org.apache.httpcomponents</groupId> <artifactId>httpclient</artifactId> <version>4.2.3</version> </dependency> ~~~ Apache HttpComponents代碼演示: ~~~ import java.io.ByteArrayOutputStream; import java.io.FileInputStream; import java.io.IOException; import java.io.InputStream; import java.security.KeyStore; import java.util.ArrayList; import java.util.List; import org.apache.http.HttpEntity; import org.apache.http.HttpException; import org.apache.http.HttpResponse; import org.apache.http.NameValuePair; import org.apache.http.client.entity.UrlEncodedFormEntity; import org.apache.http.client.methods.HttpPost; import org.apache.http.conn.scheme.Scheme; import org.apache.http.conn.ssl.SSLSocketFactory; import org.apache.http.impl.client.DefaultHttpClient; import org.apache.http.message.BasicNameValuePair; import org.apache.http.params.CoreConnectionPNames; import org.apache.http.params.HttpParams; import com.creditease.ns.oltp.tunneladapter.tunnels.cb.util.CbConst; /** * 更多參考網址:http://hc.apache.org/ * */ public class HttpClientTest { static String url = "http://www.tuicool.com/"; public static void main(String[] args) throws HttpException, IOException { testHttp2(); } public static void testHttp2() { org.apache.http.client.HttpClient httpClient = null; HttpPost httpPost = null; InputStream in = null; httpClient = new DefaultHttpClient(); httpPost = new HttpPost(url); String resp = ""; try { httpClient = new DefaultHttpClient(); httpPost = new HttpPost(url); if (url.indexOf("https") != -1) { KeyStore keyStore = KeyStore.getInstance(KeyStore.getDefaultType()); in = new FileInputStream("quick.keystore"); keyStore.load(in, "chinabank".toCharArray()); SSLSocketFactory sslSocketFactory = new SSLSocketFactory(keyStore); Scheme scheme = new Scheme("https", 443, sslSocketFactory); httpClient.getConnectionManager().getSchemeRegistry().register(scheme); } HttpParams httpParams = httpClient.getParams(); httpParams.setIntParameter(CoreConnectionPNames.CONNECTION_TIMEOUT, 1000 * 20); httpParams.setIntParameter(CoreConnectionPNames.SO_TIMEOUT, 1000 * 40); List<NameValuePair> reqPair = new ArrayList<NameValuePair>(); reqPair.add(new BasicNameValuePair("charset", "UTF-8")); reqPair.add(new BasicNameValuePair("req", "nihao")); UrlEncodedFormEntity urlEncodedFormEntity = new UrlEncodedFormEntity(reqPair, "UTF-8"); httpPost.setEntity(urlEncodedFormEntity); HttpResponse response = httpClient.execute(httpPost); HttpEntity responseEntity = response.getEntity(); if (responseEntity != null) { InputStream is = responseEntity.getContent(); ByteArrayOutputStream baos = new ByteArrayOutputStream(); byte[] buffer = new byte[1024]; int ch = 0; while ((ch = is.read(buffer)) != -1) { baos.write(buffer, 0, ch); } byte bytes[] = baos.toByteArray(); resp = new String(bytes, CbConst.ENCODING); } int statusCode = response.getStatusLine().getStatusCode(); System.out.println("statusCode:" + statusCode); System.out.println("resp:" + resp); } catch (Exception e) { e.printStackTrace(); } finally { try { if (in != null) { in.close(); } httpPost.releaseConnection(); httpClient.getConnectionManager().shutdown(); } catch (Exception e) { e.printStackTrace(); } } } } ~~~ quick.keystore,是一個密碼保護的文件,存放私鑰和證書。可以通過JDK自帶的keytool工具生成。只要有密碼,可以提取出私鑰和證書。參考網址: [從Java Keystore文件中提取私鑰、證書](http://blog.csdn.net/moreorless/article/details/4985940)[](#) [keystore提取私鑰和證書](http://blog.csdn.net/madun/article/details/8677783) [java 調用 keytool 生成keystore 和 cer 證書](http://blog.csdn.net/saindy5828/article/details/11987587) [KeyStore中的別名](http://blog.csdn.net/peterwanghao/article/details/1771723) ### 一個Http壓測例程 ~~~ import java.io.BufferedReader; import java.io.File; import java.io.FileWriter; import java.io.IOException; import java.io.InputStream; import java.io.InputStreamReader; import java.net.HttpURLConnection; import java.net.InetSocketAddress; import java.net.Proxy; import java.net.URL; import java.text.SimpleDateFormat; import java.util.Date; import java.util.List; import java.util.Map.Entry; import java.util.Timer; import java.util.TimerTask; import java.util.UUID; import java.util.concurrent.ExecutorService; import java.util.concurrent.Executors; public class HttpSocketPressTest { private Long succNum = 0L; private Long failNum = 0L; private Long connFailNum = 0L; private Long readFailNum = 0L; private Long otherFailNum = 0L; private Long beginTime = System.currentTimeMillis(); private Boolean recordSuccReturn = false; private String url = "http://www.baidu.com"; public static final int ThreadNum = 100; public static final int MonitorInterval = 3; public static void main(String[] args) throws Exception { createDir("d:\\httptest\\"); createDir("d:\\httptest\\succ\\"); createDir("d:\\httptest\\fail\\"); createDir("d:\\httptest\\exec\\"); createDir("d:\\httptest\\execother\\"); HttpSocketPressTest hspt = new HttpSocketPressTest(); if ((args != null) && (args.length > 0)) { hspt.setRecordSuccReturn(true); } System.out.println("開" + ThreadNum + "個線程,測試用使用Socket5[10.100.140.85:1080]代理Get方式訪問外網。"); System.out.println("如果需要對200返回也記錄返回內容,請運行程序時輸入任意參數,記錄位置d:/httptest/succ。"); System.out.println("異常及非200返回會寫在d:/httptest/exception和fail目錄。"); ExecutorService executorService = Executors.newFixedThreadPool(ThreadNum); for (int i = 0; i < ThreadNum; i++) { executorService.submit(new HttpConn(hspt)); } Monitor m = new Monitor(hspt); Timer timer = new Timer(); timer.schedule(m, MonitorInterval * 1000, MonitorInterval * 1000); } public synchronized void IncreaseSuccNum() { succNum++; } public synchronized void IncreaseFailNum() { failNum++; } public synchronized void IncreaseConnFailNum() { connFailNum++; } public synchronized void IncreaseReadFailNum() { readFailNum++; } public synchronized void IncreaseOtherFailNum() { otherFailNum++; } public synchronized Long getSuccNum() { return succNum; } public synchronized Long getFailNum() { return failNum; } public synchronized Long getConnFailNum() { return connFailNum; } public synchronized Long getReadFailNum() { return readFailNum; } public synchronized Long getOtherFailNum() { return otherFailNum; } public Long getBeginTime() { return beginTime; } public void setRecordSuccReturn(Boolean b) { recordSuccReturn = b; } public Boolean getRecordSuccReturn() { return recordSuccReturn; } public String getUrl() { return url; } private static void createDir(String dir) { File f = new File(dir); if (!f.exists()) { f.mkdir(); } } } class Monitor extends TimerTask { private HttpSocketPressTest hspt; private Long times = 0L; public Monitor(HttpSocketPressTest hspt) { this.hspt = hspt; } @Override public void run() { Long nowTime = System.currentTimeMillis(); Long interval = nowTime - hspt.getBeginTime(); System.out.println(""); System.out.println("間隔" + HttpSocketPressTest.MonitorInterval + "秒報告一次結果,這是第" + ++times + "次,如下:"); System.out.println("當前時間:" + new Date()); System.out.println("累計運行時間(單位秒):" + (interval / 1000)); System.out.println("成功次數:" + hspt.getSuccNum() + ";平均每秒成功次數:" + ((hspt.getSuccNum() * 1000) / interval)); System.out.println("失敗次數:" + hspt.getFailNum() + "【Connection timed out:" + hspt.getConnFailNum() + ",Read timed out:" + hspt.getReadFailNum() + ",其他異常:" + hspt.getOtherFailNum() + "】"); } } class HttpConn implements Runnable { private HttpSocketPressTest hspt; public HttpConn(HttpSocketPressTest hspt) { this.hspt = hspt; } @Override public void run() { while (true) { SimpleDateFormat sdf = new SimpleDateFormat("yyyyMMdd-HHmmss"); String d = sdf.format(new Date()); // System.out.println("[" + d + "] [" + Thread.currentThread().getName() + // "] [訪問外網]"); // long startTime = System.currentTimeMillis(); String strUrl = hspt.getUrl(); String domainName = strUrl.split("\\.")[1]; HttpURLConnection httpConn = null; BufferedReader reader = null; try { URL url = null; url = new URL(strUrl); Proxy p; p = new Proxy(Proxy.Type.SOCKS, new InetSocketAddress("10.100.140.85", 1080)); httpConn = (HttpURLConnection) url.openConnection(p); httpConn.setConnectTimeout(30 * 1000); httpConn.setReadTimeout(30 * 1000); HttpURLConnection.setFollowRedirects(true); httpConn.setDoOutput(true); httpConn.setRequestMethod("GET"); httpConn.setRequestProperty("Content-Type", "text/xml"); for (Entry<String, List<String>> m : httpConn.getHeaderFields().entrySet()) { // System.out.println(m.getKey() + ":" + m.getValue()); } // 這行代碼會報:java.net.ConnectException: Connection timed out: connect httpConn.connect(); int code = httpConn.getResponseCode(); // 讀取響應內容 String sCurrentLine = ""; StringBuilder sb = new StringBuilder(); if (code == 200) { hspt.IncreaseSuccNum(); } else { hspt.IncreaseFailNum(); } sb.append("StatusCode:").append(code).append("\n"); sb.append("url:").append(strUrl).append("\n"); InputStream is = httpConn.getInputStream(); reader = new BufferedReader(new InputStreamReader(is)); // 這行代碼會報:java.net.SocketTimeoutException: Read timed out while ((sCurrentLine = reader.readLine()) != null) { if (sCurrentLine.length() > 0) { sb.append(sCurrentLine.trim()); } } // System.out.println("接收內容大小:" + sb.toString().length()); if (hspt.getRecordSuccReturn() && (code == 200)) { writeFile("d:\\httptest\\succ\\" + d + "_" + UUID.randomUUID() + ".html", sb.toString()); } if (code != 200) { writeFile("d:\\httptest\\fail\\" + d + "_" + UUID.randomUUID() + ".html", sb.toString()); } } catch (Exception e) { e.printStackTrace(); System.out.println(new Date()); hspt.IncreaseFailNum(); String msg = e.toString(); Boolean isOther = false; if (msg.indexOf("Connection timed out") != -1) { hspt.IncreaseConnFailNum(); } else if (msg.indexOf("Read timed out") != -1) { hspt.IncreaseReadFailNum(); } else { isOther = true; hspt.IncreaseOtherFailNum(); } if (isOther) { writeFile("d:\\httptest\\execother\\" + domainName + "_" + d + "_" + UUID.randomUUID() + ".txt", strUrl + "\r\n" + e); } else { writeFile("d:\\httptest\\exec\\" + domainName + "_" + d + "_" + UUID.randomUUID() + ".txt", strUrl + "\r\n" + e); } } finally { if (reader != null) { try { reader.close(); } catch (IOException e) { // TODO Auto-generated catch block e.printStackTrace(); } } if (httpConn != null) { httpConn.disconnect(); } // System.out.println("[" + d + "] [" + Thread.currentThread().getName() // + "] [訪問外網] [cost:[" // + (System.currentTimeMillis() - startTime) + "ms]]"); } } } private void writeFile(String name, String content) { FileWriter writer = null; try { // 打開一個寫文件器,構造函數中的第二個參數true表示以追加形式寫文件 writer = new FileWriter(name, false); writer.write(content); writer.close(); } catch (IOException e) { e.printStackTrace(); } finally { if (writer != null) { try { writer.close(); } catch (IOException e) { // TODO Auto-generated catch block e.printStackTrace(); } } } } } ~~~ # Dubbo ...待續 # Thrift ...待續 # Rest ...待續 # FTP ...待續
                  <ruby id="bdb3f"></ruby>

                  <p id="bdb3f"><cite id="bdb3f"></cite></p>

                    <p id="bdb3f"><cite id="bdb3f"><th id="bdb3f"></th></cite></p><p id="bdb3f"></p>
                      <p id="bdb3f"><cite id="bdb3f"></cite></p>

                        <pre id="bdb3f"></pre>
                        <pre id="bdb3f"><del id="bdb3f"><thead id="bdb3f"></thead></del></pre>

                        <ruby id="bdb3f"><mark id="bdb3f"></mark></ruby><ruby id="bdb3f"></ruby>
                        <pre id="bdb3f"><pre id="bdb3f"><mark id="bdb3f"></mark></pre></pre><output id="bdb3f"></output><p id="bdb3f"></p><p id="bdb3f"></p>

                        <pre id="bdb3f"><del id="bdb3f"><progress id="bdb3f"></progress></del></pre>

                              <ruby id="bdb3f"></ruby>

                              哎呀哎呀视频在线观看