日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

socket编程总结

發布時間:2024/4/14 编程问答 50 豆豆
生活随笔 收集整理的這篇文章主要介紹了 socket编程总结 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

一,網絡編程中兩個主要的問題

一個是怎樣準確的定位網絡上一臺或多臺主機,還有一個就是找到主機后怎樣可靠高效的進行傳輸數據。

在TCP/IP協議中IP層主要負責網絡主機的定位,傳輸數據的路由,由IP地址能夠唯一地確定Internet上的一臺主機。

而TCP層則提供面向應用的可靠(tcp)的或非可靠(UDP)的傳輸數據機制,這是網絡編程的主要對象,一般不須要關心IP層是怎樣處理數據的。

眼下較為流行的網絡編程模型是客戶機/server(C/S)結構。即通信兩方一方作為server等待客戶提出請求并予以響應。客戶則在須要服務時向server提 出申請。server一般作為守護進程始終運行,監聽網絡port,一旦有客戶請求,就會啟動一個服務進程來響應該客戶,同一時候自己繼續監聽服務port,使后來的客戶也 能及時得到服務。

關于TCP&UDP請查看本人的相關博客,鏈接如下:
http://blog.csdn.net/lmb55/article/details/46137679

二,基于Socket的java網絡編程

1,什么是Socket

網絡上的兩個程序通過一個雙向的通訊連接實現數據的交換,這個雙向鏈路的一端稱為一個Socket。Socket通常常使用來實現客戶方和服務方的連接。Socket是TCP/IP協議的一個十分流行的編程界面,一個Socket由一個IP地址和一個port號唯一確定。

可是,Socket所支持的協議種類也不光TCP/IP一種,因此兩者之間是沒有必定聯系的。在Java環境下,Socket編程主要是指基于TCP/IP協議的網絡編程。

我們經常把socket翻譯為套接字,socket是在應用層和傳輸層之間的一個抽象層,它把TCP/IP層復雜的操作抽象為幾個簡單的接口供應用層調用已實現進程在網絡中通信。

2,Socket通訊的過程

Server端Listen(監聽)某個port是否有連接請求,Client端向Server 端發出Connect(連接)請求,Server端向Client端發回Accept(接受)消息。一個連接就建立起來了。Server端和Client 端都能夠通過Send,Write等解決方案與對方通信。

服務器根據地址類型(ipv4,ipv6)、socket類型、協議創建socket

服務器為socket綁定ip地址和端口號

服務器socket監聽端口號請求,隨時準備接收客戶端發來的連接,這時候服務器的socket并沒有被打開

客戶端創建socket

客戶端打開socket,根據服務器ip地址和端口號試圖連接服務器socket

服務器socket接收到客戶端socket請求,被動打開,開始接收客戶端請求,直到客戶端返回連接信息。這時候socket進入阻塞狀態,所謂阻塞即accept()方法一直到客戶端返回連接信息后才返回,開始接收下一個客戶端諒解請求

客戶端連接成功,向服務器發送連接狀態信息

服務器accept方法返回,連接成功

客戶端向socket寫入信息

服務器讀取信息

客戶端關閉

服務器端關閉

服務器socket與客戶端socket建立連接的部分其實就是大名鼎鼎的三次握手:

但是對于一個簡單的功能齊全的Socket其工作過程包含下面四個主要的步驟:

  (1) 創建Socket;

  (2) 打開連接到Socket的輸入/出流;

  (3) 依照一定的協議對Socket進行讀/寫操作;

  (4) 關閉Socket。

本人在寫學習基于java的socket編程時,參考了以下博文,鏈接如下:
http://www.cnblogs.com/mfryf/archive/2013/06/12/3133346.html

3,創建Socket

創建Socket

