Java Network Programming Foundation-トランスポート層プロトコルTCP&UDP

1.ネットワークプログラミングの基盤

1.ネットワークとネットワークカード

ネットワークは、現在の情報技術の最初の原動力です
。各コンピュータ機器には複数のネットワークカードがあります。
各ネットワークカードには、世界で一意のハードウェアアドレスとMACアドレスがあります。

2. IPアドレス:各ネットワークカード/マシンには1つ以上のIPアドレスがあります

IPV4:192.168.0.100、各セグメントは0〜255です
IPV6:128ビット長、8セグメントに分割、各セグメントは4つ
の16進数ですマシン予約済みIP:127.0.0.1
Windowsからipconfigクエリ、Linux/Macからifconfig

3.ポート、0-65535

0-1023、OSおよび占有、80はWeb、23はtelent 1024-65535
、一般的なプログラムを使用できます(競合に注意)
2台のマシン間の通信はIP +ポートで実行され、
Windows / Linux/Macが照会されますnetstat-anによる

4.パブリック(ワールドワイドウェブ/インターネット)およびイントラネット(LAN)

ネットワークは階層化されており
、最外層はパブリックネットワーク/インターネット
であり、その下の各層はイントラネット
IPアドレスです。
ネットワークの各層でtracertを使用して、現在のマシンとターゲットマシンのアクセスリレーを確認できます。

5.トランスポート層通信プロトコル

TCP(伝送制御プロトコル)
伝送制御プロトコル、コネクション型プロトコル
2台のマシン間の信頼性の高いエラーのないデータ伝送
双方向バイトストリーム伝送
UDP(ユーザーデータグラムプロトコル)
ユーザーデータグラムプロトコル、コネクションレスプロトコル
は信頼できるデータを保証しません伝送
速度は高速です、およびそれはまた貧弱なネットワーク環境で使用することができます

6.コンピュータ通信

データは1つのIPポート(送信者)から送信され、別のIPポート(受信者)に転送されます

2. UDP:コネクションレス型およびステートレス型の通信プロトコル

1.機能

送信者はメッセージを送信します。受信者が宛先にいる場合は受信できます。そうでない場合はメッセージが失われます。
送信者はメッセージが正常に送信されたかどうかを知ることができません。UDP
の利点は、シンプルさ、節約、と経済。

2.アイデア

DatagramSocketを介して通信を確立するデータパイプラインdsDatagramPacketを介し
てデータコンテナdpを確立するds
は、メッセージバイトコードとメッセージバイトコードの長さをDatagramPacketに渡します。 ")着信アドレスの送信メソッドは送信を実装し、受信メソッドは受信を実装します。受信者はイニシエーターの前に実行する必要があります



3.デモ:UdpRecv

import java.net.DatagramPacket;
import java.net.DatagramSocket;
import java.net.InetAddress;

public class UdpRecv {
    
    
    public static void main(String[] args) throws Exception
    {
    
    
        //定义管道为本机3000端口
        DatagramSocket ds=new DatagramSocket(3000);
        //定义字节数组存放信息
        byte [] buf=new byte[1024];
        //定义集装箱,用来封装信息
        DatagramPacket dp = new DatagramPacket(buf,1024);

        System.out.println("UdpRecv: 我在等待信息");
        //等待信息,如果有信息过来,则会封装在dp中
        //如果没有信息过来,则会造成阻塞
        ds.receive(dp);
        System.out.println("UdpRecv: 我接收到信息");
        
        //dp.getAddress().getHostAddress()方法获取IP
        //dp.getPort()方法获取Port
        String strRecv=new String(dp.getData()) +
                " from " + dp.getAddress().getHostAddress()+":"+dp.getPort();
        //打印信息和信息的来源地址
        System.out.println(strRecv);

        //线程暂停1s
        Thread.sleep(1000);
        
        //设置将要发送的信息
        String str="hello yh";
        //定义集装箱,装入dp内容和长度并且贴了目的地
        //目的地为127.0.0.1:3000
        //str.getBytes()方法把str类型转化为byte类型
        //str.length()
        //地址标签:目的地IP+Port
        DatagramPacket dp2=new DatagramPacket(str.getBytes(),str.length(),
                InetAddress.getByName("127.0.0.1"),dp.getPort());
        
        System.out.println("UdpRecv: 我要发送信息");
        //发送信息
        ds.send(dp2);
        System.out.println("UdpRecv: 我发送信息结束");
        
        //关闭管道
        ds.close();
    }
}

4.デモ:UdpSend

import java.net.DatagramPacket;
import java.net.DatagramSocket;
import java.net.InetAddress;
import java.nio.charset.StandardCharsets;

