激情久久久_欧美视频区_成人av免费_不卡视频一二三区_欧美精品在欧美一区二区少妇_欧美一区二区三区的

服務器之家:專注于服務器技術及軟件下載分享
分類導航

PHP教程|ASP.NET教程|Java教程|ASP教程|編程技術|正則表達式|C/C++|IOS|C#|Swift|Android|VB|R語言|JavaScript|易語言|vb.net|

服務器之家 - 編程語言 - Java教程 - Java的Socket網絡編程基礎知識入門教程

Java的Socket網絡編程基礎知識入門教程

2019-06-16 21:22cdai Java教程

這篇文章主要介紹了Java的Socket網絡編程基礎知識入門教程,包括基于TCP/IP和UDP協議的簡單實例程序講解,需要的朋友可以參考下

一、TCP/IP簡介

TCP/IP協議族是互聯網使用的協議,也可以用在獨立的專用網絡中。
TCP/IP協議族包括了IP協議、TCP協議和UDP協議。

IP協議使用IP地址來分發報文,但它是盡力而為的服務,報文可能丟失、亂序或者重復發送。TCP和UDP協議在IP協議基礎上增加了端口號,從而在兩臺主機的應用程序間建立起透明的連接。不同的是,TCP協議會對IP層的錯誤進行修復,它通過握手消息在主機間建立連接,之后通過在消息中加入序列號來恢復消息中的錯誤。而UDP只是簡單地擴展了IP協議,使它能夠在應用程序之間工作,而不是主機之間。

關于IP地址,一臺主機可以有多個網絡接口,而一個接口又可以有多個地址。有些IP地址是有特殊用途的:

A.回環地址:127.0.0.1,總是被分配給一個回環接口,主要用于測試。

B.私有地址:以10、192.168、172.(16-31)開頭,用于私有網絡。NAT設備轉發報文時,將一個接口中報文的私有地址端口對映射成另一個接口中的公有地址端口對。這就使一小組主機能夠共享一個IP地址對。

C.多播地址:第一個數字在224~239之間。

二、Socket基礎

1.地址的獲得

public static void main(String[] args) { 
 
  try { 
    Enumeration<NetworkInterface> interfaces = NetworkInterface.getNetworkInterfaces(); 
    while (interfaces.hasMoreElements()) { 
      NetworkInterface iface = interfaces.nextElement(); 
      System.out.println("Interface: " + iface.getName()); 
       
      Enumeration<InetAddress> addrList = iface.getInetAddresses(); 
      if (!addrList.hasMoreElements()) 
        System.out.println("No address"); 
       
      while (addrList.hasMoreElements()) { 
        InetAddress address = addrList.nextElement(); 
        System.out.println("Address: " + address.getHostAddress()); 
      } 
    } 
     
  } catch (SocketException e) { 
    e.printStackTrace(); 
  } 
   
} 

2.TCP實例程序

要注意一點,雖然在Client端只用了一個write()方法發送字符串,服務器端也可能從多個塊中接受該信息。即使回饋字符串在服務器返回時存于一個塊中,也可能被TCP協議分割成多個部分。

TCPEchoClientTest.java

public static void main(String[] args) throws IOException { 
 
  String server = args[0]; 
  byte[] data = args[1].getBytes(); 
  int port = 7; 
   
  Socket socket = new Socket(server, port); 
  System.out.println("Connected to server..."); 
   
  InputStream in = socket.getInputStream(); 
  OutputStream out = socket.getOutputStream(); 
   
  out.write(data); 
   
  int totalBytesRcvd = 0; 
  int bytesRcvd; 
  while (totalBytesRcvd < data.length) { 
    if ((bytesRcvd = in.read(data, totalBytesRcvd,  
        data.length - totalBytesRcvd)) == -1) 
      throw new SocketException("Connection closed"); 
    totalBytesRcvd += bytesRcvd; 
  } 
   
  System.out.println("Received: " + new String(data)); 
   
  socket.close(); 
} 

