1.コンピュータネットワークプログラミング
1.ネットワークプログラミングを学ぶ理由
①ローカルディスクにhtmlファイルを書き込みます。これはブラウザから開いてアクセスできます。
②、他の人のソフトウェア/ファイル/ウェブサイトにアクセス->プロトコル+アドレス(ip)+ポート
③、ウェブサーバーを開きます
2.インターネットの認識
ネットワークは、ローカルエリアネットワーク、ワイドエリアネットワーク(ワールドワイドウェブ)に分かれています。
IP:ipは、同じネットワークでの一意の識別子です。DOSウィンドウで確認できますipconfig
。同時にping 域名
、このドメイン名に対応するIPはDOSで確認できます。
IPの分類:
カテゴリーA:政府機関に任せた
カテゴリーB:中小企業
カテゴリーC:それを必要とする人
クラスD:マルチキャストに使用
タイプE:実験用
現在、ipv4が主に使用されており、ipv6は実験段階にあり、一部の実験機関では、128ビット、8セグメントに分割され、0000からFFFFまでの16進値が使用されています。
JavaでIPを取得する方法: InetAddress
@Test
public void testGetIP() throws Exception {
// 返回本地主机名与IP。
InetAddress localHost = InetAddress.getLocalHost();
System.out.println(localHost);
// 返回本地主机名与IP。
InetAddress byName = localHost.getByName("LAPTOP-QJN7NLRN");
System.out.println(byName);
//仅获取当前InetAddress对象的ip
System.out.println(localHost.getHostAddress());
//获取淘宝的ip信息
InetAddress byName2 = InetAddress.getByName("taobao.com");
System.out.println(byName2);
System.out.println("淘宝网的ip是:"+byName2.getHostAddress());
}
3.ポート
ポート番号は、異なるアプリケーションを区別するために使用されます。同じコンピューター上の2つのプログラムが同じポートを使用できず、競合が発生します。コンピューターのポート番号の範囲は0〜65535で、そのうち0〜1023はシステムによって予約されています。
コンピュータにアクセスするために、ポート番号を入力しない場合、デフォルトでポート80が検出されます。
mysqlポート番号:3306
Tomcatポート番号:8080
4、URL和URI
URL:Uniform Resource Locator(プロトコル:// ip:port / resource path)
例 : http://127.0.0.1:8080/class_info/java_jichu.html
URI:Uniform Resource Path
/class_info/java_jichu.html
演習:URLツールを使用してWebサイトの情報をクロールします
アイデア:
①。まずアドレスからURLオブジェクトを取得し、ウェブサイトを探す
②入力ストリームを取得し、Webページ情報を読み取ります
③。出力ストリームを作成し、ファイル出力ストリームを使用して、ファイルに直接書き込みます
④。入力ストリームの内容を出力ストリームに書き込みます。これは、IOUtilsのcopyメソッドを使用して、commons-ioパッケージをガイドするためのものです。
⑤、関劉
//获取网站需要用到URL类:
URL url = new URL("https://douban.com/");
//获取输入流
InputStream in = url.openStream();
//创建接收的文件输出流,作为抓取后的文件输出存放
FileOutputStream out = new FileOutputStream("文件存放地址.html");
//传递到输出流中
IOUtils.copy(in, out);
//关流
out.close();
in.close();
}
5.UDPとTCP
どちらもトランスポート層プロトコルであり、ネットワーク通信はそれらを介して行われます。
TCP:信頼性の高い伝送プロトコル、低パフォーマンス、マルチユース、アップロードとダウンロード、およびセキュリティを考慮する必要のあるその他の機能(3つのハンドシェイク、4つの手の波)
UDP:信頼性の低い伝送プロトコル、高性能、それまでにパケットを失いやすいため、主にゲームやチャットなどに使用されます。
6.ソケットプログラミング
Socketは、socket(socketは2台のマシン間の通信のエンドポイント)として変換されるプロトコルであり、socketプログラミングはjavaでサポートされ、Socket(クライアントソケットの実装)とSeverSocker(実装サービス)が提供されます。Endsocket)
アイデア:
サーバー側コード
public class ServerTest {
// 先定义serversocket对象
private ServerSocket ss = null;
// 创建构造器,在创建服务器端对象的时候,要将服务器端启动
public ServerTest() throws Exception {
System.out.println("服务器已经准备就绪");
// 给定一个端口号,作为监听对象,只要有人调用这个端口,就是需要启动服务器
ss = new ServerSocket(8989);
System.out.println("服务端已上线");
}
// 创建服务器
public void start() throws Exception {
// 需要一直处于等待状态,等待客户端,同时获取socket对象
Socket socket = ss.accept();
// 因为数据存在socket中,需要从中获取输入流
InputStream in = socket.getInputStream();
// 将输入流进行包装,方便读取,包装进reader
InputStreamReader is = new InputStreamReader(in,"UTF-8");
// 再包装进BufferedRader,可以读取一行
BufferedReader bufferedReader = new BufferedReader(is);
// 现在可以按行读取数据
String str = bufferedReader.readLine();
// 打印从客户端获取的内容
System.out.println(str);
}
// 需要main方法把客户端运行起来
public static void main(String[] args) throws Exception {
ServerTest se = new ServerTest();
se.start();
}
}
クライアントコード
public class ClientTest {
//先声明客户端socket
private Socket so = null;
//创建构造器,在创建客户对象的时候,客户端就要启动
public ClientTest() throws Exception{
//需要传入两个参数,分别是IP,和端口号
so = new Socket("127.0.0.1",8989);
}
//客户端执行功能
public void start() throws Exception{
//首先从socket中拿到输出流
OutputStream out = so.getOutputStream();
//包装进writer方便输出
OutputStreamWriter writer = new OutputStreamWriter(out,"UTF-8");
//这里有两种方式,可以直接输出(注意换行,因为服务端是按行读取),然后刷新flush,就可以输出了;
//也可以再次进行包装,包装进PrintWriter【打印流】,要注意第二个参数是是否自动刷新
PrintWriter printWriter = new PrintWriter(writer,true);
//可以输出换行加刷新
printWriter.println("嗨!你听到了吗!我再叫你!");
}
//需要main方法将客户端运行起来
public static void main(String[] args) throws Exception {
ClientTest client = new ClientTest();
client.start();
}
}
2、HTTPプロトコル
TCP / IPプロトコルは、主にネットワークでのデータの送信方法を解決するトランスポート層プロトコルであり、HTTPは、主にデータのパッケージ化方法を解決するアプリケーション層プロトコルです。(クロスサーバーブラウザを実現する)
注:ブラウザーは、要求としてデータをサーバーに送信します。ブラウザへのサーバーフィードバックデータは応答(応答)です。
1.リクエストヘッダー
2.応答ヘッダー
3.一般的な応答コード
200:正常に処理されました
404:要求されたリソースが見つかりません
500:サーバーコードが異常です
3つのカスタムWebサーバー
public class Webserver {
private ServerSocket ss = null;
public Webserver() throws Exception {
ss = new ServerSocket(8888);
}
public void start() throws Exception {
System.out.println("准备中...");
// 等待且获取socket对象
Socket socket = ss.accept();
//可以获取当前访问这IP
System.out.println(socket.getLocalAddress().getHostAddress());
// 获取socket中的输入流
System.out.println("进入!");
// 现在需要读取一个html文件作为返回,使用文件输入流
FileInputStream fileInputStream = new FileInputStream(
"本地地址.html");
// 读取文件输入流中的内容
InputStreamReader inputStreamReader = new InputStreamReader(fileInputStream, "UTF-8");
// 再次包装,还是使用bufferedreader
BufferedReader reader = new BufferedReader(inputStreamReader);
// String readLine = reader.readLine();
// 现在已经有了输入流,需要进行输出,浏览器已经获取到socket了,所以直接获取输出流
OutputStream out = socket.getOutputStream();
// 现在进行包装
OutputStreamWriter outputStreamWriter = new OutputStreamWriter(out, "UTF-8");
// 再次包装进打印流,printwriter
PrintWriter writer = new PrintWriter(outputStreamWriter, true);
/**
* 非常关键的代码,需要告诉浏览器,我是HTTP响应
*/
writer.println("HTTP/1.1 200 OK"); // 成功响应
writer.println("Content-Type: text/html;charset=utf-8");// 响应类型与编码
writer.println();
// 一行一行的读取数据
String readLine = "";
while ((readLine = reader.readLine()) != null) {
writer.println(readLine);
}
// 关流
outputStreamWriter.close();
inputStreamReader.close();
}
public static void main(String[] args) throws Exception {
Webserver webserver = new Webserver();
// 需要一直接收请求
while (true) {
webserver.start();
}
}
}