1. 程式人生 > >Socket連線程式碼示例、WebService 小demo示例

Socket連線程式碼示例、WebService 小demo示例

最近面試遇到的問題

  • 1:開閉原則
    開放對原來程式碼的擴充套件,封閉對原來程式碼的修改
  • 2:http協議
    A : URL是http(超文字傳輸協議)是基於請求與響應模式的、無狀態的、應用層協議。長基於TCP的連線方式
    B : HTTP請求,http請求分別包括(請求行、訊息報頭、請求正文)
    請求行:Method Request-URI HTTP-Version CRLF
    Method請求方式包括(GET、POST、HEAD、PUT、DELETE、TRACE、CONNECT、OPTIONS)
    C : HTTP響應,http響應分別包括(狀態行、訊息報頭、返回正文)
    狀態行:HTTP-Version Status-Code Reason-Phrase CRLF
    詳細見:
    http://www.cnblogs.com/li0803/archive/2008/11/03/1324746.html
  • 3:https協議

    什麼是HTTPS
    HTTPS(Secure Hypertext Transfer Protocol)安全超文字傳輸協議 它是一個安全通訊通道,它基於HTTP開發,用於在客戶計算機和伺服器之間交換資訊。它使用安全套接字層(SSL)進行資訊交換,簡單來說它是HTTP的安全版。它是由Netscape開發並內置於其瀏覽器中,用於對資料進行壓縮和解壓操作,並返回網路上傳送回的結果。HTTPS實際上應用了Netscape的安 全全套接字層(SSL)作為HTTP應用層的子層。(HTTPS使用埠443,而不是象HTTP那樣使用埠80來和TCP/IP進行通訊。)SSL使 用40 位關鍵字作為RC4流加密演算法,這對於商業資訊的加密是合適的。HTTPS和SSL支援使用X.509數字認證,如果需要的話使用者可以確認傳送者是誰。

    HTTP和HTTPS的區別
    http協議和https有著很大的區別。總的來說,http效率更高,https安全性更高。
    https協議需要到ca申請證書,一般免費證書很少,需要交費。 http是超文字傳輸協議,資訊是明文傳輸,https 則是具有安全性的ssl加密傳輸協議 http和https使用的是完全不同的連線方式用的埠也不一樣,前者是80,後者是443。
    http的連線很簡單,是無狀態的 HTTPS協議是由SSL+HTTP協議構建的可進行加密傳輸、身份認證的網路協議 要比http協議安全

  • 4:Socket連線程式碼示例
    Socket程式設計概念有兩個:1、ServerSocket(服務端);2、Socket(客戶端)。服務端與客戶端之間通過Socket來建立連線,並通訊

1):服務端程式碼:

package cn.com.demo5;

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

public class Server5 {
    public static void main(String args[]) throws IOException {
        // 為了簡單起見,所有的異常資訊都往外拋
        int port = 8899;
        // 定義一個ServerSocket監聽在埠8899上
        ServerSocket server = new ServerSocket(port);
        while (true) {
            //server嘗試接收其他Socket的連線請求,server的accept方法是阻塞式的
            //伺服器啟動後,或完成一個連線後,會再次在此等候下一個連線
            Socket socket = server.accept();
            // 每接收到一個Socket就建立一個新的執行緒來處理它
            new Thread(new Server5Task(socket)).start();
        }
    }
}

2):建立ServerTask類:

package cn.com.demo5;

import java.io.BufferedReader;
import java.io.InputStreamReader;
import java.io.OutputStreamWriter;
import java.io.Writer;
import java.net.Socket;

/**
 * 用來處理Socket請求的
 */
public class Server5Task implements Runnable {
    private Socket socket;

    //建構函式
    public Server5Task(Socket socket) {
        this.socket = socket;
    }
    //實現Runnable 介面應該由那些打算通過某一執行緒執行其例項的類來實現。類必須定義一個稱為 run 的無引數方法。
    public void run() {
        try {
            //呼叫與客戶端實現的方法
            handleSocket();
        } catch (Exception e) {
            e.printStackTrace();
        }
    }

