网络编程知识点总结
* 一 、基础知识
* 1.网络传输基本三要素
*(1)IP地址:找到对方IP;
*(2)端口:数据要发送到对方指定的应用程序上,为了标识这些应用程序,所以给这些网络应用程序都用数字进行标识。
* 为了方便称呼这个数字,叫做端口(逻辑端口);
* 有效端口:0-65535,其中0-1024系统使用或保留端口。
*(3)协议:定义通讯规则,这个通讯规则称为协议。国际组织定义了通用协议TCP/IP。
* 2.层次及相应协议
* 网际层:IP;传输层:TCP;应用层:http,ftp
* 3.UDP和TCP的特点
*(1)UDP特点:面向无连接;数据封包,体积有限;不可靠;速度快
* 应用:聊天,视频
*(2)TCP特点(三次握手):建立连接;大数据量传输;可靠;效率稍低
* 应用:打电话,下载
* 4.Socket(插座)
* Socket就是为网络服务提供的一种机制;网络通信其实就是Scoket间的通信;数据在两个Socket间通过IO传输
* 5.InetAddress
* InetAddress:此类表示互联网协议 (IP) 地址
* static InetAddress getLocalHost():返回本地主机
* String getHostAddress():返回IP地址
* String getHostName():获取此IP地址的主机名
* static InetAddress[] getAllByName(String host):在给定主机名的情况下确定主机的IP地址
* 二、UDP
* 1.Udp发送端
* 思路:
*(1)建立udpsocket服务;
*(2)提供数据,并将数据封装到数据包中;
*(3)通过socket服务的发送功能,将数据包发出去;
*(4)关闭资源
* 常用demo:
* //创建udp服务,通过DatagramSocket对象(类似于邮局)
* DatagramSocket ds = new DatagramSocket(8888);//8888为发送端端口号
* //确定数据,并封装成数据包(类似于要寄的包裹)
* byte[] buf = "kang xi lai le".getBytes();
* //DatagramPacket(byte[] buf,int length,InetAddress address,int port);其中port为端口号
* DatagramPacket dp = new DatagramPacket(buf,buf.length,InetAddress.getByName("localhost"),10088);
* //通过Socket服务,将已有的数据包发送出去,通过send方法
* ds.send(dp);
* //关闭资源
* ds.close();
* 2.Udp接收端
* 思路:
*(1)定义udpsocket服务,通常会监听一个端口,其实就是给这个接收网络应用程序定义数据标识,
* 方便于明确哪些数据过来该应用程序可以处理;
*(2)定义一个数据包,因为要存储接收到的字节数据。数据包对象中有更多功能可以提取字节数据中的不同数据信息;
*(3)通过socket服务的receive方法将收到的数据存入已定义好的数据包中;
*(4)通过数据包对象的特有功能,将这些不同的数据取出,打印在控制台上;
*(5)关闭资源
* 常用demo:
* //创建udp socket,建立端点
* DatagramSocket ds = new DatagramSocket(10088);
* while(true){
* //定义数据包,用于存储数据
* byte[] buf = new byte[1024];
* DatagramPacket dp = new DatagramPacket(buf,buf.length);
* //通过服务的receive方法将收到数据存到数据包中
* ds.receive(dp);//阻塞式方法
* //通过数据包的方法获取其中的数据
* String ip = dp.getAddress().getHostAddress();
* String data = new String(dp.getData(),0,dp.getLength());
* int port = dp.getPort();
* }
* //关闭资源
* ds.close();
* 3.应用
* 发送接收文字数据
* 三、TCP
* 1.基础知识
*(1)TCP分客户端和服务端;
*(2)客户端对应的对象是Socket,服务端对应的对象是SeverSocket
* 2.TCP客户端
* 常用demo:
* //创建客户端的socket服务,指定目的主机和端口
* Socket s = new Socket("localhost",10020);
* //为了发送数据,应该获取socket流中的输出流
* OutputStream out = s.getOutputStream();
* out.write("hello".getBytes());
* s.close();//关闭客户端
* 3.TCP服务端
* 常用demo:
* //建立服务端socket服务:SeverSocket(),并监听一个端口
* ServerSocket ss = new ServerSocket(10020);
* //通过accept方法获取连接过来的客户端对象,没有连接就会等,所以这个方法是阻塞式的
* Socket s = ss.accept();
* String ip = s.getInetAddress().getHostAddress();
* //获取客户端发送过来的数据,那么要使用客户端对象的读取流来读取数据,并打印在控制台
* InputStream in = s.getInputStream();
* byte[] buf = new byte[1024];
* int len = in.read(buf);
* System.out.println(new String(buf,0,len));
* s.close();//关闭客户端
* ss.close();//关闭服务端(可选操作)
* 4.应用
*(1)定义端点接收数据并打印在控制台上
*(2)TCP的传输的客户端和服务端的互访
* 即:客户端给服务端发送数据,服务端收到后,给客户端反馈信息。
*(3)建立一个文本转换服务器
* 即:客户端给服务端发送文本,服务端会将文本转成大写再返回给客户端。而且客户端
* 可以不断的进行文本转换。当客户端输入over时,转换结束。
*(4)复制文件
*(5)上传图片->客户端并发上传图片
*(6)客户端并发登录
* 需求:客户端通过键盘录入用户名,服务端对这个用户进行校验。
* 如果该用户存在,在服务端显示XXX已登录,并在客户端显示XXX欢迎光临;
* 如果该用户不存在,在服务端显示XXX尝试登录,并在客户端显示XXX,该用户不存在。
* 最多登录三次。
*(7)浏览器客户端-自定义服务端
* 浏览器客户端网址输入格式:协议://主机名:端口号/资源路径/资源
* e.g.http://localhost:port/ http://localhost:8080/myweb/demo.html
*(8)浏览器客户端-Tomcat服务端
*(9)自定义浏览器-Tomcat服务端 -->自定义图形界面浏览器-Tomcat服务端
* 常用demo(自定义浏览器):
* PrintWriter out = new PrintWriter(s.getOutputStream(),true);
* out.println("GET /myweb/demo.html HTTP/1.1");//资源路径
* out.println("Accept:*/*");//接收的内容,如jpg,word等
* out.println("Accept-Language:zh-CN,zh;q=0.9");//接收的语言
* out.println("Host:localhost:8080");//主机名
* out.println("Connection:keep-alive");//连接状态
* out.println();//必须有空行
* out.println();//请求的数据
* 四、其他
* 1.URL
*(1)URL的常用方法
* String getProtocal():获取此URL的协议名称
* String getHost() :获取此URI的主机名
* int getPort() :获取此URI的端口号
* String getPath() :获取此URI的路径部分
* String getFile() :获取此URL的文件名
* String getQuery() :获取此URI的查询部
*(2)URLConnection openConnection():返回一个 URLConnection 对象,它表示到 URL 所引用的远程对象的连接。
* 2.域名解析
* DNS:域名系统
* 域名解析,先走本地文件(C:\Windows\System32\drivers\etc\hosts),再走网络定义的DNS
* 3.等价代码
* BufferedWriter bufOut = new BufferedWriter(new OutputStreamWriter(s.getOutputStream()));
* bufOut.write(line);
* bufOut.newLine();
* bufOut.flush();
* 等价于
* PrintStream ps = new PrintStream(s.getOutputStream(),true);
* ps.println(line)