java在包java.net中提供了兩個類Socket和ServerSocket,分別用來表示雙向連接的client和服務端。這是兩個封裝得很好的類,使用很方便。其構造解決方案例如以下:

  Socket(InetAddress address, int port);

  Socket(InetAddress address, int port, boolean stream);

  Socket(String host, int prot);

  Socket(String host, int prot, boolean stream);

  Socket(SocketImpl impl)

  Socket(String host, int port, InetAddress localAddr, int localPort)

  Socket(InetAddress address, int port, InetAddress localAddr, int localPort)

  ServerSocket(int port);

  ServerSocket(int port, int backlog);

  ServerSocket(int port, int backlog, InetAddress bindAddr)

  當中address、host和port分別是雙向連接中還有一方的IP地址、主機名和端 口號,stream指明socket是流socket還是數據報socket,localPort表示本地主機的port號,localAddr和 bindAddr是本地機器的地址(ServerSocket的主機地址),impl是socket的父類,既能夠用來創建serverSocket又可 以用來創建Socket。count則表示服務端所能支持的最大連接數。比如:學習視頻網 http://www.xxspw.com

  Socket client = new Socket(“127.0.01.”, 80);

  ServerSocket server = new ServerSocket(80);

  注意,在選擇port時,必須小心。每一個port提供一種特定的服務,唯獨給出正確的port,才 能獲得對應的服務。0~1023的port號為系統所保留,比如http服務的port號為80,telnet服務的port號為21,ftp服務的port號為23, 所以我們在選擇port號時,最好選擇一個大于1023的數以防止發生沖突。

  在創建socket時假設錯誤發生,將產生IOException,在程序中必須對之作出處理。所以在創建Socket或ServerSocket是必須捕獲或拋出例外。

4,簡單的Client/Server程序
(實現一對一的在線聊天)

  • client程序
  • import java.io.BufferedReader; import java.io.InputStreamReader; import java.io.PrintWriter; import java.net.ServerSocket; import java.net.Socket;public class ServerTCP {public static void main(String[] args) throws Exception {// TODO Auto-generated method stubServerSocket sskt=new ServerSocket(9999);Socket skt=sskt.accept(); //主線程阻塞,監聽9999端口,等待客戶端來連接System.out.println("連接到:" + sskt.getInetAddress().getHostAddress());BufferedReader br=new BufferedReader(new InputStreamReader(skt.getInputStream()));//構建輸入流,接收從客戶端發來的消息BufferedReader br2=new BufferedReader(new InputStreamReader(System.in));//構建輸入流,接受鍵盤的輸入PrintWriter pw=new PrintWriter(skt.getOutputStream());//構建輸出流,將從鍵盤接收的信息寫入到輸出流中for (;;) {/*** 這個地方要注意:對于服務器端來說,要先把客戶端發來的消息打印出來,* 然后接受鍵盤的輸入進行回復,所以語句順序不能反,否則會出現顯示混亂*/System.out.println(br.readLine());//將客戶端發送的信息打印到控制臺pw.println(br2.readLine());pw.flush();//將從鍵盤接收的消息發送給客戶端}} }

     2. server端程序
     

    import java.io.BufferedReader; import java.io.InputStreamReader; import java.io.PrintWriter; import java.net.Socket;public class tcp {public static void main(String[] args) throws Exception {Socket skt=new Socket("0.0.0.0",9999);//連接到哪臺服務器(IP地址)上的哪個程序(端口號)BufferedReader br=new BufferedReader(new InputStreamReader(System.in));//構建輸入流,接收鍵盤的輸入PrintWriter pw=new PrintWriter(skt.getOutputStream());//構建輸出流,向服務器發送消息BufferedReader br2=new BufferedReader(new InputStreamReader(skt.getInputStream()));//構建輸入流,接收服務器端發來的消息for (;;) {/*** 這個地方要注意:對于客戶端來說,客戶端實現發起會話的一方,所以必須先接收鍵盤輸入的消息發送給客戶端,* 再接收服務器端發來的消息,打印到控制臺,順序不能反,否則會出現顯示混亂*/pw.println(br.readLine());pw.flush();//將從鍵盤輸入的消息發送給服務器System.out.println(br2.readLine());//在控制臺上打印出服務器端發送來的消息}} }

    5,支持多客戶的client/server程序

    前面的Client/Server程序僅僅能實現Server和一個客戶的對話。在實際應用 中,往往是在server上運行一個永久的程序,它能夠接收來自其他多個client的請求,提供對應的服務。為了實如今server方給多個客戶提供服務的功能,須要對上 面的程序進行改造,利用多線程實現多客戶機制。server總是在指定的port上監聽是否有客戶請求,一旦監聽到客戶請求,server就會啟動一個專門的服務線程來響 應該客戶的請求,而server本身在啟動完線程之后立即又進入監聽狀態,等待下一個客戶的到來。

    總結

    以上是生活随笔為你收集整理的socket编程总结的全部內容,希望文章能夠幫你解決所遇到的問題。

    如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。