TCPEchoServerTest.java

private static final int BUFSIZE = 32; 
 
public static void main(String[] args) throws IOException { 
 
  ServerSocket serverSocket = new ServerSocket(7); 
   
  int recvMsgSize; 
  byte[] receiveBuf = new byte[BUFSIZE]; 
  while (true) { 
    Socket socket = serverSocket.accept(); 
    System.out.println("Handling client " + 
        " from remote " + socket.getRemoteSocketAddress() +  
        " at local " + socket.getLocalSocketAddress()); 
     
    InputStream in = socket.getInputStream(); 
    OutputStream out = socket.getOutputStream(); 
     
    while ((recvMsgSize = in.read(receiveBuf)) != -1) { 
      out.write(receiveBuf, 0, recvMsgSize); 
    } 
    socket.close(); 
  } 
   
} 

注意new Socket時指定的是遠端服務器監聽的端口號而沒有指定本地端口,因此將采用默認地址和可用的端口號。在我的機器上Client端口是4593,連接到服務器的端口7。


3.UDP實例程序

為什么使用UDP協議?如果應用程序只交換少量的數據,TCP連接的建立階段就至少
要傳輸其兩倍的信息量(還有兩倍的往返時間)。

UDPEchoClientTest.java

public static void main(String[] args) throws IOException { 
 
  InetAddress serverAddress = InetAddress.getByName(args[0]); 
  byte[] bytesToSend = args[1].getBytes(); 
   
  DatagramSocket socket = new DatagramSocket(); 
  socket.setSoTimeout(3000); 
   
  DatagramPacket sendPacket = new DatagramPacket( 
    bytesToSend, bytesToSend.length, serverAddress, 7); 
   
  DatagramPacket receivePacket = new DatagramPacket( 
    new byte[bytesToSend.length], bytesToSend.length); 
   
  // Packets may be lost, so we have to keep trying 
  int tries = 0; 
  boolean receivedResponse = false; 
  do { 
    socket.send(sendPacket); 
    try { 
      socket.receive(receivePacket); 
      if (!receivePacket.getAddress().equals(serverAddress)) 
        throw new IOException("Receive from unknown source"); 
      receivedResponse = true; 
    }  
    catch (IOException e) { 
      tries++; 
      System.out.println("Timeout, try again"); 
    } 
  } while (!receivedResponse && tries < 5); 
   
  if (receivedResponse) 
    System.out.println("Received: " + new String(receivePacket.getData())); 
  else 
    System.out.println("No response"); 
   
  socket.close(); 
} 

UDPEchoServerTest.java

private static final int ECHOMAX = 255;  
 
public static void main(String[] args) throws IOException { 
 
  DatagramSocket socket = new DatagramSocket(7); 
  DatagramPacket packet = new DatagramPacket(new byte[ECHOMAX], ECHOMAX); 
   
  while (true) { 
    socket.receive(packet); 
    System.out.println("Handling client at " + packet.getAddress()); 
     
    socket.send(packet); 
    packet.setLength(ECHOMAX); 
  } 
   
} 

通過這個例子與之前TCP的實例進行比較,有如下區別:

A.DatagramSocket在創建時不需要指定目的地址,因為UDP不需要建立連接,每個數據報文都可以發送或接收于不同的目的地址。

B.如果像TCP一樣在read()上阻塞等待,將可能永遠阻塞在那里,因為UDP協議只是簡單地擴展了IP協議,UDP報文可能丟失掉。所以一定要設置阻塞等待的超時時間。

C.UDP協議保留了消息的邊界信息,每次receive()調用最多只能接收一次send()方法調用所發送的數據。

D.一個UDP報文DatagramPacket能傳輸的最大數據是65507字節,超出部分的字節將自動被丟棄,而且對接收程序也沒有任何的提示。因此緩存數組可以設置成65000字節左右是安全的。

E.如果反復使用同一個DatagramPacket實例調用receive()方法,每次調用前都必須顯式地將消息的內部長度重置為緩存區的實際長度。

