一、网络编程

系列文章目录




前言

网络、端口、URL、TCP、UDP


一、网络编程概念

1.1、网络:将不同区域的计算机连接到一起 局域网 城域网 互联网

计算机网络是指将地理位置不同的具有独立功能的多台计算机及其外部设备,通过通信线路连接起来,在网络操作系统,网络管理软件及网络通信协议的管理和协调下,实现资源共享和信息传递的计算机系统。

1.2、地址:IP地址 确定网络上 一个绝对地址 |位置 —>房子的地址

用来标志网络中的一个通信实体的地址。通信实体可以是计算机,路由器等。

1.3、端口号: 区分计算机软件的 -->房子的房门 2个字节 0-65535 共65536个

1、在同一个协议下 端口号不能重复 不同协议下可以重复
2、1024以下的不要使用 80-->http 21 -->ftp
  (1)、IP地址用来标志一台计算机,但是一台计算机上可能提供多种应用程序,使用端口来区分这些应用程序。
  (2)、端口是虚拟的概念,并不是说在主机上真的有若干个端口。通过端口,可以在一个主机上运行多个网络应用程序。
  (3)、端口范围0---65535,16位整数

1.4、资源定位: URL 统一资源定位符 URI :统一资源

1、协议: Tcp 和UDP协议
  1)、TCP(transfer control protocol): 电话 类似于三次握手 面向连接 安全可靠 效率低下
  一种面向连接(连接导向)的、可靠的、基于字节流的运输层(Transport layer)通信协议 。
  特点
    • 面向连接
    • 点到点的通信
    • 高可靠性:三次握手
    • 占用系统资源多、效率低
  生活案例
    • 打电话
  应用案例:
    • HTTP FTP TELNET SMTP
  2)、UDP(UserDatagramProtocol ): 短信 非面向连接 效率高
  一种无连接的传输层协议,提供面向事务的简单不可靠信息传送服务
   特点:
    • 非面向连接,传输不可靠,可能丢失
    • 发送不管对方是否准备好,接收方收到也不确认
    • 可以广播发送
    • 非常简单的协议,开销小
  生活案例:
    • 发送短信 发电报
  应用案例:
    • DNS SNMP
2、传输:
  1)、先封装
  2)、后拆封

1.5、数据的传输

(1)、URL(Uniform Resource Locator)
  • 统一资源定位符,由4部分组成:协议 、存放资源的主机域名、端口号和资源文件名。
(2)、URL是指向互联网“资源”的指针。
  • 资源可以是简单的文件或目录,也可以是对更为复杂的对象的引用,例如对数据库或搜索引擎的查询。

重要类

1、InetAddress InetSocketAddress
2、URL
3、TCP: ServerSocket Socket
4、UDP: DatagramSocket DatagramPacket

二、InetAddress类 & InetSocketAddress类

2.1、InetAddress :封装 IP 及 DNS

方法摘要
static InetAddress getByName(String host)
在给定主机名的情况下确定主机的 IP 地址。
static InetAddress getLocalHost() 返回本地主机。
String getHostAddress() 返回ip地址
返回 IP 地址字符串(以文本表现形式)。
String getHostName() 返回域名本机为计算机名
获取此 IP 地址的主机名。

2.2、InetSocketAddress:封装端口

构造方法摘要
InetSocketAddress(InetAddress addr, int port)
根据 IP 地址和端口号创建套接字地址。
InetSocketAddress(int port)
创建套接字地址,其中 IP 地址为通配符地址,端口号为指定值。
InetSocketAddress(String hostname, int port)
方法摘要方法说明
InetAddress getAddress()获取 InetAddress。
String getHostName()获取 hostname。
int getPort()获取端口号。

三、URL、爬虫原理

(Uniform resource identifier) URI:统一资源标识符,用来唯一的标识一个资源。 (Uniform
Resource Locator) URL:统一资源定位器,它是一种具体的URI 四部分组成:
协议、存放资源的主机域名、端口、资源文件名(/)

3.1、创建

URL(String spec)  :绝对路径构建
URL(URL context, String spec)  :相对路径构建

3.2、方法

    URL url=new URL("http://baidu.com:80/index.html");
	System.out.println("协议:"+url.getProtocol());
	System.out.println("域名:"+url.getHost());
	System.out.println("端口:"+url.getPort());
	System.out.println("资源:"+url.getFile());
	System.out.println("相对路径:"+url.getPath());
	System.out.println("锚点:"+url.getRef()); //锚点
	System.out.println("参数:"+url.getQuery());//?参数 :存在锚点  返回null ,不存在,返回正确