    /**
     * 跟客戶端Socket進行通訊
     * 
     * @throws Exception
     */
    private void handleSocket() {
        BufferedReader br = null;
        Writer writer = null;
        try {
            //接收客戶端傳遞過來的引數,設定接收的編碼格式為:GBK
            br = new BufferedReader(new InputStreamReader(
                    socket.getInputStream(), "GBK"));
            StringBuilder sb = new StringBuilder();
            String temp;
            int index;
            while ((temp = br.readLine()) != null) {
                System.out.println(temp);
                // 遇到 eof 時就結束接收
                if ((index = temp.indexOf("eof")) != -1) {
                    sb.append(temp.substring(0, index));
                    break;
                }
                sb.append(temp);
            }
            System.out.println("客戶端: " + sb);
            // 服務端下發給客戶端的引數,設定傳遞引數的編碼格式為:UTF-8
            writer = new OutputStreamWriter(socket.getOutputStream(), "UTF-8");  
            writer.write("你好,客戶端。");
            /**
             * BufferedReader的readLine方法是一次讀一行的,這個方法是阻塞的,
             * 直到它讀到了一行資料為止程式才會繼續往下執行,那麼readLine什麼時候才會讀到一行呢?
             * 直到程式遇到了換行符或者是對應流的結束符readLine方法才會認為讀到了一行,才會結束其阻塞,讓程式繼續往下執行。
             * 所以我們在使用BufferedReader的readLine讀取資料的時候一定要記得在對應的輸出流裡面一定要寫入換行符
             * (流結束之後會自動標記為結束,readLine可以識別),寫入換行符之後一定記得如果輸出流不是馬上關閉的情況下記得flush一下,
             * 這樣資料才會真正的從緩衝區裡面寫入
             */
            writer.write("eof\n");
            //是當前執行緒休眠,單位為毫秒值。可測試客戶端程式碼裡面的超時設定
            Thread.sleep(12 * 100);
            writer.flush();//寫完後要記得flush  
        } catch (Exception e) {
            e.printStackTrace();
        } finally {
            try {
                if (writer != null) {
                    writer.close();
                }
                if (br != null) {
                    br.close();
                }
                if (socket != null) {
                    socket.close();
                }
            } catch (Exception e2) {
                e2.printStackTrace();
            }
        }
    }
}

3):客戶端程式碼:

package cn.com.demo5;

import java.io.BufferedReader;
import java.io.InputStreamReader;
import java.io.OutputStreamWriter;
import java.io.Writer;
import java.net.Socket;
import java.net.SocketTimeoutException;

public class Client5 {
    public static void main(String args[]) {
        Socket client = null;
        Writer writer = null;
        BufferedReader br = null;

        String host = "127.0.0.1"; // 要連線的服務端IP地址
        int port = 8899; // 要連線的服務端對應的監聽埠
        try {
            // 與服務端建立連線
            client = new Socket(host, port);
            // 建立連線後就可以往服務端寫資料了
            // 客戶端傳送給服務端的引數,設定傳遞引數的編碼格式為:GBK
            writer = new OutputStreamWriter(client.getOutputStream(), "GBK");
            writer.write("你好服務端。");
            writer.write("eof\n");//BufferedReader讀取,記得加換行
            writer.flush();
            // 寫完以後進行讀操作
            br = new BufferedReader(new InputStreamReader(
                    client.getInputStream(), "UTF-8"));
            // 設定超時間為10秒
            client.setSoTimeout(10 * 1000);
            StringBuffer sb = new StringBuffer();
            String temp;
            int index;
            try {
                while ((temp = br.readLine()) != null) {
                    if ((index = temp.indexOf("eof")) != -1) {
                        sb.append(temp.substring(0, index));
                        break;
                    }
                    sb.append(temp);
                }
            } catch (SocketTimeoutException e) {
                System.out.println("資料讀取超時。");
            }
            System.out.println("服務端: " + sb);
        } catch (Exception e) {
            e.printStackTrace();
        } finally{
            try {
                if (writer != null) {
                    writer.close();
                }
                if (writer != null) {
                    br.close();
                }
                if (writer != null) {
                    client.close();
                }
            } catch (Exception e2) {
                e2.printStackTrace();
            }
        }
    }
}
  • 4:WebService入門:

    1)、WebService工作原理-SOAP
    當客戶端呼叫一個WebService的方法時,首先將方法名稱和需要傳遞的引數包裝成XML,也就是SOAP包,通過HTTP協議傳遞到伺服器端,然後伺服器端解析這段XML,得到被呼叫的方法名稱和傳遞過來的引數,進而呼叫WebService相應的方法,方法執行完畢後,將返回結果再次包裝為XML,也就是SOAP響應,傳送到客戶端,最後客戶端解析這段XML,最終得到返回結果。

    2)、WebService 小demo示例:
    A:建立WebService專案,如圖:
    這裡寫圖片描述

    B:程式碼示例:

package cn.com.service;

import javax.jws.WebMethod;
import javax.jws.WebService;
import javax.jws.soap.SOAPBinding;
import javax.xml.ws.Endpoint;

