Java研究ノート-ネットワークプログラミング

1.ネットワークプログラミング入門

ネットワークプログラミング:ネットワーク通信プロトコルの下で、ネットワーク相互接続を実現する異なるコンピュータで実行されているプログラム間でデータ交換を実行できます

1.1、ネットワークプログラミングの3つの要素

IPアドレス:ネットワーク内のコンピューターが相互に通信するには、各コンピューターに識別番号を割り当てる必要があります。識別番号は、データを受信するコンピューターと送信コンピューターを識別するコンピューターを指定するために使用されます。IPアドレスは次のとおりです。識別番号。IPアドレスとも呼ばれます。これは
デバイスの識別ポートです。ネットワークの通信は、基本的に2つのアプリケーションの通信です。各コンピュータには多くのアプリケーションがありますが、ネットワーク通信でこれらのアプリケーションを区別するにはどうすればよいでしょうか。IPアドレスがネットワーク内のデバイスを一意に識別できる場合、ポート番号はデバイス内のアプリケーションを一意に識別できます。つまり、アプリケーションの識別プロトコル
:複数のコンピューターをコンピューターネットワーク経由で接続できます。同じネットワーク内のコンピューターは、道路上の中間色の車のように、接続および通信するときに特定の規則に従う必要があります。交通規則。コンピュータネットワークでは、これらの接続と通信のルールはネットワーク通信プロトコルと呼ばれ、データの伝送フォーマット、伝送速度、および伝送ステップについて統一された規制を行い、データ交換を完了するには、両者がそれらに従う必要があります。一般的なプロトコルは、UDPプロトコルとTCPプロトコルです。

1.2、IPアドレス:ネットワーク内のデバイスの一意のIDです

IPアドレスは2つのカテゴリに分類されます。IPv4IPv6
一般的なコマンド:
ipconfig:ローカルIPアドレスを確認します
ping IPアドレス:ネットワークが接続されているかどうかを確認します
特別なIPアドレス:
127.0.0.1:ローカルアドレスを表すことができるループバックアドレスです。一般的にテストに使用されます

1.3、InetAddressの使用

IPアドレスの取得と操作を容易にするために、JacaはInetAddressを使用するためのクラスInetAddressを提供します
。このクラスはインターネットプロトコル(IP)アドレスを識別します
。staticInetAddress getByName(String host):ホスト名のIPアドレスを決定します。ホスト名は、マシン名またはIPアドレスにすることができます。StringgetHostName():
このIPアドレスのホスト名を取得します
。StringgetHostAddress():テキスト表示でIPアドレス文字列を返します。

1.4、ポート、プロトコル

ポート:デバイス上のアプリケーションの一意の識別ポート番号
:2バイトで表される整数、その​​値の範囲は0〜65535です。0〜1023のポート番号は、一部の有名なネットワークサービスおよびアプリケーション、通常のアプリケーションで使用されます。 1024を超えるポート番号を使用する必要があります。
プロトコル:コンピュータネットワークでは、接続と通信のルールはネットワーク通信プロトコルと呼ばれます
。UDPプロトコル:ユーザーデータグラムプロトコルは、接続のない通信プロトコルです。リソースの消費量が少なく、UDPプロトコルを使用した通信効率が高いため、通常、すべてがオーディオ、ビデオ、および一般データの送信に使用されます。ただし、重要なデータを送信するときにUDPプロトコルTCPプロトコルを使用することはお勧めしません
。伝送制御プロトコルはコネクション型通信プロトコルです。つまり、データを送信する前に、送信者と受信者の間に論理接続が確立され、その後、データが送信されます。コンピュータ間で2つの信頼性の高いエラーのないデータ転送を提供します。TCP接続では、クライアントとサーバーを明確にする必要があり、クライアントはサーバーに接続要求を送信します。各接続の作成には、「スリーウェイハンドシェイク」
スリーウェイハンドシェイクが必要です。TCPプロトコルでは、データ送信の準備段階で、クライアント接続の信頼性を確保するためのクライアントとサーバー間の3つの対話
最初のハンドシェイクでは、クライアントはサーバーに接続要求を送信し、サーバーが
2番目のハンドシェイクを確認するのを待ちます。サーバーはクライアントに応答を送り返し、接続要求を受信したことをクライアントに通知します
。3番目のハンドシェイクでは、クライアントは確認情報をサーバーに再度送信して、接続
が3方向ハンドシェイクを完了したことを確認します。接続が確立された後、クライアントとサーバーはデータ送信を開始できます。このコネクション型機能により、TCPプロトコルは送信データのセキュリティを保証できます。

2.UDP通信プログラム

2.1、UDP通信原理

