栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > Java

网络编程浅析

Java 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

网络编程浅析

网络编程 1. 软件结构

常见的软件结构有C/S和B/S

  • C/S结构:Client/Server,表示客户端/服务器端的软件结构

例如:QQ,微信,等等,只要需要下载安装,并且和服务器通信的这一类软件,都属于C/S的软件结构

  • B/S结构:Browser/Server,表示浏览器/服务器软件结构

例如:淘宝,京东等,只要是需要使用浏览器,并且和服务器,通信的这一类软件,都属于B/S的软件结构

C/S和B/S比较:

  • C/S在图形的表现能力上以及运行的速度上肯定强于B/S

  • C/S需要运行专门的客户端,并且他不能跨平台,用c++在windows下写的程序不能再Linux下运行

  • B/S不需要专门的客户端,只要系统中安装了浏览器即可访问,方便用户的使用

  • B/S是基于网页语言的,与操作系统无关,所以跨平台也是他的优势。

2. 通信协议

网络通信协议:

通过计算机网络可以使多台计算机实现相互连接,位于同一个网络中的两台计算机,在进行连接和通信时,需要遵守一定的规则,这些连接和通信的规则

通信协议,对两台计算机之间所传输数据的传输格式,传输步骤等做了统一规定要求,通信双方必须同时遵守才能完成数据交换

TCP/IP协议栈:

传输控制协议/因特网互联协议,是一系列网络协议的总和,是构成网络通信的核心骨架。是互联网中最基本,使用最广泛的协议。

定义了计算机如何连入因特网,以及数据如何在计算机之间进行传输

TCP/IP协议栈采用4层结构:

  • 链路层:用于定义物理传输通道,通常是对某些网络连接设备的驱动协议,如光纤,网线提供驱动
  • 网络层:是整个TC/IP协议的核心,主要是用于将传输的数据进行分组,将分组数据发送到目标计算机或者网络
  • 传输层:主要使网络程序进行通信,在进行网络通信时,可以采用TCP协议,亦可以采用UDP协议
  • 应用层:主要负责应用程序的协议,例如HTTP协议,FTP协议
3. TCP/UDP

TCP,传输控制协议 (Transmission Control Protocol)

TCP协议是面向连接的通信协议,即传输数据之前,在发送端和接收端建立连接,然后再传输数 据,它提供了两台计算机之间可靠的、无差错的数据传输。

在TCP连接中,将计算机明确划分为客户端与服务器端,并且由客户端向服务端发出连接请求,每 次连接的创建都需要经过“三次握手”的过程。

TCP的三次握手:TCP协议中,在发送数据的准备阶段,客户端与服务器之间的三次交互,以保证连接的 可靠

  • 第一次握手,客户端向服务器端发送连接请求,等待服务器确认
  • 第二次握手,服务器端向客户端回送一个响应,通知客户端收到了连接请求
  • 第三次握手,客户端再次向服务器端发送确认信息,确认连接
4. 端口号与IP

IP地址,互联网协议地址。ip地址用来给一个网络中的计算机设备做唯一编号

查看本地ip地址的命令:

ipconfig

查看本机与另一台主机是否连通:

ping ip地址

ping 10.0.1.129

表示本机ip地址:

127.0.0.1/localhost

端口号:网络的通信,本质上时两个进程(应用程序)的通信。每台计算机都有很多多的进程,每个需要网络通信的进程(应用程序),都会占用系统的一个端口号

在网络中,通过ip可以找到对应的主机设备,而通过端口号,可以找到这个主机中正在运行的一个应用程序

端口号的范围时065535,其中01023之间的端口号用于系统内部的使用。所以选择端口号的时候需要避免这些。

默认的端口号:

oracle启动后默认占用端口号1521,mysql启动后默认端口号3306,redis启动后默认占用端口号6379,tomcat启动后默认占用端口号8080

**查看某个端口的进程PID

Windows系统中执行命令

//查看正在使用的程序的端口号
	netstat -aon
//查看某个端口号的进程PID
    netstat -aon|findstr 端口号
        
//强制关闭(杀死)
        taskkill /F /pid 2696

Ubuntu系统中执行命令:

//查看占用8888端口号的进程PID
netstat -anp | grep :8888
//显示结果,找到占用8888端口号的PID
tcp 0 0 :::8888 :::* LISTEN 3626/java
//强制关闭(杀死)
kill -9 3626

如果权限不足,可以使用root操作,或者使用sudo命令

5. TCP网络编程

在TCP通信协议下,能实现两台计算机之间的数据交互,并且他们要严格区分客户端(Client)与服务器端(Server)

客户端和服务器端通信的步骤:

  • 服务器端先启动,并占用一个指定的端口号,等待客户端的连接
  • 客户端主动发起服务器端的连接,在连接成功后就可以进行数据发送了

在java中,对于这样基于TCP协议下连接通信的客户端和服务端,分别进行了抽象:

  • java.net.Socket类表示客户端
  • java.net.ServerSocket类表示服务器端

使用Socket和ServerSocket进行的编程,也称之为套接字编程

交互

使用客户端(Socket)与服务器端(ServerSocket)交互

客户端和服务器端进行连接:

服务器端:

package toto2.网络编程12;

import java.io.IOException;
import java.net.ServerSocket;
import java.net.Socket;

