現在JAVA作為主流編程語言,如果想要學會java網絡編程,需要掌握一定的基礎,學習啦小編在這裡給大家帶來java網絡編程基礎的相關知識,希望能幫到大家。
進行網絡通信需要的三要素:ip、端口、協議
IP: 連接在internet中每台主機地址的標識,32bit。
//獲取IP
InetAddress i = InetAddreass.getLocalHost();
InetAddress ia = InetAddreass.getByName("www.baidu.com");
sop("address:"+ia.getHostAddreass());
sop("name:"+ia.getHostName());
端口:
1、網絡設備接口(集線器、交換機、路由器)----物理
2、TCP/IP協議中的接口.----邏輯
0~65535
0~1024
..計算機運行程序的標識
協議:
UDP:
將數據、源、目的封裝成數據包,不需要建立連接
每個數據包限制在64K內
因無連接,是不可靠協議
不需要建立連接,速度快
TCP:
建立連接,形成傳輸數據的通道
在連接中進行大數據量傳輸
通過三次握手完成連接,是可靠協議
必須建立連接,是可靠協議
InetAddress類:
基本方法列舉
getAddress()返回此 InetAddress 對象的原始 IP 地址。
getHostAddress()返回 IP 地址字符串(以文本表現形式)。
getHostName()獲取此 IP 地址的主機名。
getAllByName(String host)在給定主機名的情況下,根據系統上配置的名稱服務返回其 IP 地址所組成的數組。
getByName(String host)在給定主機名的情況下確定主機的 IP 地址。
getLocalHost()返回本地主機。
isReachable(int timeout)測試是否可以達到該地址。
DatagramPacket類
需求:通過UDP傳輸協議將一段文字數據發送出去
思路:
1、建立udpSocket服務
2、提供數據並將數據封裝到數據包中
3、通過Socket服務的發送功能將數據發送出去
4、關閉資源
面向Socket編程
Socket就是為網絡服務提供的一種機制,對應於網絡中的傳輸層,通信的兩端都有Socket,網絡通信其實就是Socket間的通信,數據在兩個Socket間通過IO傳輸。
無論是UDP的面向連接還是TCP的面向連接,我們面向的其實都是Socket。
Socket中的一些常用方法:
bind(SocketAddress bindpoint)將套接字綁定到本地地址。
connect(SocketAddress endpoint)&connect(SocketAddress endpoint, int timeout)將此套接字連接到服務器,且後者可以指定一個超時值。
getInetAddress()&getPort() 返回套接字連接的遠程地址及端口。
getLocalAddress()&getLocalPort()獲取套接字綁定的本地地址即端口。
getInputStream()&getOutputStream()返回此套接字的輸入輸出流。
shutdownInput()&shutdownOutput()禁用此套接字的輸入流與輸出流,即使同時調用了兩方法也不能導致Socket關閉,另外shutdownOutput()方法通常用於告知服務端客戶端發送結束。
URL類:
類URL代表一個統一資源定位符,它是指向互聯網“資源”的指針。使用該類的openConnection()方法即可獲取對應的URLConnection對象,也可以通過openStream()方法直接獲取其所指向資源的輸入流。
它也提供了一系列的get方法來提取封裝在URL對象中的信息
URL中的基本方法:
getFile()獲取此 URL 的文件名。
getHost()獲取此 URL 的主機名(如果適用)。
getPath()獲取此 URL 的路徑部分。
getPort()獲取此 URL 的端口號。
getProtocol()獲取此 URL 的協議名稱。
getQuery()獲取此 URL 的查詢部分。
URLConnection它代表應用程序和 URL之間的通信鏈接。此類的實例可用於讀取和寫入此 URL 引用的資源。
創建一個到URL的連接需要幾個步驟:
1、通過在 URL 上調用 openConnection 方法創建連接對象。
2、處理設置參數和一般請求屬性。
3、使用 connect 方法建立到遠程對象的實際連接。
4、遠程對象變為可用,遠程對象的頭字段和內容變為可訪問。
UDP實現發送和接收數據操作
發送端代碼實例:
import java.io.*;
import java.net.*;
class UdpSend{
public static void main(String args[]) throws Excption{
DatagramSocket ds = new DatagramSocket();
byte[] buf = "abcde".getByte();
DatagramPacket dp = new DatagramPacket(buf, buf.length, InetAddreass.getByName(" 127.0.0.1 "), 10000);
ds.send(dp);
ds.close();
}
}
接收端代碼實例:
import java.io.*;
import java.net.*;
class UdpReve{
public static void main(String args[]) throws Excption{
DatagramSocket ds = new DatagramSocket(10000);
byte[] buf = new byte[1024];
DatagramPacket dp = new DatagramPacket(buf, buf.length);
ds.receive(dp);
String ip = dp.getAddress().getHostAddress();
String data = new String(dp.getDate(), 0, dp.getLength());
int port = dp.getPort();
System.out.println(ip+ "--" +data+ "--" +port);
ds.close();
}
}
//使用while(true)使接收端持續開啟
練習:將本地圖片上傳到服務器,代碼實現:
客戶端代碼實現:
public class PicClient {
public static void main(String args[]) throws Exception{
Socket s = new Socket("117.84.140.104", 10001);
FileInputStream fis = new FileInputStream("C:\\Users\\Administrator\\Desktop\\1.jpg");
OutputStream out = s.getOutputStream();
byte[] buf = new byte[1024];
int ch = 0;
while((ch = fis.read(buf)) != -1){
out.write(buf, 0, ch);
}
s.shutdownOutput();
InputStream in = s.getInputStream();
ch = in.read(buf);
System.out.println(new String(buf, 0, ch));
fis.close();
s.close();
}
}
服務器端代碼實現:
public class PicServer {
public static void main(String args[]) throws Exception{
ServerSocket ss = new ServerSocket(10001);
Socket s = ss.accept();
InputStream in = s.getInputStream();
FileOutputStream fis = new FileOutputStream("C:\\Users\\Administrator\\Desktop\\2.jpg");
byte[] buf = new byte[1024];
int len = 0;
while((len = in.read(buf)) != -1){
fis.write(buf, 0, len);
}
OutputStream out = s.getOutputStream();
out.write("上傳完畢".getBytes());
}
}