UDPプロトコルは信頼性の低いネットワークプロトコルであり、通信の両端にSocketオブジェクトを確立しますが、これら2つのSocketはデータを送受信するためのオブジェクトにすぎないため、 UDPプロトコル。クライアントとサーバーの概念JAVAは、データステップを送信するため
のUDPベースのソケットとしてDaragramSocketクラスを提供します。1。送信側でSocketオブジェクト(DatagranmSocket)を作成します。2。データを作成してデータをパックしますDategramPacket(byte [ ] buf、int length、InetAddress address、int port)3. DatagramSocketオブジェクトのメソッドを呼び出してデータを送信します:void send(DatagramSocket p); 4.送信者を閉じます:void close();データを受信する手順:1。受信者のSocketオブジェクト(DaragramSocket)を作成します:DatagramSocket(int port)2.データを受信するためのデータパケットを作成します:DatagramPacket(byte [] buf、int length)3. DatagramSocketオブジェクトのメソッドを呼び出してデータを受信します:void receive(DatagramPacket p)4.データパケットを解析し、コンソールにデータを表示します。byte [] getData(); int getLength(); 5.受信側を閉じます










2.2、UDP通信プログラムの実践

UDP送信データ:データはキーボード入力から取得され、入力データが886になるまで、送信データは終了します
UDP受信データ:受信者は送信者がいつ送信を停止するかわからないため、受信に無限ループを採用します

package UDP;

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.net.DatagramPacket;
import java.net.DatagramSocket;
import java.net.InetAddress;
import java.net.SocketException;

public class SendDemo {
    
    
	public static void main(String[] args) throws IOException {
    
    
		
		DatagramSocket ds = new DatagramSocket();
		
		System.out.println("输入:");
		BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
		String line;
		while((line = br.readLine()) != null) {
    
    
			if("886".equals(line)) {
    
    
				break;
			}
			
			byte[] bys = line.getBytes();
			DatagramPacket dp = new DatagramPacket(bys,bys.length,InetAddress.getByName("192.168.2.225"),12345);
			
			ds.send(dp);
		}
		
		ds.close();
		
	}
}
package UDP;

import java.io.IOException;
import java.net.DatagramPacket;
import java.net.DatagramSocket;
import java.net.SocketException;

public class ReveiveDemo {
    
    
	public static void main(String[] args) throws IOException {
    
    
		DatagramSocket ds = new DatagramSocket(12345);
		
		
		while(true) {
    
    
			
		
			byte[] bys=  new byte[1024];
			DatagramPacket dp = new DatagramPacket(bys,bys.length);
			
			ds.receive(dp);
			
			System.out.println("数据是:"+new String(dp.getData(),0,dp.getLength()));
			
			
		}
		
	}
}

3.TCP通信プログラム

3.1、TCP通信の原則

TCP通信プロトコルは信頼性の高いネットワークプロトコルであり、通信の両端にSocketオブジェクトを確立し、通信の両端にネットワーク仮想リンクを形成します。仮想ネットワークリンクが確立されると、両端のプログラムが通過できるようになります。通信用の仮想リンク。
Javaは、TCPプロトコルに基づいてネットワークに適切なカプセル化を提供します。これは、Socketオブジェクトを使用して両端の通信ポートを表し、ネットワーク通信用にSocketを介してIOストリームを生成します
。Javaは、クライアントにSocketクラスを提供し、データを送信するサーバー
ステップ:
1。クライアントのSocketオブジェクト(Socket)を作成します:Socket(String host、int port)
2.出力ストリームを取得し、データを書き込みます:OutputStream getOutputStream()
3.リソースを解放します:void close();
データを受信する手順:
1。サーバー側のSocketオブジェクト(ServerSocket)を作成します:ServerSocket(int port)
2.クライアント接続を監視し、Socketオブジェクトを返します:Socket accept();
3.入力ストリームを取得し、データを読み取ります、コンソールにデータを表示します:InputStream getInputStream()
4.リソースを解放します:void close();

3.2、TCPの場合

package TCP;

import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import java.net.Socket;
import java.net.UnknownHostException;

public class ClienDemo {
    
    
	public static void main(String[] args) throws UnknownHostException, IOException {
    
    
		
		//创建客户端的Socket对象
		Socket s = new Socket("192.168.2.225",10000);
		
		//获取输出流,写数据
		OutputStream os = s.getOutputStream();
		os.write("hello,我来了".getBytes());
		
		//接收服务器反馈
		InputStream is = s.getInputStream();
		byte[] bys = new byte[1024];
		int len = is.read(bys);
		String data = new String(bys,0,len);
		System.out.println("客户端:"+data);
		
		//释放资源
		s.close();
		
	}
}
package TCP;

import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import java.net.ServerSocket;
import java.net.Socket;

public class ServerDemo {
    
    
	public static void main(String[] args) throws IOException {
    
    
		
		//创建服务器端的Socket对象
		ServerSocket ss = new ServerSocket(10000);
		
		//监听客户端连接,返回一个Socket对象
		Socket s = ss.accept();
		
		//获取输入流,读数据,并把数据显示在控制台
		InputStream is = s.getInputStream();
		byte[] bys = new byte[1024];
		int len = is.read(bys);
		String data = new String(bys,0,len);
		System.out.println("服务器:"+data);
		
		//给出反馈
		OutputStream os = s.getOutputStream();
		os.write("数据已经收到".getBytes());
		
		//释放资源
		ss.close();
	}
}

おすすめ

転載: blog.csdn.net/weixin_45573296/article/details/123107569