Javaのネットワークプログラミングの強調必見

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

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基本的なプロセス:
送信者
  1. 送信側のDatagramSocket(int型ポート)の定義
  2. 準データによると、
  3. 送信無効送信(のDatagramPacket p)のソケットパケットからデータグラムを送信します。
  4. 近いです

注:スローガン統一契約書を下げることができない紛争

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();
	}
}
受信側
  1. 定義受信側のDatagramSocket(int型ポート)
  2. データを受信するためのパッキング
  3. 受信データは、ソケットからのデータグラムパケットを受信し(のDatagramPacket pを)受け取ります。
  4. 処理データバイト[]のgetData()int型のgetLength()
  5. 近いです
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();
			}
		}
	}
}
公開された13元の記事 ウォン称賛13 ビュー500

おすすめ

転載: blog.csdn.net/Rabbit_white_/article/details/104060925