概念:
1.什么是网络编程?
计算机跟计算机之间通过网络进行数据传输。
2.通信的软件架构C/S与B/S 的区别?
C/S :客户端/服务端模式 (需要开发客户端)
B/S :浏览器/服务端模式 (不需要开发客户端)
网络编程三要素:
1.IP
设备在网络中的地址,是唯一的标识
2.端口号
应用程序在设备中唯一的标识
3.协议
数据在网络中传输的规则(对速率,传输代码,代码结构,传输控制步骤,出错控制等制定的标准)
常见的协议有UDP、TCP、http、https、ftp
关于三要素的讲解:
1.IP (Internet Protocol)
互联网协议地址,也称IP地址, 是分配给上网设备的数字标签,上网设备在网络中的地址是唯一的。
常见的IP分类:IPv4 、IPv6
1.)IPv4 (互联网通信协议第四版)
采用32位地址长度,分成4组,把每组的二进制转化为十进制,就是我们日常看见的IP。
例如:192.168.1.66 (每组的取值范围是0--255)
在IPv4中总共只有256*256*256*256(2^32个),不到43亿个IP
2.)IPv6 (互联网通信协议第六版)
IPv6是为了解决IPv4不够用而出现的
采用128位地址长度,分成8组,有2^128个IP
冒分十六进制表示法
例如: 2001:DB8:0:23:8:800:200C:417A (最前面的0可以省去)
(特殊情况:如果中间有多个连续的0,可以采用0位压缩表示法)
例如:FF01:0:0:0:0:0:0:1101 ——> FF01::1101
常用的cmd命令:
ipconfig : 查看本机IP地址
ping : 检查网络是否连通 (ping 后面可以跟IP或网址)
2.端口号 (应用程序在设备中唯一的标识):
由两个字节表示的整数,取值范围:0~65535
其中0~1023之间的端口号用于一些知名的网络服务或应用
注:一个端口只能被一个应用程序使用。
3.协议:
计算机网络中,连接和通信的规则被称为网络通信协议。
OSI参考模型:世界互联协议标准,全球通信规范,单模型过于理想化,未能在因特网上进行广泛推广
TCP/IP参考模型(或 TCP/IP协议):国际标准
关于TCP和UDP:
1.二者的区别:
UDP协议:
1.用户数据报协议
2.UDP是面向无连接的通信协议 (不管有没有和对方连接上,它只管发送)
3.速度快,有大小限制(一次最多发送64K),数据不安全,易丢失数据
(语音通话、在线视频)
TCP协议:
1.传输控制协议
2.TCP协议是面向连接的通信协议
3.速度慢,没有大小限制,数据安全
(下载软件、文字聊天、发送邮件)
2.代码详解:
1.)UDP通信程序
(发送数据):
1. 创建发送端的DatagramSocket对象
2. 数据打包(DatagramPacket)
3. 发送数据
4. 释放资源
public class test01 { public static void main(String[] args) throws IOException { DatagramSocket ds=new DatagramSocket(); String str="Hello World"; byte[] bytes=str.getBytes(); InetAddress address=InetAddress.getByName("127.0.0.1"); int port=10086; DatagramPacket dp=new DatagramPacket(bytes,bytes.length,address,port); ds.send(dp); ds.close(); } }
(接受数据):
1. 创建接收端的DatagramSocket对象
2. 接收打包好的数据
3. 解析数据包
4. 释放资源
public class test02 { public static void main(String[] args) throws IOException { //一定要绑定跟发送的端口一样 DatagramSocket ds=new DatagramSocket(10086); byte[] bytes=new byte[1024]; DatagramPacket dp=new DatagramPacket(bytes,bytes.length); ds.receive(dp); byte[]data=dp.getData(); int len=dp.getLength(); InetAddress address=dp.getAddress(); int port=dp.getPort(); System.out.println("接受到的数据为:"+new String(data,0,len)); System.out.println("从地址为:"+address+"的这台电脑的"+port+"端口发出"); ds.close(); } }
练习:
按照下面的要求实现程序
UDP发送数据:数据来自于键盘录入,直到输入的数据是886,发送数据结束
UDP接受数据:因为接收端不知道发送端什么时候停止发送,故采用死循环接收
public class send { public static void main(String[] args) throws IOException { DatagramSocket ds=new DatagramSocket(); Scanner sc=new Scanner(System.in); while(true){ System.out.println("输入要发送的话:"); String str=sc.nextLine(); if("886".equals(str)){ break; } byte[]bytes=str.getBytes(); InetAddress address=InetAddress.getByName("127.0.0.1"); int port=10086; DatagramPacket dp=new DatagramPacket(bytes,bytes.length,address,port); ds.send(dp); } ds.close(); } }
public class receive { public static void main(String[] args) throws IOException { //如果没绑定端口就是随机端口 DatagramSocket ds=new DatagramSocket(10086); byte[]data=new byte[1024]; DatagramPacket dp=new DatagramPacket(data,data.length); while (true){ ds.receive(dp); byte[]res=dp.getData(); int len= dp.getLength(); String ip=dp.getAddress().getHostAddress(); String name=dp.getAddress().getHostName(); System.out.println("ip为:"+ip+",主机名为:"+name+"的人发送了数据:"+new String(res,0,len)); } } }
UDP的三种通信方式:
1. 单播(1对1)
2. 组播
组播地址:224.0.0.0 ~ 239.255.255.255
其中 224.0.0.0 ~ 224.0.0.255 为预留的组播地址
3. 广播
广播地址:255.255.255.255
2.)TCP通信程序
TCP通信协议是一种可靠的网络协议,它在通信的两端各建立一个Socket对象
通信之前要保证连接已经建立
通过Socket产生IO流来进行网络通信
客户端:
1. 创建客户端的Socket对象与指定服务端连接
Socket(String host, int port)
2. 获取输出流,写数据
OutputStream getOutputStream()
3. 释放资源
Void close()
服务端:
1. 创建服务器端的Socket对象(ServerSocket)
ServerSocket(int port)
2. 监听客户端的连接,返回一个Socket对象
Socket accept()
3. 获取输入流,返回一个Socket对象
InputStream getInputStream()
4. 释放资源
Void close()
/** * 发送数据 */ public class client { public static void main(String[] args) throws IOException { //在创建对象的同时会连接服务器 //如果连接不上就会报错 Socket socket=new Socket("127.0.0.1",10086); OutputStream os=socket.getOutputStream(); os.write("你好".getBytes()); os.close(); socket.close(); } }
/** * 接收数据 */ public class server { public static void main(String[] args) throws IOException { ServerSocket ss=new ServerSocket(10086); Socket socket=ss.accept(); InputStream is=socket.getInputStream(); // 没有isr读出的中文会是乱码 InputStreamReader isr=new InputStreamReader(is); //也可以用缓冲流 //BufferedReader br=new BufferedReader(new InputStreamReader(socket.getInputStream())); int b; while ((b= isr.read())!=-1){ System.out.print((char)b); } socket.close(); ss.close(); } }
TCP 三次握手、四次挥手
三次握手:
1. 客户端 ――> 服务器端
客户端向服务器发出连接请求,等待服务器确认
2. 客户端 <―― 服务器端
服务器向客户端返回了一个响应,告诉客户端收到了请求
3. 客户端 ――> 服务器端
客户端向服务器再次发出确认信息,连接建立
四次挥手:(确保连接断开,且数据处理完毕)
1. 客户端 ――> 服务器端
客户端向服务器发出取消连接请求
2. 客户端 <―― 服务器端
服务器向客户端返回一个响应,表示收到了客户端的取消请求
3. 客户端 <―― 服务器端
服务器将最后的数据处理完毕
服务器向客户端发出确认取消信息
4. 客户端 ――> 服务器端
客户端再次发送确认消息,连接取消
标签:Socket,Java,socket,编程,String,new,public,dp,客户端 From: https://www.cnblogs.com/ztCoding/p/18196991