/**
 * 申明 WebService 類
 * @author Summer
 *
 */
@WebService()
@SOAPBinding(style = SOAPBinding.Style.RPC)
public class Hello {

    @WebMethod(operationName="test1")
    public String sayHello(String userName) { 
        return "Hello,"+userName+"!"; 
    } 

    @WebMethod(operationName="test2")
    public String sayHello() { 
        return "Hello World!"; 
    } 

    //執行該方法報錯時,在在前面加上 @SOAPBinding(style = SOAPBinding.Style.RPC)
    public static void main(String[] args) {
        //將WebService釋出到指定地址  
        Endpoint.publish("http://localhost:8080/WebServiceTest/Hello", new Hello());
        System.out.println("Success");
        //瀏覽器輸入地址:http://localhost:8080/WebServiceTest/Hello?wsdl
    }
}

C : 在瀏覽器中輸入上述地址後,如圖:
這裡寫圖片描述

下載完檔案後,解壓;進入cmd 輸入:
1.開啟 cmd
2.敲dos 命令: d: 回車
3.敲dos 命令: cd D:\WebServers\axis-1_4\lib 回車(具體包存放的位置)
4.敲dos 命令: java -classpath “.;commons-logging- 1.0.4.jar;axis.jar;commons-discovery-0.2.jar;jaxrpc.jar;wsdl4j-1.5.1.jar;saaj.jar;activation.jar;mail.jar” org.apache.axis.wsdl.WSDL2Java -o “abcdefg”
5.接著第4步:加上空格,再加上你的地址;如: http://localhost:8080/WebServiceTest/Hello?wsdl
6:生成的java檔案會存放在:D:\WebServers\axis-1_4\lib\abcdefg 目錄下。將檔案拷入你的工程裡面。並將裡面的jar包也拷到專案lib目錄下
7:建立 clientTset 類進行測試

package cn.com.client;

import java.rmi.RemoteException;

import javax.xml.rpc.ServiceException;

import cn.com.service.Hello;
import cn.com.service.HelloServiceLocator;

public class clientTest {
    public static void main(String args[]) throws ServiceException, RemoteException {    
        HelloServiceLocator service = new HelloServiceLocator();    
        Hello helloProxy = service.getHelloPort();    
        String hello1 = helloProxy.test1("世界"); 
        System.out.println(hello1); 
        String hello2 = helloProxy.test2(); 
        System.out.println(hello2);  
    } 
}

8:執行結果:Hello,世界 Hello World!(不知為何,我這邊響應很慢,等了好幾分鐘才出現結果。)

瀏覽器相容

  1. 目前,本編輯器對Chrome瀏覽器支援最為完整。建議大家使用較新版本的Chrome。
  2. IE9以下不支援
  3. IE9,10,11存在以下問題
    1. 不支援離線功能
    2. IE9不支援檔案匯入匯出
    3. IE10不支援拖拽檔案匯入

相關推薦

Socket連線程式碼示例WebService demo示例

最近面試遇到的問題 1:開閉原則 開放對原來程式碼的擴充套件,封閉對原來程式碼的修改 2:http協議 A : URL是http(超文字傳輸協議)是基於請求與響應模式的、無狀態的、應用層協議。長基於TCP的連線方式 B : HTTP請求,ht

JDBC連線到Oracle資料庫的demo

import java.sql.Connection; import java.sql.DriverManager; import java.sql.PreparedStatement; import java.sql.ResultSet; import java.sql.

socket心跳檢測和重連demo

        有時候我們的程式要求socket一直保持連線,並且希望在socket斷開以後能夠重新連線,這個時候就需要用到心跳機制,所謂心跳機制,最簡單的做法就是客戶端每隔一段時間向服務端傳送資料包,為了節約資源我們

dubbo開發環境搭建與tomcat集成DEMO示例(最完整版本帶管理控制臺監控中心zookeeper)

-s http服務 ppr context 正常 windows web容器 web.xml配置 web.xml 以windows為例,linux基本相同,開發環境一般linux,個人環境一般windows(如果不開額外vm的話)。 示例以dubbo官方自帶demo為例子

Vue-demo效果 合集(更新中...)

