1. 程式人生 > >java Socket網路通訊簡介

java Socket網路通訊簡介

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