- 相關(guān)推薦
Java網(wǎng)絡(luò)基礎(chǔ)和Socket通信基礎(chǔ)
導語:Java是一門面向?qū)ο缶幊陶Z言,不僅吸收了C++語言的各種優(yōu)點,還摒棄了C++里難以理解的多繼承、指針等概念,因此Java語言具有功能強大和簡單易用兩個特征。下面我們來看看Java網(wǎng)絡(luò)基礎(chǔ)和Socket通信基礎(chǔ),希望對大家有所幫助。
一、網(wǎng)絡(luò)基礎(chǔ)
1、InetAddress
InetAddress構(gòu)造器私有,可以通過多種方式獲得inetAddress對象
InetAddress ip = InetAddress.getLocalHost();//獲取本機IP
ip = InetAddress.getByName("100.64.141.89");//通過名字獲取指定地址IP
String name = ip.getHostName();//通過IP獲取IP名字
2、URL統(tǒng)一資源定位符
典型構(gòu)成:1、網(wǎng)絡(luò)協(xié)議(http://);2、主機地址(192.168.46.20/myServlet);3、端口號(80);4、資源路徑(crm/index.jsp);5、查詢地址(gid=117)
//構(gòu)造器多種,可以采用指定URL連接構(gòu)造一個URL,也可以使協(xié)議,用端口號,文件名等信息構(gòu)成URL
URL url = new URL(str);
String protocol = url.getProtocol();// 獲取協(xié)議
String host = url.getHost();// 主機名
int port = url.getPort();//端口號
對資源文件的一般操作
String file = url.getFile();//獲取資源中包含的文件名稱
InputStream is = url.openStream();//打開此URL連接(URLConnection),并獲取連接的輸入流(URLconnection.getOutputStream())
對URL地址進行轉(zhuǎn)碼,解碼,防止亂碼
String str1 = URLEncoder.encode(str, "UTF-8");//對str字符串進行UTF-8轉(zhuǎn)碼
String str2 = URLDecoder.decode(str1, "UTF-8");//解碼
3、HttpURLConnection
繼承URLConnection類;Http協(xié)議簡介 http是一個無狀態(tài)協(xié)議,請求、響應(yīng)協(xié)議由請求頭和響應(yīng)頭構(gòu)成 。
、僬埱箢^: 請求方法:get post put.....
②響應(yīng)頭 響應(yīng)狀態(tài)碼:status code:200(正常響應(yīng)) 400~(404,405請求資源異常,不存在,請求響應(yīng)格式不一致) 500~(500服務(wù)器內(nèi)部異常)
//利用HttpURL協(xié)議下載文件
String str3 = "/uploadfile/2017/0809/20170809085944351.jpg";
URL url2 = new URL(str3);
// 打開一個URL連接
HttpURLConnection conn = (HttpURLConnection) url2.openConnection();//獲取一個連接(URLConnection)
// 設(shè)置請求方法
//conn.setRequestMethod("GET");
// conn.setRequestProperty("Accep-Language", "zh-en");
//conn.setReadTimeout(10000);// 設(shè)置讀取超時時間,可以默認
// conn.setDoInput(true);// 打開輸入和輸出,可以不設(shè)置,默認true
//conn.setDoOutput(true);
//int code = conn.getResponseCode();// 獲取響應(yīng)狀態(tài)碼
// System.out.println(code);
// 判斷是否響應(yīng)成功
if (code == HttpURLConnection.HTTP_OK) {
InputStream is1 = conn.getInputStream();
FileOutputStream fileOutputStream = new FileOutputStream(new File("C:\Users\lx\Desktop\test\mn.jpg"));
BufferedInputStream bfi = new BufferedInputStream(is1);
BufferedOutputStream bfo = new BufferedOutputStream(fileOutputStream);
int len;
byte[] bs = new byte[1024];
while((len=bfi.read(bs))!=-1){
bfo.write(bs, 0, len);
bfo.flush();
}
}
二、Socket通訊:
1、TCP/IP
IP:InternetProtocol 網(wǎng)絡(luò)協(xié)議,支撐主機之間通訊的基本協(xié)議,如果需要實現(xiàn)主機之間的消息安全傳輸,通常會結(jié)合TCP協(xié)議共同使用。全稱為TCP/IP。都是傳輸層協(xié)議。
TCP:傳輸控制協(xié)議,能保證數(shù)據(jù)消息的在主機之間安全傳輸,三次握手,四次揮手。是一個安全傳輸數(shù)據(jù)協(xié)議,所以一般用于數(shù)據(jù)傳輸?shù)臏蚀_性,安全性較高的應(yīng)用,但是效率較低,如:視頻通話。
C/S 架構(gòu): Client/Server 客戶端/服務(wù)器模式
B/S 架構(gòu): Browser/Server瀏覽器/服務(wù)器模式
服務(wù)器端:
1、創(chuàng)建serverSocket,此套接字為服務(wù)器專用,構(gòu)造器應(yīng)當包含端口號,以供其他主機連接。
2、監(jiān)聽套接字,并獲得連接:Socket socket = serverSocket.accept( );
3、獲取套接字輸出流:socket.getOutputStream( );
ServerSocket serverSocket = new ServerSocket(9999);
System.out.println("服務(wù)器開啟");
while (true) {
Socket socket = serverSocket.accept();
System.out.println("客戶端已經(jīng)連接" + socket.getInetAddress());
PrintStream ps = new PrintStream(socket.getOutputStream());
ps.print("歡迎使用socket服務(wù)器");
}
客戶端
1、利用構(gòu)造器獲取以供連接的套接字,屬性包含目標IP和端口號
2、獲取套接字里面的輸入流:socket.getInputStreeam( );
Socket socket = new Socket("127.0.0.1", 9999);
InputStreamReader isr = new InputStreamReader(socket.getInputStream());
BufferedReader br = new BufferedReader(isr);
String msg = br.readLine();
System.out.println(msg);
2、UDP
UDP:user datagram Protocol 用戶數(shù)據(jù)協(xié)議,無法保證數(shù)據(jù)的安全性,但是可以提交數(shù)據(jù)傳輸?shù)男А?/p>
接收數(shù)據(jù):為阻塞式,需要單獨作為一個線程
1、創(chuàng)建網(wǎng)絡(luò)通道datagramSocket,應(yīng)當是包含端口地址的構(gòu)造器
2、創(chuàng)建數(shù)據(jù)包datagramPacket ,其中構(gòu)造方法必須包含一個空的字符緩沖區(qū),偏移量等信息。
3、通過datagramSocket.receiver(datagramPacket);接受數(shù)據(jù),向數(shù)據(jù)包寫入數(shù)據(jù)。
4、獲取數(shù)據(jù)包內(nèi)容 new String(datagramPacket.getData() , datagramPacket.getOffset(),datagramPacket.getLength());
public static void main(String[] args) throws IOException {
DatagramSocket datagramSocket = new DatagramSocket(2345);
byte[] b = new byte[1024];
while (true) {
DatagramPacket datagramPacket = new DatagramPacket(b, b.length);
datagramSocket.receive(datagramPacket);//接受數(shù)據(jù)
String string = new String(datagramPacket.getData(), datagramPacket.getOffset(),
datagramPacket.getLength());
System.out.println("接受到的數(shù)據(jù)是" + string);
}
}
發(fā)送數(shù)據(jù):
1、創(chuàng)建網(wǎng)絡(luò)通道datagramSocket,構(gòu)造器不需寫入
2、創(chuàng)建數(shù)據(jù)包 datagramPacket,構(gòu)造方法里面包含需要寫入的字節(jié)數(shù)組,偏移量,目標地址,目標端口號,當然也可以通過set方式設(shè)置目標地址地址等信息
3、發(fā)送數(shù)據(jù)報 datagramSocket.send(datagramPacket);
public static void main(String[] args) throws IOException {
//創(chuàng)建一個網(wǎng)絡(luò)通道
DatagramSocket datagramSocket = new DatagramSocket();
//將數(shù)據(jù)打包成數(shù)據(jù)報包
String message="nnnnnn";
DatagramPacket datagramPacket = new DatagramPacket(
message.getBytes(), message.getBytes().length,
InetAddress.getByName("192.168.46.19"),
2345);
datagramSocket.send(datagramPacket);
datagramSocket.close();
}
3、UDP多播廣播
發(fā)送數(shù)據(jù):
1、創(chuàng)建多播廣播通道 new MulticastSocket( );
2、獲取組播地址并將廣播加入此地址 multicastSocket.jionGroup( InterAddress.getByName("266.81.9.8") );
3、構(gòu)建datagramPacket,包含byte[]的內(nèi)容,byte[]長度,ip,端口號。當然可以不用在構(gòu)建方法添加ip和端口號。
4、發(fā)送消息:multicastSocket.send(datagramPacket);
public static void main(String[] args) throws IOException {
MulticastSocket multicastSocket = new MulticastSocket();
InetAddress group = InetAddress.getByName("226.81.9.8");
multicastSocket.joinGroup(group);
String content = "刷屏100遍";
DatagramPacket dp = new DatagramPacket(content.getBytes(),content.getBytes().length);
dp.setAddress(group);
dp.setPort(2426);
multicastSocket.send(dp);
}
接收數(shù)據(jù):阻塞式,需要單獨作為一個線程
1、創(chuàng)建多播廣播通道:new MuliticastSocket(2426); 構(gòu)造方法應(yīng)當包含開啟的端口號
2、獲取廣播地址,并加入此廣播地址 muliticast.jionGroup(InterAddress.getByName("192.22.22.2"));
3、創(chuàng)建你個空的btye[]數(shù)組。和一個datdagramPacke對象。包含btye[]相關(guān)信息
4、接收數(shù)據(jù):mutilicastSocket.receive(datagramPacket);
5、讀取datagramPacket內(nèi)容:利用String的構(gòu)造方法
public static void main(String[] args) throws IOException {
MulticastSocket ms= new MulticastSocket(2426);
InetAddress group = InetAddress.getByName("226.81.9.8");
ms.joinGroup(group);
byte[] b = new byte[1024];
while (true) {
DatagramPacket datagramPacket = new DatagramPacket(b, b.length);
ms.receive(datagramPacket);//接受數(shù)據(jù)
String string = new String(datagramPacket.getData(), datagramPacket.getOffset(),
datagramPacket.getLength());
System.out.println(datagramPacket.getAddress()+"" + string);
}
4、NIO
NIO是jdk1.4之后引入的一套全新的IO API,處理數(shù)據(jù)的方式不同于傳統(tǒng)IO,傳統(tǒng)IO的處理數(shù)據(jù)的方式以字節(jié)為單位,而NIO是一個Buffer(數(shù)據(jù)塊) 為單位,傳統(tǒng)IO屬于阻塞式(流在讀取數(shù)據(jù)時如果未讀到時,程序會處于阻塞狀態(tài));而NIO的處理的方式為非阻塞式方式允許(底層為信號通訊),NIO可以在單線程應(yīng)用中處理多個客戶請求。
【Java網(wǎng)絡(luò)基礎(chǔ)和Socket通信基礎(chǔ)】相關(guān)文章:
Java基礎(chǔ)語法09-10
Java語言的基礎(chǔ)07-29
java語言基礎(chǔ)08-29
java基礎(chǔ)總結(jié)09-08
java編程基礎(chǔ)07-26
java語法基礎(chǔ)06-27
Java基礎(chǔ):抽象類和接口07-20
Java基礎(chǔ)學習步驟09-17