ゼロベースのJava研究ノート(10)

Javaネットワークプログラミング

コンピュータネットワークTCP / UDP B / SC / S httpプロトコル

基本的な概念

通信プロトコル:レート、伝送コード、コード構造、伝送制御ステップ、エラー制御などの標準を策定します。

通信インターフェース:2つのノード間の対話の場合、通信ツールまたはインターフェースをノード間に確立して、ノード間の情報交換を可能にする必要があります。インターフェイスにはハードウェアデバイスとソフトウェアデバイスが含まれます

ネットワークの階層化:OSIオープンシステムは、参照モデルTCP / IP伝送制御/インターネットプロトコルを相互接続できます

ここに画像の説明を挿入

データのカプセル化

ここに画像の説明を挿入

データの解凍

ここに画像の説明を挿入

IP

InetAddress:

1.getLocalHost:ローカル

2.getByName:ドメイン名に基づくDNS | IPアドレス

コード例

package cn.chenye.loc;

import java.net.InetAddress;
import java.net.UnknownHostException;

/**
 * IP地址测试:定位一个节点 :计算机 路由 通信设备
 * @author ASUS
 *
 */
public class IPTest {
	public static void main(String[] args) throws UnknownHostException {
		InetAddress addr = null;
		try {
			addr = InetAddress.getLocalHost();//创建对象 即本机
		} catch (UnknownHostException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
		System.out.println(addr.getHostAddress());//返回本机IP
		System.out.println(addr.getHostName());//输出计算机名
		
		//根据域名获取InetAddress对象
		addr=InetAddress.getByName("www.csdn.blog.com");
		System.out.println(addr.getHostAddress());//返回本机IP
		System.out.println(addr.getHostName());//输出计算机名
	}

}

ポート

16ビットの2進整数、0〜65535のコマンドコマンドnetstat -anoでローカルポートを表示

  • 8080–》 tomcat
  • 1521–》 oracle
  • 3306–》 mySQL

ここに画像の説明を挿入

package cn.chenye.loc;
import java.net.InetSocketAddress;
/**
 * 端口
 * @author ASUS
 *
 */
public class PortTest {

	public static void main(String[] args) {
		//包含端口
		InetSocketAddress socketAddress=new InetSocketAddress("127.0.0.1",8080);
		InetSocketAddress socketAddress2=new InetSocketAddress("localhost",9000);
		System.out.println(socketAddress.getHostName());
		System.out.println(socketAddress2.getAddress());
		System.out.println(socketAddress2.getHostString());
	}
}

URL

URI:URL + URN Uniform Resource Identifier Uniform Resource Locator Uniform Resource Name

ここに画像の説明を挿入

package cn.chenye.loc;

import java.net.MalformedURLException;
import java.net.URL;

public class URLTest {

	public static void main(String[] args) throws MalformedURLException {
		URL url=new URL("https://blog.csdn.net/qq_43721475/article/details/104281412");
		System.out.println("协议"+url.getProtocol());
		System.out.println("域名|ip"+url.getHost());
		System.out.println("请求资源"+url.getFile());
		System.out.println("请求资源"+url.getPath());
		System.out.println("端口"+url.getPort());
		//参数
		System.out.println(url.getQuery());
		//锚点
		System.out.println(url.getRef());
	}
}

爬虫類の原理

  1. URLを取得
  2. リソースをダウンロード
  3. データを分析する
  4. データの処理、ストレージのクリーニングなど

例1 Jingdong Webサイトのソースコードをクロールする

package cn.chenye.loc;

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.net.MalformedURLException;
import java.net.URL;

/**
 * Spider 
 * @author ASUS
 *
 */
public class SpiderTest {

	public static void main(String[] args) throws IOException {
		//1. 获取URL
		URL u=new URL("https://www.jd.com");
		//URL u=new URL("https://www.dianping.com");
		//2. 下载资源
		InputStream is=u.openStream();
		BufferedReader br=new BufferedReader(new InputStreamReader(is,"UTF-8"));
		String msg=null;
		while(null!=(msg=br.readLine())) {
			System.out.println(msg);
		}
		br.close();
		//3. 分析数据
		//4. 处理数据 清理 存储等
	}
}

しかし、この方法でパブリックコメントをクロールしようとして、許可なしにエラー403を見つけた場合、ここに別の方法があります

package cn.chenye.loc;

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.net.HttpURLConnection;
import java.net.MalformedURLException;
import java.net.URL;

/**
 * Spider 
 * @author ASUS
 *
 */
public class SpiderTest2 {