lin auto isa hover json () add ole bce (騰訊課堂學習小demo:https://ke.qq.com/course/256052) 一、簡單的指令應用 ——打擊滅火器 圖片素材點擊騰訊課堂的鏈接獲取 html: 1 &

SQL Server入門(三) SQL Server 官方Microsoft GitHub儲存庫示例SQL Server論壇SQL Server 更新遠端連線

一、SQL Server 的官方Microsoft GitHub儲存庫 (給出資料庫的各種例項型別,包括了SQL Server, Azure SQL Database, and Azure SQL Data Warehouse的應用範例)Official Microsoft GitHub Rep

TCP連線Socket連線Http連線的區別三次TCP握手過程

轉載自:https://blog.csdn.net/ituling/article/details/52541545?utm_source=blogxgwz0 首先一定要明白: HTTP協議:簡單物件訪問協議,對應於應用層,HTTP協議是基於TCP連線的 tcp協議: 對應於傳輸層

socket訪問的demo

伺服器端 public class ServiceServer {     public static void main(String[] args) throws Exception {        &

angularJS入門Demo【簡單測試js程式碼的方法】

1、首先建立一個資料夾 demo, 2、在其中建立一個文字文件,改名為 demo-1.html, 3、把html中要引入的 js 檔案拷貝到 demo目錄下, 4、然後用 Notepadd++ 編輯剛才建立的檔案 demo-1.html <html> <head>

Oracle + Mybatis實現批量插入更新和刪除示例程式碼

前言 Mybatis是web工程開發中非常常用的資料持久化的框架,通過該框架,我們非常容易的進行資料庫的增刪改查。資料庫連線進行事務提交的時候,需要耗費的資源比較多,如果需要插入更新的資料比較多,而且每次事務只提交一條資料,會造成非常大的資料庫資源浪費,導致資料庫效能、系統性能大幅度下降。

最大堆堆定義及其C++程式碼實現

資料:https://blog.csdn.net/guoweimelon/article/details/50904346 但是它的最大堆刪除部分的程式碼有問題,詳見連結裡的評論區 定義 堆首先必須是一棵完全二叉樹 最大堆:完全二叉樹,父節點的值不小於子節點的值 最小堆:完全二叉樹,父節

python 學習筆記_2 模擬socket程式設計 服務端客戶端通訊(參考核心程式設計2程式碼實現)

伺服器端程式碼實現: #!/usr/bin/env python#coding=gbk'''接收客戶端字串,在欄位串前面打上當前時間,然後返回server端採用 python2 linux下除錯執行客戶端採用python3 windows下除錯執行(注意編碼格式)''' from socket impor

三秒+一個Demo,輕鬆掌握Hive中的 列轉行行轉列!!!

閒話少敘,直接開幹! 先看Demo: 一、行轉列 首先,我們需要收集資料,建立一個檔案,內容如下: 一、啟動Hive,建立表並匯入資料: 1.1 建立表 create table test(name string,xingzuo string,xuexing string)

Java - JDK8新特性,程式碼demo示例

哈哈哈哈大魔都下雪啦,敲段程式碼暖和暖和,嘿嘿 public class jdk8Test { @Test public void LambdaNew() { //before jdk8 List<String> names = Arrays.asList

python基礎之資料池程式碼編碼

  一、程式碼塊。if True:   print(333)   print(666) while 1:   a = 1   b = 2   print(a+b) for i in '12324354':   print(i) 雖然上面的縮排的內容都叫程式碼塊,但是他不是pyt

簡單理解委託事件以及Demo

對於委託和事件的理解只是停留在表層,來記錄下學習過程 委託(Delegate) 是存有對某個方法的引用的一種引用型別變數。引用可在執行時被改變。 事件(Event) 基本上說是一個使用者操作,如按鍵、點選、滑鼠移動等等,或者是一些出現,如系統生成的通知。應用程式需要在事件

jquery中H5頁面長按事件(程式碼全)簡單demo

一個簡單的demo,先上圖看效果(當長按0.5秒的時候就會顯示下面的紅色div) 如果是單擊一次滑鼠並沒有到0.5秒則提示 下面上全部程式碼 注意:是H5頁面才會觸發,用谷歌除錯的時候要按F12進入手機的模式,否則不起作用(@炬) <!DOCTYPE h

C# 建立部署和呼叫WebService的簡單示例

webservice 可以用於分散式應用程式之間的互動,和不同程式之間的互動。 概念性的東西就不說太多,下面開始建立一個簡單的webservice的例子。這裡我用的是Visual Studio 2015開發工具。 首先建立一個空的Web應用程式。 然後滑鼠右

Markdown技巧:程式碼格式縮排和字型大小

程式碼格式 可以用<pre name="code" class="java"></pre>包裹住程式碼塊,例如: <pre name="code" class="java">這是一個Java程式碼</pre>

Java 呼叫阿里雲示例程式碼

Java呼叫示例程式碼: package com.xs.aliet.beebot; import java.util.Date; import java.util.HashMap; imp