## OSI( Open System Interconnection,開放式系統互聯)模型,是網路系統結構的概括,將網路分為七層:應用層、表示層、會話層、傳輸層、網路層、資料鏈路層、物理層。
網路層協議,規定了在互聯網上確定與尋找電腦的規則。
傳輸層的一種資料傳輸協議,資料傳輸前透過「三次握手」建立連接,然後再發送數據,適用於對數據準確性要求較高的情況,由於數據傳輸前需要建立連接,傳輸速度較慢。
傳輸層的一種資料傳輸協議,資料傳輸前不需要建立連接,適用於對資料準確性要求不高的情況,傳輸資料較快,一般聊天資訊都會透過此協定傳輸。
HTTP協定屬於應用層協定,為作業系統或網路應用程式提供存取網路服務的介面。
當資料到達電腦後,為了找到目標應用程序,為每一個應用程式分配了一個整數值,取值0-65535,這個整數值就是端口,從中可以看出,端口代表了計算機上一個應用程序,保證數據準確到達預定的程序。一個連接埠不能同時被多個應用程式佔用,一個應用程式結束以後,連接埠不會立即釋放,有一個記憶體延遲佔有的時間,這個時間一般很短。連接埠、0-1023已經被系統應用程式及其他應用程式佔用,程式設計時避免使用這個範圍的連接埠。
# 套接字是資料傳送與接收的工具。發送者透過套接字發送數據,接受者透過套接字監聽指定的連接埠取得數據。
8.無論採用TCP協議,或是UDP協議,資料都只能以位元組形式發送。
1.關閉透過Socket取得的輸入流或輸出流將關閉Socket。
2.透過Socket取得的輸出流輸出完畢後必須關閉,不然另一端對應的輸入流將會阻塞。由於透過輸出流對象關閉輸出流時,同時關閉Socket對象,將導致另一端無法取得對應Socket的對象,因此只能透過Socket下的方法shutdownOutput關閉#輸出流。
Socket socket=new Socket(String host,int port);//创建客户端Socket,发送与接收数据,需要指明服务器IP与端口OutputStream os=socket.getOutputStream();//获取输出流,向服务器发送数据.......... os.flush(); socket.shutdownOutput();//关闭输出流,防止服务器端阻塞InputStream is=socket.getInputStream();//获取输入流,输入流包含服务器的反馈信息............ socket.close();//关闭socket,同时关闭输入与输出流
ServerSocket server=new ServerSocket(int port);//建立服务器端套接字,指定监听端口Socket socket=server.accept();//获取访问客户端的Socket,阻塞线程InputStream is=socket.getInputStream();//获取输入流,其中包含客户端发送的数据............. OutputStream os=socket.getOutputStream();//获取输出流,向客户端反馈信息.............. os.flush(); os.shutdownOutput(); server.close();
package com.javase.networkCommunication.tcp.demo02;import java.io.FileInputStream;import java.io.IOException;import java.io.InputStream;import java.io.OutputStream;import java.net.Socket;import java.net.UnknownHostException;public class ImgClient {public static void main(String[] args) throws UnknownHostException, IOException { Socket socket = new Socket("192.168.146.1", 10007); FileInputStream is = new FileInputStream("Files/1.jpg"); OutputStream os = socket.getOutputStream();byte[] buf = new byte[1024];// 先将数据读取到缓冲区,比频繁的从硬盘读取速度快int length = 0;while ((length = is.read(buf)) != -1) { os.write(buf, 0, length); } os.flush(); socket.shutdownOutput();// 如果输出流不关闭,服务端对应的输入流会阻塞InputStream replyIs = socket.getInputStream();//不会阻塞线程byte[] buf01 = new byte[1024];int length01 = replyIs.read(buf01); String reply = new String(buf01, 0, length01); System.out.println(reply); is.close(); socket.close(); } }
package com.javase.networkCommunication.tcp.demo02;import java.io.FileOutputStream;import java.io.IOException;import java.io.InputStream;import java.io.OutputStream;import java.net.ServerSocket;import java.net.Socket;import org.junit.Test;public class ImgServer { @Testpublic void test01() throws IOException { ServerSocket serverSocket = new ServerSocket(10007); Socket socket = serverSocket.accept();// 线程阻塞,等待请求System.out.println("hostAddress=" + socket.getInetAddress().getHostAddress()); InputStream is = socket.getInputStream(); FileOutputStream os = new FileOutputStream("Files/2.jpg"); System.out.println(1);byte[] buf = new byte[1024];int length = 0; System.out.println(2);int count = 3;while ((length = is.read(buf)) != -1) { os.write(buf, 0, length); System.out.println(count++); } os.flush(); os.close(); System.out.println("图片上传结束");/*PrintWriter out = new PrintWriter(socket.getOutputStream(), true); out.write("success");*/OutputStream out = socket.getOutputStream(); out.write("success".getBytes()); out.flush(); socket.shutdownOutput(); System.out.println("响应数据已发出"); serverSocket.close(); } }
DatagramSocket socket=new DatagramSocket();//创建数据报套接字用于发送数据//DUP协议采用数据包分段发送数据,因此需要建立数据包,在数据包中指明目的地IP与端口DatagramPacket packet= DatagramPacket(byte buf[], int offset, int length,InetAddress address, int port); socket.send(packet);######### 3. 接收資料的一般步驟: ### ######
DatagramSocket socket=new DatagramSocket(int port);//创建监听指定端口的数据报套接字DatagramPacket packet=new DatagramPacket(byte buf[], int length); socket.receive(packet);############
以上是關於網路通訊的實例詳解的詳細內容。更多資訊請關注PHP中文網其他相關文章!