3.3、流

InputStream
openStream() 打开到此 URL 的连接并返回一个用于从该连接读入的 InputStream。

四、UDP通信

UDP:以数据为中心 非面向连接 不安全 数据可能丢失 效率高
  DatagramSocket:用于发送或接收数据包
  DatagramPacket:数据包

4.1、类 DatagramSocket、DatagramPacket

1、客户端:
  1)、创建客户端 DatagramSocket 类 +指定端口
  2)、准备数据 字节数组
  3)、打包 DatagramPacket +服务器地址 及端口
  4)、发送
  5)、释放资源

/**
 * 客户端
 * 1、创建客户端 +端口
 * 2、准备数据   double -->字节数组   字节数组输出流
 * 3、打包(发送的地点 及端口)
 * 4、发送
 * 5、释放
 */
public class Client {
 
	public static void main(String[] args) throws IOException {
		//1、创建客户端 +端口
		DatagramSocket client = new DatagramSocket(6666);
		//2、准备数据
		double num =89.12;
		byte[] data =convert(num);
		//3、打包(发送的地点 及端口) DatagramPacket(byte[] buf, int length, InetAddress address, int port)
		DatagramPacket packet = new DatagramPacket(data,data.length,new InetSocketAddress("localhost",8888));
		//4、发送
		client.send(packet);
		//5、释放
		client.close();
	}
	/**
	 * 字节数组 数据源  +Data 输出流
	 */
	public static byte[] convert(double num) throws IOException{
		byte[] data =null;
		ByteArrayOutputStream bos = new ByteArrayOutputStream();
		DataOutputStream dos =new DataOutputStream(bos);
		dos.writeDouble(num);
		dos.flush();
		//获取数据
		data = bos.toByteArray();
		dos.close();        
		return data;
	}
}

2、服务器端:
  1)、创建 服务端 DatagramSocket 类 +指定端口
   2)、准备接受容器 字节数组 封装 DatagramPacket
  3)、包 接受数据
  4)、分析
   5)、释放资源

/**
 * 服务端
 * 1、创建服务端 +端口
 * 2、准备接受容器
 * 3、封装成 包
 * 4、接受数据
 * 5、分析数据 字节数组-->double
 * 6、释放
 */
public class Server {
 
	public static void main(String[] args) throws IOException {
		//1、创建服务端 +端口
		DatagramSocket server = new DatagramSocket(8888);
		//2、准备接受容器
		byte[] container = new byte[1024];
		//3、封装成 包 DatagramPacket(byte[] buf, int length)         
		DatagramPacket packet =new DatagramPacket(container, container.length) ;
		//4、接受数据
		server.receive(packet);
		//5、分析数据
		double data =convert(packet.getData());
		System.out.println(data);
		//6、释放
		server.close();
	}
	/**
	 * 字节数组 +Data 输入流
	 */
	public static double convert(byte[] data) throws IOException{
		DataInputStream dis =new DataInputStream(new ByteArrayInputStream(data));
		double num =dis.readDouble();
		dis.close();
		return num;
	}
}

五、套接字Socket

基于tcp: 面向连接 安全 可靠 效率低 ,类似于打电话

5.1、面向连接: 请求-相应 Request --Response

5.2、Socket编程

(1)、服务器: ServerSocket
作用:此类实现服务器套接字。服务器套接字等待请求通过网络传入。它基于该请求执行某些操作,然后可能向请求者返回结果。

构造方法摘要
ServerSocket()       创建非绑定服务器套接字。
ServerSocket(int port)             创建绑定到特定端口的服务器套接字。
ServerSocket(int port, int backlog) 利用指定的 backlog         创建服务器套接字并将其绑定到指定的本地端口号。
ServerSocket(int port, int backlog, InetAddress bindAddr)     使用指定的端口、侦听 backlog 和要绑定到的本地 IP 地址创建服务器。

方法摘要
 Socket	accept()                         侦听并接受到此套接字的连接。
 void	bind(SocketAddress endpoint)     将 ServerSocket 绑定到特定地址(IP 地址和端口号)。
 void	bind(SocketAddress endpoint, int backlog)        将 ServerSocket 绑定到特定地址(IP 地址和端口号)。
 void	close()                         关闭此套接字。

(2)、客户端: Socket

	构造方法摘要
 	Socket()      通过系统默认类型的 SocketImpl 创建未连接套接字
 	Socket(InetAddress address, int port)   创建一个流套接字并将其连接到指定 IP 地址的指定端口号。
 	Socket(InetAddress address, int port, InetAddress localAddr, int localPort) 创建一个套接字并将其连接到指定远程地址上的指定远程端口。
 	Socket(Proxy proxy)                  创建一个未连接的套接字并指定代理类型(如果有),该代理不管其他设置如何都应被使用。
