java Socket網路通訊簡介
1、簡介:網路上執行的程式之間雙向通訊鏈路的終結點,是tcp和udp的基礎
由ip地址和埠號組成
2、java提供的網路功能
1>InetAddress:用於標識網路上的硬體資源,相當於標識IP地址
2>URL:統一資源定位符 通過URL可以直接讀取或寫入網路上的資料
3>Sockets:使用TCP協議實現網路通訊的Socket相關的類
4>Datagram:使用UDP協議,將資料儲存在資料報中,通過網路進行通訊
3、InetAddress:
package com.zy; import java.net.InetAddress; import java.net.UnknownHostException; import java.util.Arrays; public class Test01 { public static void main(String[] args) throws UnknownHostException { //獲取本機的InetAddress例項 InetAddress address = InetAddress.getLocalHost(); //主機名 System.out.println("主機名:" +address.getHostName()); //IP地址 System.out.println("IP地址:" +address.getHostAddress()); //獲取位元組陣列形式的ip地址 byte[] bytes = address.getAddress(); System.out.println("位元組陣列形式的ip:" + Arrays.toString(bytes)); //直接輸出InetAddress物件 System.out.println(address); //獲取本機外機器的InetAddress例項 //根據機器名獲取InetAddress例項 //InetAddress address2 = InetAddress.getByName("PC201411181946"); //根據IP地址獲取InetAddress例項 InetAddress address2 = address.getByName("169.254.6.168"); //主機名 System.out.println("主機名:" +address2.getHostName()); //IP地址 System.out.println("IP地址:" +address2.getHostAddress()); } }
4、URL
1>基本用法:
package com.zy; import java.net.MalformedURLException; import java.net.URL; /** * URL常用方法 * @author Administrator * */ public class Test02 { public static void main(String[] args) { try { //建立一個URL例項 URL zy = new URL("http://www.imooc.com"); //根據一個URL建立一個新的URL,?後面跟攜帶的引數,#後面表示錨點 URL url = new URL(zy, "/index.html?username=tom#test"); //獲取此url採用的協議 System.out.println("協議:" + url.getProtocol()); //獲取此url的主機 System.out.println("主機:" + url.getHost()); //獲取此url的埠號,如果未指定埠號,則使用預設的埠號,此時getPort()方法返回值為-1 System.out.println("埠:" + url.getPort()) ; //獲取此url的檔案路徑 System.out.println("檔案路徑" + url.getPath()); System.out.println("檔名:" + url.getFile()); System.out.println("相對路徑:" + url.getRef()); System.out.println("查詢字串:" + url.getQuery()); } catch (MalformedURLException e) { e.printStackTrace(); } } }
2>使用URL讀取網頁內容
1、通過URL物件的openstream()方法可以得到指定資源的輸入流
2、通過輸入流可以讀取、訪問網路上的資料
package com.zy; import java.io.BufferedReader; import java.io.IOException; import java.io.InputStream; import java.io.InputStreamReader; import java.net.MalformedURLException; import java.net.URL; /* * 使用URL讀取頁面內容 */ public class Test03 { public static void main(String[] args) { try { //建立一個URL例項 URL url = new URL("http://www.baidu.com"); //通過URL的openStream方法獲取URL物件所表示的資源的位元組輸入流 InputStream is= url.openStream(); //將位元組輸入流轉換為字元輸入流,轉換時指定編碼格式,防止亂碼 InputStreamReader isr = new InputStreamReader(is,"utf-8"); //為字元輸入流新增緩衝,提高讀寫效率 BufferedReader br = new BufferedReader(isr); //讀取資料,一次讀取一行 String data = br.readLine(); while (data!=null) {//迴圈讀取資料 System.out.println(data);//輸出資料 data = br.readLine(); } //關閉相關的資源 br.close(); isr.close(); is.close(); } catch (MalformedURLException e) { e.printStackTrace(); } catch (IOException e) { // TODO Auto-generated catch block e.printStackTrace(); } } }
5、Socket
1>基於TCP協議實現網路通訊的類
客戶端的Socket類
伺服器端的ServerSocket類
2>Socket通訊實現步驟(附 流程圖)
建立ServerSocket和socket --> 開啟連線到Socket的輸入/輸出流
--> 按照協議對Socket進行讀/寫操作 --> 關閉輸入輸出流、關閉Socket
服務端:
1、建立ServerSocket物件,繫結監聽埠
2、通過accept()方法監聽客戶端請求
3、連線建立後,通過輸入流讀取客戶端傳送的請求資訊
4、通過輸出流向客戶端傳送響應資訊
5、關閉相關資源
客戶端:
1、建立Socket物件,指明需要連線的伺服器的地址和埠號
2、連線建立後,通過輸出流向伺服器端傳送請求資訊
3、通過輸入流獲取伺服器響應的資訊
4、關閉相關資源
package com.zy;
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.io.OutputStream;
import java.io.PrintWriter;
import java.net.ServerSocket;
import java.net.Socket;
/*
* 基於TCP協議的Socket通訊,實現使用者登入
* 伺服器端
*/
public class Server {
public static void main(String[] args) {
try {
// 1、建立一個伺服器端socket,即ServerSocket,繫結指定的埠,並監聽此埠
ServerSocket serverSocket = new ServerSocket(8777);
// 2、呼叫accept()方法開始監聽,等待客戶的連線
System.out.println("***伺服器即將啟動,等待客戶端的連線***");
Socket socket = serverSocket.accept();
// 3、獲取輸入流,並獲取客戶端資訊
InputStream is = socket.getInputStream();// 位元組輸入流
InputStreamReader isr = new InputStreamReader(is);// 將位元組流轉為字元流
BufferedReader br = new BufferedReader(isr);// 為輸入流新增緩衝
String info = null;
while ((info = br.readLine()) != null) {
System.out.println("我是伺服器,客戶端說:" + info);
}
socket.shutdownInput();// 關閉輸入流
// 4、獲取輸出流,向客戶端傳送請求
OutputStream os = socket.getOutputStream();
PrintWriter pw = new PrintWriter(os);
pw.write("歡迎您!");
pw.flush();
// 5、關閉相關資源
pw.close();
os.close();
br.close();
isr.close();
is.close();
socket.close();
serverSocket.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}
package com.zy;
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.io.OutputStream;
import java.io.PrintWriter;
import java.net.Socket;
import java.net.UnknownHostException;
/*
* 客戶端
*/
public class Client {
public static void main(String[] args) {
try {
// 1、建立客戶端Socket,指定伺服器地址和埠
Socket socket = new Socket("localhost", 8777);
// 2、獲取輸出流,向伺服器端傳送資訊
OutputStream os = socket.getOutputStream();// 位元組輸出流
PrintWriter pw = new PrintWriter(os);// 將輸出流包裝為列印流
pw.write("使用者名稱:admin;密碼:123");
pw.flush();// 重新整理快取,向伺服器端傳送資訊
socket.shutdownOutput();// 關閉輸出流
// 3、獲取輸入流,並讀取伺服器響應資訊
InputStream is = socket.getInputStream();
BufferedReader br = new BufferedReader(new InputStreamReader(is));
String info = null;
while ((info = br.readLine()) != null) {
System.out.println("我是客戶端,伺服器說:" + info);
}
// 4.關閉資源
is.close();
br.close();
pw.close();
os.close();
socket.close();
} catch (UnknownHostException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}
}
}
*注意:先執行伺服器端再執行客戶端
3>上述只實現了一個伺服器和一個客戶端之間的通訊,如果有多個客戶端呢?
多執行緒伺服器應用多執行緒來實現伺服器與多客戶端之間的通訊
基本步驟:
1、伺服器端建立ServerSocket,迴圈呼叫accept()等待客戶端連線
2、客戶端建立一個socket並請求和伺服器端連線
3、伺服器端接受客戶端請求,建立socket與該客戶建立專線連線
4、建立連線的兩個socket在一個單獨的執行緒上對話
5、伺服器端繼續等待新的連線
package com.zy;
import java.io.IOException;
import java.net.InetAddress;
import java.net.ServerSocket;
import java.net.Socket;
/*
* 基於TCP協議的Socket通訊,實現使用者登入
* 伺服器端
*/
public class Server {
public static void main(String[] args) {
try {
// 1、建立一個伺服器端socket,即ServerSocket,繫結指定的埠,並監聽此埠
ServerSocket serverSocket = new ServerSocket(8777);
Socket socket = null;
//記錄客戶端的數量
int count = 0;
System.out.println("***伺服器即將啟動,等待客戶端的連線***");
//迴圈監聽等待客戶端連線
while(true){
//呼叫accept()方法開始監聽,等待客戶的連線
socket = serverSocket.accept();
//建立一個新的執行緒
ServerThread serverThread = new ServerThread(socket);
//啟動執行緒
serverThread.start();
count++;//統計客戶端的數量
System.out.println("客戶端的數量為:"+count);
InetAddress address = socket.getInetAddress();//獲取客戶端的ip地址
System.out.println("當前客戶端的IP:"+address.getHostAddress());
}
} catch (IOException e) {
e.printStackTrace();
}
}
}
package com.zy;
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.io.OutputStream;
import java.io.PrintWriter;
import java.net.Socket;
/*
* 伺服器執行緒處理類
*/
public class ServerThread extends Thread {
// 和執行緒相關的Socket
Socket socket = null;
// 每次建立ServerThread執行緒時就會初始化和本執行緒相關的socket
public ServerThread(Socket socket) {
this.socket = socket;
}
// 執行緒執行操作,響應客戶端請求(重寫父類run方法)
public void run() {
InputStream is = null;
InputStreamReader isr = null;
BufferedReader br = null;
OutputStream os = null;
PrintWriter pw = null;
try {
// 3、獲取輸入流,並獲取客戶端資訊
is = socket.getInputStream();
isr = new InputStreamReader(is);
br = new BufferedReader(isr);
String info = null;
while ((info = br.readLine()) != null) {
System.out.println("我是伺服器,客戶端說:" + info);
}
socket.shutdownInput();// 關閉輸入流
// 4、獲取輸出流,向客戶端傳送請求
os = socket.getOutputStream();
pw = new PrintWriter(os);
pw.write("歡迎您!");
pw.flush();
} catch (IOException e) {
e.printStackTrace();
} finally {
try {
// 5、關閉相關資源
if (pw != null)
pw.close();
if (os != null)
os.close();
if (br != null)
br.close();
if (isr != null)
isr.close();
if (is != null)
is.close();
if (socket != null)
socket.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}
}
相關推薦
java Socket網路通訊簡介
Socket1、簡介:網路上執行的程式之間雙向通訊鏈路的終結點,是tcp和udp的基礎 由ip地址和埠號組成2、java提供的網路功能 1>InetAddress:用於標識網路上的硬體資源,相當於標識IP地
java socket網路通訊
1.客戶端給伺服器傳送1句話 import java.io.BufferedWriter; import java.io.IOException; import java.io.OutputStreamWriter; import java.net.Socket; public class C
Java Socket網路程式設計
Java Socket網路程式設計 計算機網路中,客戶機與伺服器之間進行通訊時,客戶機必須知道伺服器的IP地址和埠號。IP地址是標識Internet網路中的某臺計算機,而埠號則標識著在伺服器上執行的某個程式(程序),如果在伺服器上執行的程式,沒有埠號,則客戶端的程式就不能找到它,也不能和它
Hololens之Socket網路通訊
我用HoloLens開發網路模組時,最初的做法是用.Net的System.Net.Scoekt中的UDP,想必這個方法是大多數開發者直接想到的方法。但是在匯出時就出問題了,匯出為UWP時,報錯,大致是Socket庫裡缺少某個方法,還有我當時用的同步方法,所以自己寫的的多執行緒
[記錄]Hololens之Socket網路通訊
我用HoloLens開發網路模組時,最初的做法是用.Net的System.Net.Scoekt中的UDP,想必這個方法是大多數開發者直接想到的方法。但是在匯出時就出問題了,匯出為UWP時,報錯,大致是Socket庫裡缺少某個方法,還有我當時用的同步方法,所以自己寫的的多執行緒,然後多執行緒也報錯了:
Socket網路通訊基礎(第八天)
什麼是網路模型 網路程式設計的本質是兩個裝置之間的資料交換,當然,在**計算機網路**中,裝置主要指計算機。資料傳遞本身沒有多大的難度,不就是把一個裝置中的資料傳送給兩外一個裝置,然後接受另外一個裝置反饋的資料。 現在的網路程式設計基本上都是基於請求/響應方式的
java socket網路程式設計例項程式碼(含服務端和客戶端)
本程式碼為java socket網路程式設計例項程式碼,包括客戶端和服務端,實現客戶端傳送訊息,服務端接收並反饋訊息。 server.java為服務端程式碼。 client.java為客戶端程式碼。 服務端程式碼server.java: package socket;
初識http、https、TCP/IP、Socket網路通訊
網路由下往上分為: 物理層– 資料鏈路層– 網路層– IP協議 傳輸層– TCP協議 會話層– 表示層和應用層– HTTP協議 一、TCP/
java socket報文通訊-報文的封裝
什麼是報文這裡我就不在闡述了,不清楚的朋友可以自己去查資料。我們今天要談的報文主要友以下幾個部分組成:3位同步校驗位+8位報文長度+報文頭+報文體+32位MD5校驗位基本格式如下:0X110X120X1300000232<?xml version="1.0" encod
Socket 網路通訊協議 http、TCP/IP協議與socket之間的區別
網路由下往上分為: 物理層-- 資料鏈路層-- 網路層-- IP協議 傳輸層-- TCP協議 會話層-- 表示層和應用層-- HTTP協議 1、TCP/IP連線 手機能夠使用聯網功能是因為手機底層實現了TCP/IP協議,可以使手機終端通過無線網路建立TCP連線
如何基於TCP/IP協議進行MFC Socket網路通訊程式設計
MFC Socket網路通訊程式設計 最近因為一個專案需要進行區域網絡通訊,向工作單位的軟體工程師請教了一下需要用到哪些知識,然後博主就自學了一遍windows網路通訊程式設計原理,然後就在網上找了一大堆例子,但實際執行效果並不佳,花了大概一週多的時間總算是把
MFC Socket網路通訊程式設計
最近因為一個專案需要進行區域網絡通訊,向工作單位的軟體工程師請教了一下需要用到哪些知識,然後博主就自學了一遍windows網路通訊程式設計原理,然後就在網上找了一大堆例子,但實際執行效果並不佳,花了大概一週多的時間總算是把網路通訊程式給跑起來了(PS:雖然時間比較長,但對於一個新手程式設
java socket報文通訊(二)報文的封裝
昨天我們談了怎麼建立socket通訊的服務端和客戶端,今天我們就來談一談怎麼封裝報文。 什麼是報文這裡我就不在闡述了,不清楚的朋友可以自己去查資料。我們今天要談的報文主要友以下幾個部分組成: 3位同步校驗位+8位報文長度+報文頭+報文體+32位MD5校驗位 基本格式
Java-socket網路程式設計
Java 網路程式設計 網路程式設計是指編寫執行在多個裝置(計算機)的程式,這些裝置都通過網路連線起來。 java.net 包中 J2SE 的 API 包含有類和介面,它們提供低層次的通訊細節。你可以直接使用這些類和介面,來專注於解決問題,而不用關注通訊細節。 java.net
Java Socket網路程式設計:實現簡單的區域網共享檔案(PeertoPeer)
介紹 程式碼很簡單,只需要兩個java檔案:Server.java和Client.java。 程式碼不是我寫的,出自:這裡(感興趣的可以自行下載,這裡就不貼出來了) 執行結果 簡要說一下怎麼執行,這裡演示在同一個電腦上執行(也可以在多個電腦上執行,但客戶端的ip要改為伺服器端所在
Java Socket網路程式設計常見異常(轉)
1.java.net.SocketTimeoutException 這個異常比較常見,socket超時。一般有2個地方會丟擲這個,一個是connect的時候,這個超時引數由connect(SocketAddress endpoint, int timeout)中的後者來決定,還有就是setSoTimeout
一套完整的unity的socket網路通訊模組
SocketHelper類 主要的通訊類,socket的管理放在這裡 下面說一下一些主要的方法 1.連線伺服器,這個都寫了比較詳細的註釋,一看就會明白 /// <summary> /// 連線伺服器 /// </summary
Unity3D Webplayer Socket網路通訊使用中遇到的問題總結
Unity3D Webplayer釋出時,由於安全沙箱的問題,在Socket通訊、Dll引用時會遇到一些麻煩, 但最終證明:Unity3D Webplayer模式下,完全可以使用Socket 通訊和 自己編寫的Dll(使用VS C#類庫建立的Dll),但要注意以下方面。 1
Android簡單的socket網路通訊例子--群聊
Android的網路通訊很多都是基於socket,在這裡說一下簡單的Android的socket通訊的例子。在這裡我們模擬一下群聊。 首先我們瞭解一下什麼是socket,socket又稱“套接字”,應用程式通常通過“套接字”向網路發出請求或者應答請求。在Java中Socke
JAVA SOCKET網路程式設計,服務端接收多個客戶端連線的實現
這是基於前面一篇文章的一個簡單擴充套件,當然這不是最好的實現 服務端如果要想接收多個客戶端連線,必須死迴圈去接收新的客戶端的連線請求,一個完整的客戶端服務端socket連線通過一個執行緒來維護 package com.tree.demo.socket; import