延伸 · 閱讀

精彩推薦
  • Java教程SpringBoot引入Thymeleaf的實現方法

    SpringBoot引入Thymeleaf的實現方法

    這篇文章主要介紹了SpringBoot引入Thymeleaf的實現方法,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下...

    Bobby6472021-07-28
  • Java教程JAVA中通過自定義注解進行數據驗證的方法

    JAVA中通過自定義注解進行數據驗證的方法

    java 自定義注解驗證可自己添加所需要的注解,下面這篇文章主要給大家介紹了關于JAVA中通過自定義注解進行數據驗證的相關資料,文中通過示例代碼介紹...

    Decouple6362021-05-25
  • Java教程Java list.remove( )方法注意事項

    Java list.remove( )方法注意事項

    這篇文章主要介紹了Java list.remove( )方法注意事項,非常簡單易懂,需要的朋友可以參考下...

    妖久9552021-05-25
  • Java教程Java之Springcloud Feign組件詳解

    Java之Springcloud Feign組件詳解

    這篇文章主要介紹了Java之Springcloud Feign組件詳解,本篇文章通過簡要的案例,講解了該項技術的了解與使用,以下就是詳細內容,需要的朋友可以參考下...

    深情以改10322021-11-12
  • Java教程JavaWeb 實現驗證碼功能(demo)

    JavaWeb 實現驗證碼功能(demo)

    在 WEB-APP 中一般應用于:登錄、注冊、買某票、秒殺等場景,大家都接觸過這個驗證碼操作,今天小編通過實例代碼給大家講解javaweb實現驗證碼功能,需要...

    java教程網12832020-08-05
  • Java教程java 中鎖的性能提高辦法

    java 中鎖的性能提高辦法

    這篇文章主要介紹了java 中鎖的性能提高辦法的相關資料,需要的朋友可以參考下...

    Java之家3092020-08-13
  • Java教程淺談Java(SpringBoot)基于zookeeper的分布式鎖實現

    淺談Java(SpringBoot)基于zookeeper的分布式鎖實現

    這篇文章主要介紹了Java(SpringBoot)基于zookeeper的分布式鎖實現,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的...

    LJY_SUPER5742021-07-21
  • Java教程springboot ehcache 配置使用方法代碼詳解

    springboot ehcache 配置使用方法代碼詳解

    EhCache是一個比較成熟的Java緩存框架,Springboot對ehcache的使用非常支持,所以在Springboot中只需做些配置就可使用,且使用方式也簡易,今天給大家分享spri...

    m1719309529412912021-09-16
主站蜘蛛池模板: 久久成人精品视频 | 91精品国产综合久久婷婷香蕉 | 在线观看免费av网 | 亚洲一区二区中文字幕在线观看 | 青青国产在线视频 | 亚洲av一级毛片特黄大片 | 九九热精彩视频 | 国产亚洲精品久久久久久大师 | 国产无限资源在线观看 | 国产1区2| 一级毛片播放 | 精品亚洲二区 | 久久日本 | 性爱网站 | 国产99久久久久久免费看 | 欧美日韩一 | 国产精品视频二区不卡 | 在线成人免费观看 | 日韩毛片毛片久久精品 | 欧美黄色小视频 | 免费播放欧美毛片 | 亚洲小视频网站 | 黄网站在线观 | 一级片在线观看 | 九九午夜视频 | 久久精品99久久久久久2456 | 毛片大全在线观看 | 亚洲 综合 欧美 动漫 丝袜图 | 99re热视频这里只精品 | 九色一区二区 | 视频毛片 | 欧美a∨亚洲欧美亚洲 | 制服丝袜日日夜夜 | 久久精品.com | 日韩精品羞羞答答 | 久久99精品久久久久久久久久久久 | 亚洲精品成人18久久久久 | av在线影片 | 日本黄色一级毛片 | 国产免费www | 久久精品黄|