protected 	Socket(SocketImpl impl)      使用用户指定的 SocketImpl 创建一个未连接 Socket。
 	Socket(String host, int port)        创建一个流套接字并将其连接到指定主机上的指定端口号。
 	Socket(String host, int port, InetAddress localAddr, int localPort) 

5.3、TCP通信原理(详细步骤):

• 服务器创建ServerSocket,在指定端口监听并并处理请求
• 客户端创建Socket,向服务器发送请求

网络登录功能总结:

• 服务器创建ServerSocket,在指定端口监听并并处理请求
• 客户端创建Socket,向服务器发送请求

网络登录功能总结:
• 服务器创建ServerSocket,在指定端口监听并并处理请求;
• ServletSocket通过accept() 接收用户请求并返回对应的Socket,否则一种处于监听等待状态,线程也被阻塞
• 客户端创建Socket,需要指定服务器的ip和端口号,向服务器发送和接收响应
• 客户端发送数据需要输出流(写),客户端获取反馈数据需要输入流(读)
• 服务端反馈数据需要输出流(写),服务端获取请求数据需要输入流(读)
• 一旦使用ServerSocket和Socket建立了网络连接后,网络通信和普通IO流操作并没有太大区别
• 网络通信输出流建议使用DataOutputStream和ObjectOutputStream,与平台无关,输入流相应使用DataIntputStream和ObjectInputStream
• 如果是字符串通信也可以使用BufferedReader和PrintWriter,简单方便

5.4、TCP 服务端/客户端

/**
 必须先启动服务器 后连接
1、创建服务器  指定端口   ServerSocket(int port) 
2、接收客户端连接  
3、发送数据+接收数据
*/
public class Server {
 
	public static void main(String[] args) throws IOException {
		//1、创建服务器  指定端口   ServerSocket(int port) 
		ServerSocket server = new ServerSocket(8888);
		//2、接收客户端连接   阻塞式
		Socket socket =server.accept();
		System.out.println("一个客户端建立连接");
		//3、发送数据
		String msg ="欢迎使用";
		//输出流
		/*
		BufferedWriter bw = new BufferedWriter(
			new OutputStreamWriter(
			socket.getOutputStream()));
		bw.write(msg);
		bw.newLine();
		bw.flush();
		*/
		DataOutputStream dos = new DataOutputStream(socket.getOutputStream());
		dos.writeUTF(msg);
		dos.flush();
	}
}


/**
 1、创建客户端   必须指定服务器+端口    此时就在连接
     Socket(String host, int port) 
 2、接收数据 +发送数据    
 * @author Administrator
 *
 */
public class Client {
 
	public static void main(String[] args) throws UnknownHostException, IOException {
		//1、创建客户端   必须指定服务器+端口    此时就在连接
		Socket client = new Socket("localhost",8888);
		//2、接收数据
		/*
		BufferedReader br = new BufferedReader(new InputStreamReader(client.getInputStream()));
		String echo =br.readLine(); //阻塞式方法
		System.out.println(echo);
		*/
		DataInputStream dis = new DataInputStream(client.getInputStream());
		String echo = dis.readUTF();
		System.out.println(echo);
	}
}


public class Server {
 
	public static void main(String[] args) throws IOException {
		ServerSocket server =new ServerSocket(9999);
		while(true){
			Socket client =server.accept();        
			//写出数据
			//输入流
			DataInputStream dis = new DataInputStream(client.getInputStream());
			DataOutputStream dos = new DataOutputStream(client.getOutputStream());
			while(true){
				String msg =dis.readUTF();
				System.out.println("客户端请求数据"+msg);
				//输出流
				dos.writeUTF("服务器-->"+msg);
				dos.flush();
			}
		}
	}
}
 

public static void main(String[] args) throws UnknownHostException, IOException {
	Socket client = new Socket("127.0.0.1",9999);
	while(true){
		//控制台输入流
		BufferedReader console = new BufferedReader(new InputStreamReader(System.in));
		DataOutputStream dos = new DataOutputStream(client.getOutputStream());
		DataInputStream dis = new DataInputStream(client.getInputStream());
		String info =console.readLine();
		//输出流
		dos.writeUTF(info);
		dos.flush();
		//输入流
		String msg =dis.readUTF();
		System.out.println("服务器响应数据:"+msg);
	}
	}
 
}

总结

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值