ネットワークプログラミング
URL
URL:ユニフォームリソースロケータ
インターネットの三つの基礎:HTML HTTP URL
URLカテゴリ:
https://www.baidu.com
文字列のある、getPath()URLパスの一部を取得します。
文字列はGetHost()ホスト名のURL(該当する場合)。
int型のgetPort()URLのこのポート番号。
文字列getProtocol()プロトコル名のURL。
文字列getQuery()は、URLのクエリ部分を取得します。
文字列getRef()(「参照」とも呼ばれる)アンカーURLを取得します。
//简单爬虫
public class Demo01 {
public static void main(String[] args) throws IOException {
URL url=new URL("https://www.taobao.com");
System.out.println(url);
System.out.println("协议"+url.getProtocol());
System.out.println("端口"+url.getPort());
System.out.println("域名"+url.getHost());
System.out.println("查询内容"+url.getQuery());
System.out.println("锚点"+url.getRef());
//获取一个从url位置到程序的输入流
InputStream str=url.openStream();
//读取
byte[] car=new byte[1024];
int len=-1;
while((len=str.read(car))!=-1){
System.out.println(new String(car,0,len));
}
}
}
トランスポート層:
- TCP:大きなサイズを費やしセキュリティのコネクション指向の3ウェイハンドシェイクの低効率は制限しません
- UDP:シンプルで小さなオーバーヘッド高効率、安全でない非接続指向のプロトコルだけより60K以上の単なる送信サイズ制限を書きます
ソケット指向プログラミング
発信データ用の穴を開くために、アプリケーション層へのトランスポート層
UDP
UDPは、達成するためにソケット
- DatagramPacket:包装|データグラムパケット
- DatagramPacket(バイト[] BUF、INTオフセット、INT長さ、のSocketAddressアドレス)は、パケットデータの送信パケット長の構成パケット長が指定したオフセットioffsettoホスト指定されたポート番号。
- DatagramPacket(バイト[] BUF、int型の長さ)は、受信したパケットののDatagramPacket長の長さを構築します。
- DatagramSocketの:送信や受信機の定義
- DatagramSocketの(int型ポート)は、ローカルホスト上の指定されたポートにバインドされたデータグラムソケットを構築します。
DatagramSocketの(int型ポート、InetAddressのLADDR)が指定されたローカルアドレスにバインドされたデータグラムソケットを作成します。
UDP基本的なプロセス:
送信者
- 送信側のDatagramSocket(int型ポート)の定義
- 準データによると、
- 俵
- 送信無効送信(のDatagramPacket p)のソケットパケットからデータグラムを送信します。
- 近いです
注:スローガン統一契約書を下げることができない紛争
public class UDPSend02{
public static void main(String[] args) throws IOException {
System.out.println("-------------发送端----------------");
//1.定义发送端DatagramSocket(int port)
DatagramSocket client=new DatagramSocket(6666);
//2.准据数据
byte[] arr="海贼王-->香克斯".getBytes();
//3.打包
DatagramPacket packet=new DatagramPacket(arr, 0, arr.length,new InetSocketAddress("localhost",9999));
//4.发送
client.send(packet);
//5.关闭
client.close();
}
}
受信側
- 定義受信側のDatagramSocket(int型ポート)
- データを受信するためのパッキング
- 受信データは、ソケットからのデータグラムパケットを受信し(のDatagramPacket pを)受け取ります。
- 処理データバイト[]のgetData()int型のgetLength()
- 近いです
public class UDPReceive03 {
public static void main(String[] args) throws IOException {
System.out.println("-------------接收端----------------");
//1.定义接收端 DatagramSocket(int port)
DatagramSocket server=new DatagramSocket(9999);
//2.打包用来接收数据
byte[] arr=new byte[1024*60];
DatagramPacket packet=new DatagramPacket(arr, arr.length);
//3.接收数据 receive(DatagramPacket p) 从这个套接字接收数据报包。
server.receive(packet);
//4.处理数据
byte[] data=packet.getData();
int len=packet.getLength();
System.out.println(new String(data,0,len));
System.out.println(data.length);
System.out.println(len);
//5.关闭
server.close();
}
}
TCP
基本的なプロセスTCP:
クライアント
- 1. IPアドレスを指定で指定したポート番号にストリームソケットを作成するために、クライアントソケットソケット(InetAddressのアドレス、int型ポート)を定義します。
- 2.io操作のInputStream getInputStream()このソケットの入力ストリームを返します。
- 3.閉じます
import java.io.IOException;
import java.io.OutputStream;
import java.net.Socket;
import java.net.UnknownHostException;
public class TcpClient04 {
public static void main(String[] args) throws UnknownHostException, IOException {
System.out.println("------我是客户端-------");
//1.定义客户端
Socket client=new Socket("127.0.0.1",9999);
//2.IO操作
OutputStream os=client.getOutputStream();
os.write("今天是星期六".getBytes());
//3.刷出
os.flush();
//4.关闭
os.close();
client.close();
}
}
サーバー
- 1.定義サーバーサイドのServerSocket(int port)指定ポートにバインドされたサーバソケットを作成します。
- 2.ブロッキングリスニングは、(受け入れます)
- 3.io操作
- 4.データ処理
- 5.閉じます
import java.io.IOException;
import java.io.InputStream;
import java.net.ServerSocket;
import java.net.Socket;
public class TcpServer05 {
public static void main(String[] args) throws IOException {
System.out.println("------我是服务端-------");
//1.定义服务端 ServerSocket(int port) 创建一个服务器套接字绑定到指定端口。
ServerSocket server=new ServerSocket(9999);
//2.阻塞式监听 accept()
Socket socket=server.accept();
System.out.println("一个客户端连接成功了.....");
//3.io操作
InputStream is=socket.getInputStream();
byte[] arr=new byte[1024];
int len=is.read(arr);
//4.数据的处理
System.out.println(new String(arr,0,len));
//5.关闭
is.close();
socket.close();
server.close();
}
}
マルチユーザログイン
サーバー
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import java.net.ServerSocket;
import java.net.Socket;
import java.util.Arrays;
public class LoginServer10 {
public static void main(String[] args) throws IOException {
System.out.println("------我是服务端-------");
//1.定义服务端
ServerSocket server=new ServerSocket(9999);
boolean flag=true;
while(flag){
//2.阻塞式监听 accept()
Socket socket=server.accept();
System.out.println("一个客户端连接成功了.....");
//3.io操作
new Thread(new Channel(socket)).start();
}
server.close(); //死循环后面的代码无法执行
}
//静态内部类 管道 对每一个登录的用户执行的流程
static class Channel implements Runnable{
Socket socket ;
InputStream is;
OutputStream os;
public Channel(Socket socket) {
this.socket=socket;
try {
is = socket.getInputStream();
os=socket.getOutputStream();
} catch (IOException e) {
e.printStackTrace();
}
}
//读入
public String read(){
String str="";
byte[] arr=new byte[1024];
try {
int len=is.read(arr);
str=new String(arr,0,len);
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
return str;
}
//写出
public void write(String msg){
try {
os.write(msg.getBytes());
os.flush();
} catch (IOException e) {
e.printStackTrace();
}
}
@Override
public void run() {
//4.数据的处理
String data=read();
//处理方式2
String uname="";
String pwd="";
String[] str=data.split("&");
for(String s:str){
System.out.println(s);
String[] ss=s.split("=");
System.out.println(Arrays.toString(ss));;
if(ss[0].equals("name")){
uname = ss[1];
}else if(ss[0].equals("pwd")){
pwd= ss[1];
}
}
//判断
if(uname.equals("zhangsan")&&pwd.equals("123")){
write("登录成功");
}else{
write("登录失败");
}
close();
}
//关闭
public void close(){
//5.关闭
try { //alt+shift+z 一段代码一起添加到一个异常中
if(os!=null){
os.close();
}
if(is!=null){
is.close();
}
if(socket!=null){
socket.close();
}
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
}