#這篇文章主要介紹電腦網路的一個整體架構和每一層的作用。
電腦網路的概念
#OSI參考模型
#TCP/IP參考模型
#IP協定
TCP協定與連接埠
Java網路程式入門程式
網絡,就是不同節點之間經由連線互聯起來的一個事物。以此類推,電腦網絡,就是將不同地理位置的電腦透過通訊線路連接起來的一個具有強大功能的網路系統。在這個網路中每台電腦就是一個節點。
OSI(Open System Interconnection)是由ISO組織研究的一套網路體系結構。這名字起的好
各層的名稱和作用,當做了解:
#功能 | |
---|---|
物理層 | 不要理解錯了,這一層不包含什麼網路線、電纜的實體媒體。這裡只是規定網路線和電纜的介面類型,訊號電壓等。使用bit傳輸 |
資料鏈結層 | 負責兩個相鄰節點間的路線,以訊框為單位傳輸。典型設備交換器(Switch) |
網路層 | 兩台電腦傳輸資料可能會經過許多資料鏈路,網路層的作用就是選擇最優的路線。典型設備就是路由器 |
傳輸層 | 提供兩個端系統的會話的建立、維護和取消傳輸連線的功能。使用封包傳輸 |
會話層 | 管理進程間的會話過程,也就是建立、管理、終止進程間的會話。使用封包傳輸 |
表示層 | 對資料的加解密、解壓縮和格式轉換等。 |
應用層 | 這層就是和使用者的具體應用互動。例如:收發E-mail等。 |
因為OSI網路結構分層太多過於複雜,所以TCP/IP協定橫空出世。 TCP/IP協定同樣借助了OSI的分層思想,但只是分成四層:
#功能 | |
---|---|
主機網路層 | |
網路互聯層 | |
傳輸層 | |
應用層 |
• FTP:檔案傳輸協議,允許在網路上傳輸檔案。
• TELNET:虛擬終端協議,允許從主機A登錄遠端主機B。
• HTTP:超文本傳輸協議,允許網路是傳輸超文本。
• HTTPS:安全超文本傳輸協定。
• POP3:允許使用者存取和操作運程伺服器上的郵件和郵件夾。
• IMAP4:訊息存取協定版本4,允許使用者存取和操作運送伺服器上的郵件和郵件夾。
• SMTP:發送郵件的協定。
• SNMP:簡單網路管理協議,為管理本地和遠端的網路設備提供了一個標準化途徑,是分佈式環境中的集中化管理協定。
• DNS:網域名稱系統協議,將主機的網域轉換為對應的IP位址。
IP網路(採用IP協定的網路)中每一台主機都有唯一的IP位址,IP位址識別網路中的每個主機。 IP位址是一個32位元的二進位數序列。例如:192.168.3.4
。 IP位址與子網路遮罩進行與運算得到的是網路位址。如果子網路遮罩為255.255.255.0
那網路位址就是:192.168.3.0
主機A利用ARP協定找到本地網路上的路由器的實體位址,把封包轉給路由。路由器依照下列步驟處理封包:
流程圖如下:
www.google.com
網域和IP的對應需要一個網域解析系統來實現將網域轉換成IP。 DNS伺服器就是就可以解決這個問題。
应用层协议://主机IP地址或域名/资源所在路径/资源名例如:
http://www.php.cn/ 其中
http 指超文本傳輸協議,
blog.csdn.net 是Web伺服器的域名,
/article/details/ 是網頁所在路徑,
54962975 這個才是對應的網頁檔案。
服务 | 端口 | 协议 |
---|---|---|
文件传输服务 | 21 | FTP |
远程登录服务 | 23 | TELENET |
邮件传输服务 | 25 | SMTP |
万维网超文本传输服务 | 80 | HTTP |
访问邮件远程邮件服务 | 110 | POP3 |
互联网消息存取服务 | 143 | IMAP4 |
安全的超文本传输服务 | 443 | HTTPS |
安全的远程登录服务 | 992 | TELNETS |
安全互联网消息存取服务 | 993 | IMAPS |
Java网络程序都建立在TCP/IP协议基础上,在应用层实现。传输层向应用层提供了套接字Socket接口,Socket封装了下层的数据传细节,应用层的程序通过Socket来建立与远程主机的连接,以及数据传输,如下图所示:
在Java中,有3种套接字类:java.net.Socket
、java.net.ServerSocket
和 java.net.DatagramSocket
。其中Socket
和 ServerSocket
建立在TCP协议上,DatagramSocket
类建立在UDP协议基础上。我们创建EchoServer和EchoClient两个类,我们通过ServerSocket
和Socket
来编写。
在服务端通过一直监听端口,来接收客户程序的连接请求。在服务器程序中,先创建一个ServerSocket
对象,在构造方法中指定监听的端口:
ServerSocket server = new ServerSocket(8080);
ServerSocket
构造器负责在操作系统中将当前进程注册为服务进程。服务器程序调用ServerSocket
的accept()
方法来监听端口,等待客户端的连接,如果接收到连接,则accept()
方法返回一个Socket
对象,这个Socket
对象与客户端的Socket
对象形成了一条通信线路:
Socket socket = server.accept();
Socket提供了getInputStream()方法和getOutputStream()方法,分别返回输入流InputStream对象和输出流OutputStream对象。程序只需向输出流写入东西,就能向对方发送数据;只需从输入流读取数据,就能接收到数据。如下图: EchoServer
类代码如下:
/** * 服务端 服务端类 * */public class EchoServer { private ServerSocket serverSocket; public EchoServer(int port) { try { this.serverSocket = new ServerSocket(port); System.out.println("start server success,start port:"+port); } catch (IOException e) { e.printStackTrace(); } } /** * 获取BufferedReader包装类 * * @param socket * @return * @throws IOException */ private BufferedReader getReader(Socket socket) throws IOException { return new BufferedReader(new InputStreamReader(socket.getInputStream())); } /** * 获取PrintWriter包装类, * * @param socket * @return * @throws IOException */ private PrintWriter getWriter(Socket socket) throws IOException { // 每写一行自动刷新 return new PrintWriter(socket.getOutputStream(), true); } public void service() { while (true) { Socket socket = null; try { socket = serverSocket.accept(); System.out.println("new connect,address is:" + socket.getInetAddress() + " port is:" + socket.getPort()); BufferedReader reader = getReader(socket); PrintWriter writer = getWriter(socket); String msg = null; while ((msg = reader.readLine()) != null) { // 读取一行 System.out.println("client request msg: " + msg); writer.println(echo(msg)); if ("bye".equalsIgnoreCase(msg)) { break; } } } catch (IOException e) { e.printStackTrace(); }finally{ if(socket!=null){ try { //关闭会话连接 socket.close(); } catch (IOException e) { e.printStackTrace(); } } } } } private String echo(String msg) { return "get request msg is '" + msg+"'"; } public static void main(String[] args) { new EchoServer(8080).service(); } }
EchoServer
类的最主要的方法就是service()
方法,它不断登录客户的连接请求。当serverSocket.accept()
返回一个Socket
对象时,表示与一个客户端建立了连接。
EchoClient
类在EchoClient程序中,为了与EchoClient通信,需要先创建一个Socket对象:
String host="localhost";int port = 8080;new Socket(host, port);
host表示Server进程所在服务器的地址,port表示Server进程监听的端口。当参数host为’localhost’时,表示服务端和客户端在同一台机器上。下面是EchoClient
类的源码:
public class EchoClient { private Socket socket; public EchoClient(String host,int port){ try { this.socket = new Socket(host, port); } catch (UnknownHostException e) { e.printStackTrace(); } catch (IOException e) { e.printStackTrace(); } } /** * 获取BufferedReader包装类 * * @param socket * @return * @throws IOException */ private BufferedReader getReader(Socket socket) throws IOException { return new BufferedReader(new InputStreamReader(socket.getInputStream())); } /** * 获取PrintWriter包装类, * * @param socket * @return * @throws IOException */ private PrintWriter getWriter(Socket socket) throws IOException { // 每写一行自动刷新 return new PrintWriter(socket.getOutputStream(), true); } public void talk(){ try { BufferedReader reader = getReader(socket); PrintWriter writer = getWriter(socket); BufferedReader localReader = new BufferedReader(new InputStreamReader(System.in)); String msg = null; while((msg=localReader.readLine())!=null){ writer.println(msg); System.out.println("server response msg:"+reader.readLine()); if("bye".equalsIgnoreCase(msg)){ break; } } } catch (IOException e) { e.printStackTrace(); }finally{ if(socket!=null){ try { socket.close(); System.out.println("has been disconnected"); } catch (IOException e) { e.printStackTrace(); } } } } public static void main(String[] args) { new EchoClient("localhost", 8080).talk(); } }
在EchoClient类中最重要的是talk()方法,该方法不断读取用户从控制台输入的字符串,然后将它发送到EchoServer,在把EchoServer返回的数据打印在控制台。如果输入’bye’字符串,就会结束与EchoServer的通信,调用socket.close()方法端口连接。
具体运行如下图,一个是服务端一个是客户端的控制台:
简单介绍了一下网络的理论知识和TCP/IP协议。并使用Java实现了一个网络通信程序。
以上就是Java网络编程由浅入深一图文详解的内容,更多相关内容请关注PHP中文网(www.php.cn)!