1.網絡通信的對象準確地講不是主機,而是主機當中運行的進程。通過域名或IP地址只能定位到主機,而不能定位到進程。端口號就是爲了在一臺主機上提供更多的網絡資源而採取的一種手段,也是傳輸層提供的一種機制。只有通過域名或者IP地址和端口號的組合纔可以唯一確定網絡通信中的對象:進程。端口號範圍是0~65535,其中0~1023位是系統所保留的。
2.TCP/IP的傳輸層同時存在TCP和UDP兩個協議。TCP是一種面向連接的保證可靠傳輸的協議。發送方和接收方各有一個Socket,兩個Socket之間必須建立連接,以便於在TCP協議的基礎上進行通信,當一個Socket(通常是Server Socket)等待建立連接時,另外一個Socket(Client Socket)可以要求進行連接,一旦這兩個Socket連接起來就可以進行雙向數據傳輸,雙方都可以進行發送或者接受操作。UDP協議是一種無連接的協議,也不進行流量控制。因此UDP提供的服務是不可靠的,基於UDP的應用程序可根據自己的情況來承擔可靠性方面的工作。
3.Socket嵌套字:
網絡上具有唯一標識的IP地址和端口組合在一起才能構成唯一能識別的標識符嵌套字。
4.Socket原理機制:
通信的兩端都有Socket,網絡通信的實質就是Socket之間的通信,數據在兩個Socket之間通過IO傳輸。
原理圖如下所示:
5.Socket通信的步驟:
(1)創建ServerSocket和Socket
(2)打開連接到Socket的輸入/輸出流
(3)按照協議對Socket進行讀/寫操作
(4)關閉輸入輸出流、關閉Socket
6.服務器端:
(1)創建ServerSocket對象,綁定監聽端口
(2)通過accept()方法監聽客戶端請求
(3)連接建立後,通過輸入流讀取客戶端發送的請求
(4)通過輸出流向客戶端發送相應信息
(5)關閉相關資源
簡單實例:
(1)客戶端程序:
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) throws Exception, IOException {
// TODO Auto-generated method stub
//客戶端
//1、創建客戶端Socket,指定服務器地址和端口
Socket socket =new Socket("localhost",10086);
//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、關閉資源
br.close();
is.close();
pw.close();
os.close();
socket.close();
}
}
(2)服務器端:
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;
public class Server {
public static void main(String[] args) throws Exception {
// TODO Auto-generated method stub
/**
2 * 基於TCP協議的Socket通信,實現用戶登錄,服務端
3 */
//1、創建一個服務器端Socket,即ServerSocket,指定綁定的端口,並監聽此端口
ServerSocket serverSocket =new ServerSocket(10086);//1024-65535的某個端口
//2、調用accept()方法開始監聽,等待客戶端的連接
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();
}
}