首頁 >Java >java教程 >關於網路通訊的實例詳解

關於網路通訊的實例詳解

零下一度
零下一度原創
2017-06-25 09:33:031671瀏覽

 

一概述

# 1.網路模型

## OSI( Open System Interconnection,開放式系統互聯)模型,是網路系統結構的概括,將網路分為七層:應用層、表示層、會話層、傳輸層、網路層、資料鏈路層、物理層。

2.IP協定

網路層協議,規定了在互聯網上確定與尋找電腦的規則。

3.TCP協定

傳輸層的一種資料傳輸協議,資料傳輸前透過「三次握手」建立連接,然後再發送數據,適用於對數據準確性要求較高的情況,由於數據傳輸前需要建立連接,傳輸速度較慢。

4.UDP協定

傳輸層的一種資料傳輸協議,資料傳輸前不需要建立連接,適用於對資料準確性要求不高的情況,傳輸資料較快,一般聊天資訊都會透過此協定傳輸。

5.HTTP協定

HTTP協定屬於應用層協定,為作業系統或網路應用程式提供存取網路服務的介面。

6.連接埠port

當資料到達電腦後,為了找到目標應用程序,為每一個應用程式分配了一個整數值,取值0-65535,這個整數值就是端口,從中可以看出,端口代表了計算機上一個應用程序,保證數據準確到達預定的程序。一個連接埠不能同時被多個應用程式佔用,一個應用程式結束以後,連接埠不會立即釋放,有一個記憶體延遲佔有的時間,這個時間一般很短。連接埠、0-1023已經被系統應用程式及其他應用程式佔用,程式設計時避免使用這個範圍的連接埠。

7.套接字Socket

# 套接字是資料傳送與接收的工具。發送者透過套接字發送數據,接受者透過套接字監聽指定的連接埠取得數據。

8.無論採用TCP協議,或是UDP協議,資料都只能以位元組形式發送。

二 TCP程式設計

1.關閉透過Socket取得的輸入流或輸出流將關閉Socket。

2.透過Socket取得的輸出流輸出完畢後必須關閉,不然另一端對應的輸入流將會阻塞。由於透過輸出流對象關閉輸出流時,同時關閉Socket對象,將導致另一端無法取得對應Socket的對象,因此只能透過Socket下的方法shutdownOutput關閉#輸出流。

3.客戶端的一般步驟: 

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,同时关闭输入与输出流

4.伺服器的一般步驟:

#
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();

5.Demo

#客戶端

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();
    }

}


三UDP程式設計###################################################### ###UDP協定以資料包的形式發送數據,每個包的最大值64k。 ############ 2.傳送資料的一般步驟: #########
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中文網其他相關文章!

陳述:
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn