OSI (Open System Interconnection) モデルは、ネットワーク システム構造の概要であり、ネットワークをアプリケーション層、プレゼンテーション層の 7 つの層に分割します。層、セッション層、トランスポート層、ネットワーク層、データリンク層、物理層。
ネットワーク層プロトコルは、インターネット上のコンピューターを識別および検索するためのルールを指定します。
データ送信の前に、「3ウェイハンドシェイク」によって接続が確立され、データが送信される状況に適しています。高いデータ精度が必要ですが、データ送信前に接続を確立する必要があるため、通信速度が遅くなります。
データ送信前に接続を確立する必要がなく、データ送信の精度が高くない場合に適しています。通常、チャット情報はこのプロトコルを通じて送信されます。
HTTP プロトコルは、オペレーティング システムまたはネットワーク アプリケーションがネットワーク サービスにアクセスするためのインターフェイスを提供するアプリケーション層プロトコルです。
データがコンピューターに到達すると、ターゲット アプリケーションを見つけるために、0 ~ 65535 の範囲の整数値が各アプリケーションに割り当てられます。この整数値は ポートです。ここから、ポートがコンピュータ上のアプリケーション プログラムを表しており、データが所定のプログラムに正確に到達することが保証されていることがわかります。ポートは複数のアプリケーションによって同時に占有されることはできません。アプリケーションが終了した後、ポートはすぐには解放されません。メモリ遅延占有時間は通常非常に短いものです。ポート 0 ~ 1023 は、システム アプリケーションや他のアプリケーションによってすでに占有されています。プログラム設計中は、この範囲のポートを使用しないでください。
7. ソケット8. TCP プロトコルが使用されるか UDP プロトコルが使用されるかに関係なく、データはバイト形式でのみ送信できます。
II TCP プログラミング
2. ソケットを通じて取得された出力ストリームは、出力が完了した後に閉じる必要があります。そうしないと、反対側の対応する入力ストリームがブロックされます。出力ストリーム オブジェクトを通じて出力ストリームを閉じるときに、
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,同时关闭输入与输出流
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(); } }
2. データを送信するための一般的な手順:
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);
以上がネットワーク通信例を詳しく解説の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。