public class ServerTCP {
	public static void main(String[] args) {
		int port=8889;
		ServerSocket server=null;
		Socket socket=null;
		
		
		try {
			server = new ServerSocket(port);
			System.out.println("服务器启动,监听端口"+port+",等待客户端的连接");
			socket= server.accept();
			System.out.println("服务器接收到客户端的连接:"+socket);
		} catch (IOException e) {
			e.printStackTrace();
		}finally {
			//关闭流
			if(socket!=null) {
				try {
					socket.close();
				} catch (IOException e) {
					// TODO 自动生成的 catch 块
					e.printStackTrace();
				}
			}
			
			if(server!=null) {
				try {
					server.close();
				} catch (IOException e) {
					// TODO 自动生成的 catch 块
					e.printStackTrace();
				}
			}
		}
		
		
	}

}

客户端:

package toto2.网络编程12;

import java.io.IOException;
import java.net.ServerSocket;
import java.net.Socket;

public class ServerTCP {
	public static void main(String[] args) {
		int port=8889;
		ServerSocket server=null;
		Socket socket=null;
		
		
		try {
			server = new ServerSocket(port);
			System.out.println("服务器启动,监听端口"+port+",等待客户端的连接");
			socket= server.accept();
			System.out.println("服务器接收到客户端的连接:"+socket);
		} catch (IOException e) {
			e.printStackTrace();
		}finally {
			//关闭流
			if(socket!=null) {
				try {
					socket.close();
				} catch (IOException e) {
					// TODO 自动生成的 catch 块
					e.printStackTrace();
				}
			}
			
			if(server!=null) {
				try {
					server.close();
				} catch (IOException e) {
					// TODO 自动生成的 catch 块
					e.printStackTrace();
				}
			}
		}
		
		
	}

}

让客户端可以从控制台接收用户的输入内容,然后再写给服务 器,然后再接收服务器写回来的数据

服务端代码

package toto2.网络编程12;

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.OutputStreamWriter;
import java.io.PrintWriter;
import java.net.ServerSocket;
import java.net.Socket;

public class ServerTcp1 {
	public static void main(String[] args) {
		int port = 8889;
		ServerSocket server = null;
		Socket socket = null;
		BufferedReader in = null;
		PrintWriter out = null;
		
		String encoding = "UTF-8";


		try {
			server = new ServerSocket(port);

			System.out.println("服务器启动,监听端口" + port + ",等待客户端的连接");
			socket = server.accept();
			System.out.println("服务器接收到客户端的连接:" + socket);

			// 获取输入流,读取客户端发送过来的内容
			in = new BufferedReader(new InputStreamReader(socket.getInputStream(), "UTF-8"));
			out = new PrintWriter(new
					OutputStreamWriter(socket.getOutputStream(),encoding));
			
			String line = null;
			line = in.readLine();
			System.out.println("服务器接收到客户端发送的信息" + line);
			out.println("欢迎来到toto服务器!");
			out.flush();

		} catch (IOException e) {
			e.printStackTrace();
		} finally {
			// 关闭资源
			if (in != null) {
				try {
					in.close();
				} catch (IOException e) {
					e.printStackTrace();
				}
			}
			if (socket != null) {
				try {
					socket.close();
				} catch (IOException e) {
					e.printStackTrace();
				}
			}
			if (server != null) {
				try {
					server.close();
				} catch (IOException e) {
					e.printStackTrace();
				}
			}
		}
	}

}

客户端代码

package toto2.网络编程12;

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.OutputStream;
import java.io.OutputStreamWriter;
import java.io.PrintWriter;
import java.net.Socket;

public class ClientTcp1 {
	public static void main(String[] args) {
		String host="127.0.0.1";
		int port=8889;
		Socket socket=null;
		PrintWriter out =null;
		BufferedReader in = null;
		
		BufferedReader inFormConsole = null;


		String encoding = "UTF-8";

		
		try {
			socket = new Socket(host,port);
			
			out= new PrintWriter(new OutputStreamWriter(socket.getOutputStream(),"UTF-8"));
			in = new BufferedReader(new
					InputStreamReader(socket.getInputStream(),encoding));
			//创建新的输入流,负责读取从控制台中读取用户输入的内容
			inFormConsole = new BufferedReader(new
			InputStreamReader(System.in,encoding));
			String lineFromConsole = null;
			lineFromConsole = inFormConsole.readLine();
			out.println(lineFromConsole);
			out.flush();
			
			
			String line = null;
			line = in.readLine();
			System.out.println("客户端接收到服务器写回的是内容为:"+line);

		} catch (IOException e) {
			e.printStackTrace();
		}finally {
			//关闭资源
			if(in!=null){
			try {
			in.close();
			} catch (IOException e) {
			e.printStackTrace();
			}
			}

			if(out!=null) {
				out.close();
			}
			if(socket!=null) {
				try {
					socket.close();
				} catch (IOException e) {
					e.printStackTrace();
				}
				
			}
			
		}
	}

}
6. UDP网络

在UDP通信协议下,两台计算机之间进行数据交互,并不需要先建立连接,客户端直接往指定的IP和端 口号上发送数据即可,但是它并不能保证数据一定能让对方收到

java.net.DatagramSocket 和 java.net.DatagramPacket 是UDP编程中使用到的俩个类,客户端 和服务器端都使用这个俩类

java.net.DatagramSocket 负责接收和发送数据 java.net.DatagramPacket 负责封装要发送的数据和接收到的数据

7. URI与URL

URI,统一资源标识符,用来唯一标识一个资源。

UPL统一资源定位符,是一种具体的URI,即URL可以用来标识一个资源,而且还指明如何定位这个资源。

转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/489700.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号