網絡編程


網絡編程的基礎知識

  • 網絡協議與TCP/IP
  • IP地址和Port(端口號)
  •      本地迴路的IP地址:127.0.0.1
  •      端口號的範圍爲0---65535之間,0----1023之間的端口數是用於一些知名的網絡服務和應用
  • UDPTCP

TCP,傳輸控制協議,是面向連接的通信協議

UDP,用戶數據報協議,是無連接通信協議

Socket

  • Socket是網絡驅動層提供給應用程序編程的接口和一種機制
  • 可以吧Socket比喻成是一個港口碼頭。應用程序只要把貨物放到港口碼頭上,就算完成了貨物的運送。應用程序只需等待貨物到達碼頭後,將貨物取走
  • Socket在應用程序中創建,通過一種綁定機制與驅動程序建立關係,告訴自己所對應的IPPort


Java中的網絡編程類

  • 位於java.net包中
  • DatagramSocket類用於UDP通信
  • ServerSocket類用於TCp通信的服務器端
  • Socket類用於TCP通信的服務器和客戶端

UDP網絡程序

  • DatagramSocket
  • DatagramPacket
  • InetAddress
  • 最簡單得UDP程序
  • UDP編寫網絡聊天程序

DatagramSocket

  • 構造函數
  • close方法
  • send(DatagramPacket p)方法
  • receive(DatagramPacket p)方法

DatagramPacket

如果把DatagramSocket比作創建的港口碼頭,那麼DatagramPacket就是發送和接收數據的集裝箱。

  • 構造函數
  • getInetAddressgetPort方法
  • getDatagetLength方法

InetAddress

  • InetAddress是計算機IP地址的一個類,而在日常應用中的計算機地址是用“192.168.0.1”、"www.it315.org"等字符串格式來表示的。
  • getByName方法
  • getHostAddress方法

最簡單得UDP程序

  • 字符串與字符數組之間的雙向轉換
  • UDP接收程序必須先啓動運行,才能接受UDP發送程序發送的數據
  • start命令來打開新命令行窗口的好處
  • 解決發送中文字符串的問題。

package blackhouse.net;

import java.io.IOException;
import java.net.*;

public class UDPSender
{
	public static void main(String[] args) throws Exception
	{
		DatagramSocket ds = new DatagramSocket();// 由系統自己分配
			String strInfo = "hello www.315.org";
			ds.send(new DatagramPacket(strInfo.getBytes(), strInfo.length(),
					InetAddress.getByName("192.168.0.10"), 3000));
			ds.close();
		}
}

package blackhouse.net;

import java.io.IOException;
import java.net.*;

public class UDPRecv
{
	public static void main(String[] args) throws Exception
	{
		DatagramSocket ds = new DatagramSocket(3000);
			byte[] buf = new byte[1024];
			DatagramPacket dp = new DatagramPacket(buf, 1024);
			ds.receive(dp);
			String strInfo = new String(dp.getData(), 0, dp.getLength());
			System.out.println(strInfo + " form "
					+ dp.getAddress().getHostAddress() + ":" + dp.getPort());
			ds.close();
	 	}
}


如果你傳送的是中文字符會接受不到,此時只要將

ds.send(new DatagramPacket(strInfo.getBytes(), strInfo.length(),

InetAddress.getByName("192.168.0.10"), 3000));

的發送長度該爲strInfo.getBytes().length即可。


發佈了25 篇原創文章 · 獲贊 21 · 訪問量 11萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章