	public static void main(String[] args) throws IOException {
		//1. 获取URL
		//URL u=new URL("https://www.jd.com");
		URL u=new URL("https://www.dianping.com");
		//2. 下载资源
		HttpURLConnection con=(HttpURLConnection)u.openConnection();
		//模拟浏览器的GET请求
		con.setRequestMethod("GET");
		con.setRequestProperty("User-Agent"," Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/65.0.3314.0 Safari/537.36 SE 2.X MetaSr 1.0");
		BufferedReader br=new BufferedReader(new InputStreamReader(con.getInputStream(),"UTF-8"));
		String msg=null;
		while(null!=(msg=br.readLine())) {
			System.out.println(msg);
		}
		br.close();
		//3. 分析数据
		//4. 处理数据 清理 存储等
	}
}

https://www.dianping.comを開き、f12コンソールを開き、ネットワークのユーザーエージェントを確認します。

ここに画像の説明を挿入

伝送プロトコル

TCPプロトコル(伝送制御プロトコル)機能:

1.接続指向のトランスポート層プロトコル、より多くのシステムリソースと低い効率を使用

2.ポイントツーポイント通信、各TCP接続は2つのエンドポイントしか持つことができず、1対1のみにすることができます

3. TCPは、信頼性の高い配信サービスを提供します

4. TCPは全二重通信を提供します

5.指向バイトストリーム

UDPプロトコル:User Datagram Protocolの略で、コネクションレス型のプロトコルです。各データグラムは独立したメッセージであり、完全な送信元または宛先アドレスを含み、可能なパスによってネットワーク上の宛先に送信されます。したがって、常に宛先に到達することができ、宛先への到達時間とコンテンツの正確性は保証されません。送信される各データパケットは64kに制限する必要があります。

  1. 接続指向ではないため、伝送は信頼できず、失われる可能性があります
  2. 反対側が準備ができているかどうかに関係なく、受信機はそれを確認しません
  3. 放送できます
  4. オーバーヘッドの少ない非常にシンプルなプロトコル

ソケットソケット

アプリケーション層とトランスポート層の間では、ソケットは分離に使用されます

ここに画像の説明を挿入

UDPプログラミング

UDPプロトコルに基づくソケットネットワークプログラミングを使用して、データ送信を達成するためにIOストリームを使用する必要はありません。各データ送信ユニットはデータパケットにパッケージ化され、送信者はデータパケットをネットワークに送信し、データパケットはネットワークに送信されます彼の目的地を見つける

データ送信

package cn.chenye.loc;

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

/**
 * 发送
 * 1.使用DatagramSocket 指定端口 创建发送端
 * 2.准备容器 一定转成字节数组
 * 3.封装成DatagramSocket包裹 需要指定目的地
 * 4.发送包裹send
 * 5.释放资源
 * @author ASUS
 *
 */
public class UDPClient {

	public static void main(String[] args) throws Exception {
		System.out.println("发送方启动中。。。。");
		//1.使用DatagramSocket 指定端口 创建发送端
		DatagramSocket client=new DatagramSocket(8880);
		 // 2.准备容器 一定转成字节数组
		String data="chenye handsome";
		byte[] datas=data.getBytes();
		 //3.封装成DatagramSocket包裹 需要指定目的地
		DatagramPacket packet=new DatagramPacket(datas,0,datas.length,
				new InetSocketAddress("localhost",6666));
		 // 4.发送包裹send
		client.send(packet);
		// 5.释放资源
		client.close();
	}
}

データ受信

package cn.chenye.loc;

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

/**
 * 接收
 * 1.使用DatagramSocket 指定端口 创建接收端
 * 2.准备容器 封装成DatagramSocket 包裹
 * 3.阻塞式接收包裹receive
 * 4.分析数据
 * byte[] getData() getLength()
 * 5.释放资源
 * @author ASUS
 *
 */
//出错原因:同一个协议下,端口不允许重复
public class UDPServer {
	public static void main(String[] args) throws Exception {
		System.out.println("接收方启动中。。。。");
		//1.使用DatagramSocket 指定端口 创建接收端
		DatagramSocket serve=new DatagramSocket(6666);
		 //* 2.准备容器 封装成DatagramSocket 包裹
		byte[] container=new byte[1024*60];
		DatagramPacket packet= new DatagramPacket(container,0,container.length);
		 //* 3.阻塞式接收包裹receive
		serve.receive(packet);
		 //* 4.分析数据
		byte[] datas=packet.getData();
		int len=packet.getLength();
		System.out.println(new String(datas,0,len));
		 //* byte[] getData() getLength()
		 //* 5.释放资源
		serve.close();
	}

}

//エラーの原因:同じプロトコルでは、ポートの繰り返しは許可されていません

ここに画像の説明を挿入
ポートを変更した後、ポートが占有されていないことを確認してください
ここに画像の説明を挿入

TCPプログラミング

例:チャットルームプログラム

こちらがポータルです

元の記事を38件公開 11 件を獲得 3847件を表示

おすすめ

転載: blog.csdn.net/qq_43721475/article/details/104335193