public class UdpSend {
    
    
    public static void main(String [] args) throws Exception
    {
    
    
        //DatagramSocket:通讯的数据管道
        //定义管道
        DatagramSocket ds = new DatagramSocket();
        //定义将要发送的信息
        String str = "hello henrik";
        //定义集装箱,装入dp内容和长度并且贴了目的地
        //目的地为127.0.0.1:3000
        //str.getBytes()方法把str类型转化为byte类型
        //str.length()
        //地址标签:目的地IP+Port
        DatagramPacket dp = new DatagramPacket(str.getBytes(),str.length(),
                InetAddress.getByName("127.0.0.1"),3000);

        System.out.println("UdpSend: 我要发送信息");
        //发送信息
        ds.send(dp);
        System.out.println("UdpSend: 我发送信息结束");

        //进程暂停1s
        Thread.sleep(1000);

        //定义字节数组存放信息
        byte [] buf=new byte[1024];
        //定义集装箱用来封装信息
        DatagramPacket dp2 = new DatagramPacket(buf,1024);

        System.out.println("UdpSend: 我在等待信息");
        ds.receive(dp2);
        System.out.println("UdpSend: 我接收到信息");

        //dp.getAddress().getHostAddress()方法获取IP
        //dp.getPort()方法获取Port
        String str2 = new String(dp2.getData()) +
                " from " + dp2.getAddress().getHostAddress()+":"+dp2.getPort();
        //打印信息和信息的来源地址
        System.out.println(str2);

        //关闭管道
        ds.close();
    }
}

5.効果
ここに画像の説明を挿入
ここに画像の説明を挿入

3. TCP:信頼できる通信プロトコルを確保するための接続があります

1.アイデア

サーバーはServerSocketを作成し、接続を待機し
ますクライアントはソケットを作成
し、サーバーに接続されたServerSocketは接続を受信し、ソケットを作成してクライアントのソケットとの専用接続を確立し、サーバーとクライアント間のその後のダイアログ(このソケットのペア)は別のスレッド(サーバー)で実行され、
サーバーのServerSocketは接続を待機し続けます

2.機能

サーバーが応答を待機するとき、サーバーはブロッキング状態になります。
サーバーは同時に複数のクライアントに応答できます。サーバーがクライアント
を受け入れるたびに、サーバーはそれに対応する独立したスレッドを開始します
。クライアントとサーバーの両方ソケットのペアのチャネルを閉じることを選択できます
ServerSocketサーバーのポートとして、ポートをバインドする必要があります。複数のネットワークカードがある場合は
、トランスポートチャネルとしてIPアドレスSocketをバインドする必要があります。クライアントはデータを書き込みます。ソケット入力ストリームに送信し、サーバーに送信し、ソケット出力ストリームからサーバーを取得します。データ、サーバー側、およびその逆

3.デモ:TcpServer


import java.net.*;
import java.io.*;
import java.nio.charset.StandardCharsets;

public class TcpServer
{
    
    
	public static void main(String [] args) 
	{
    
    
		try{
    
    
			//驻守在8001端口
			ServerSocket ss = new ServerSocket(8001);
			//等待客户端连接
			Socket s = ss.accept();
			//阻塞提示
			System.out.println("welcome to the java world");
			//有人连接上打开输入流
			InputStream ips = s.getInputStream();
			//打开输出流
			OutputStream ops = s.getOutputStream();
			//同一个通道,服务端的输出流输入流就是客户端的输出流输入流

			//输出一句话给客户端
			ops.write("hello client".getBytes());


			//从客户端读取一句话
			BufferedReader br = new BufferedReader(new InputStreamReader(ips));
			System.out.println("client said:"+br.readLine());



			//关闭各对象
			ips.close();
			ops.close();
			s.close();
			ss.close();
		} catch (IOException exception) {
    
    
			exception.printStackTrace();
		}
	}
}

4.デモ:TcpClient

import java.net.*;
import java.io.*;

public class TcpClient {
    
    
	public static void main(String[] args) {
    
    
		try {
    
    
			//用地址标签创建通道,这里需要服务端先开启
			Socket s = new Socket(InetAddress.getByName("127.0.0.1"), 8001);

			//同一个通道,服务端的输出流就是客户端的输入流;服务端的输入流就是客户端的输出流
			//开启通道的输入流
			InputStream ips = s.getInputStream();
			BufferedReader brNet = new BufferedReader(new InputStreamReader(ips));

			//开启通道的输出流
			OutputStream ops = s.getOutputStream();
			//包装输出流
			DataOutputStream dos = new DataOutputStream(ops);

			//键盘录入信息
			//System.in是一个位流,InputStreamReader转换为字符流,然后再使用BufferedReader为其增加缓冲功能
			BufferedReader brKey = new BufferedReader(new InputStreamReader(System.in));
			while (true)
			{
    
    
				String strWord = brKey.readLine();
				//判断是否为换行,换行则表示结束
				if (strWord.equalsIgnoreCase("quit"))
				{
    
    
					break;
				}
				else
				{
    
    
					System.out.println("I want to send: " + strWord);
					//System.getProperty("line.separator")获取操作系统对应的换行符
					dos.writeBytes(strWord + System.getProperty("line.separator"));
					System.out.println("Server said: " + brNet.readLine());
				}

			}

			//关闭对象
			dos.close();
			brNet.close();
			brKey.close();
			s.close();
		} catch (Exception e) {
    
    
			e.printStackTrace();
		}
	}
}

5.効果
ここに画像の説明を挿入
ここに画像の説明を挿入

おすすめ

転載: blog.csdn.net/qq_50216270/article/details/117298960