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

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程语言 > java >内容正文

java

JavaSocket编程简单入门

發布時間:2023/12/10 java 24 豆豆
生活随笔 收集整理的這篇文章主要介紹了 JavaSocket编程简单入门 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

【網絡知識基礎】:

書本官方上說Socket就是{ip:port}的組合。
之后我也看了很多解釋Socket的博文,各有各的好,接下來談談我個人的看法。

我個人的理解是,在傳輸層中,socket就能唯一確定一個應用進程。因為,我們可以通過ip地址確定該用戶的主機地址,然后可以通過port端口號確定是哪個進程在發出請求或相應。

Socket英文是插座、接口這種意思。其實Socket的工作過程和電話機很像。A和B需要進行通話,那么他們都必須各自擁有一臺電話機,這就跟Server和Client同時申請一個Socket是一回事。然后A給B打電話,那么B的電話就會響,這就跟Client給Server發起通信請求的過程是一回事,Server端的Socket會一直等待著Client來連接。當B接電話之后,就說明雙方連接建立了,可以開始通信了。

A和B通信過程中,兩個人只用說自己想說的話就可以了,此時電話線內部的信息傳輸對于兩人來說是透明的,他們也沒有必要去了解細節。當Client和Server建立連接之后,Client會生成一個客戶端Socket,用于和ClientSocket進行通信,同樣的,在Client和Server的角度來看,信息似乎是直接傳遞給對方的,但其實信息報還經過了網絡層,鏈路層封裝幀,物理層的比特傳輸,然后經過復雜的路由網絡才到達對方的。但這些內容對Client和Server來說是透明的,他們也沒有必要知道。

其他關于Socket和網絡相關的知識,有一個博客寫得非常棒!在這里:
https://blog.csdn.net/J080624/article/details/78468396
這個博客不僅介紹了Socket的相關用法,還通俗講解了數據包在網絡中傳輸的流程。

【第一個Socket程序】:

Socket的通信流程

服務器端:

  • 建立Socket(建立自己的電話機)
  • 綁定端口信息(好比指明Server端的電話號)
  • 監聽,如果有客戶端來連接,就連起來(好比等待Client來打電話)
  • 接受連接(接電話,如果客戶端一直不連接,那么這個時候服務器端就會阻塞在那里)
  • 通信
  • 關閉Socket
  • 客戶端:

  • 建立Socket
  • 連接(給Server打電話了,這里當然就要指明Server的ip和port,不然如何確定和哪個進程通信?)
  • 通信
  • 關閉Socket
  • 下面按照這個流程實現一個簡單的Socket程序:
    服務器端:

    package socket;import java.io.BufferedReader; import java.io.IOException; import java.io.InputStream; import java.io.InputStreamReader; import java.io.PrintWriter; import java.net.InetSocketAddress; import java.net.ServerSocket; import java.net.Socket;public class TestServer {public static void main(String[] args) throws IOException {//1.創建一個Server SocketServerSocket ss = new ServerSocket(8887);//接受客戶端所連接的socket,這里就相當于獲得了客戶端的SocketSocket s = ss.accept();InputStream in = s.getInputStream();byte[] buf = new byte[1024];//read方法返回一次性讀取的字節數int num = in.read(buf);//StringAPI中的構造方法,可以用byte數組來構造,第二個參數是byte數組起始下標String str = new String(buf, 0, num);//注意,這里是s調用的getInetAddress方法,意味著最后打印出來的是客戶端的ip地址System.out.println("客戶端的" + s.getInetAddress().toString() + ":" + str);s.close();ss.close();} }

    客戶端:

    package socket; import java.io.BufferedReader; import java.io.IOException; import java.io.InputStreamReader; import java.io.OutputStream; import java.io.PrintWriter; import java.net.InetSocketAddress; import java.net.Socket; import java.net.UnknownHostException;public class ClientSocket {public static void main(String[] args) throws UnknownHostException, IOException {//1.創建一個連接到指定主機、指定端口的套接字。在創建的時候就直接連接上了Socket s = new Socket("127.0.0.1", 8887);OutputStream out = s.getOutputStream();out.write("hello".getBytes());s.close();} }

    注意,運行的時候先運行Server端的main方法,然后再運行Client端。原因很簡單,如果你先運行Client端,Server端根本都沒有電話機和電話號碼,那你跟誰打電話呢?

    運行效果:

    成功打印出來客戶端的ip地址和客戶端的信息hello
    只不過這里客戶端和服務端的地址恰好一樣都是127.0.0.1罷了

    【啟示】:

    雖然這個程序比較簡單,但是我們看到,通信過程中,服務器已經可以接受到客戶端的信息,包括客戶端的ip地址、客戶端想要發送的消息等。可以很輕松的遷移到Web程序上。

    總結

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

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