一.初始网络编程
1.什么是网络编程
计算机跟计算机之间通过网络进行数据传输
2.创建的软件架构有哪些?
CS/BS
3.CS/BS的优缺点
CS:客户端服务端模式需要开发客户端
BS:浏览器服务端模式不需要开发客户端
CS:适合定制专业化的办公软件和网游
BS:适合移动物联网应用,可以在任何地方随时访问的系统
二.网络编程三要素
IP:设备在网络上的地址,是唯一标识符。
端口号:应用程序在设备中唯一的标识
协议:数据在网络上传输的规则,常见的协议有UDP,TCP,http,https,ftp
1.1IP
ipv4(internet protocol version4)采用32位地址长度,分成4组,转换方式:点分十进制,目前主流方式,但是已经用完了
目前解决方法:利用局域网ip解决ip不够用的问题
特殊ip地址127.0.0.1,本机ip,永远只会寻找当前所在本机
常用cmd命令
inconfig:查看本机ip地址
ping:检查网络(局域网也可以检查外网)是否连通
ipv6:采用128位地址长度,分成8组一组16位,转换方式:冒分十六进制,为了解决ipv4不够用才出现的
1.2java中用来表示ip的类
InetAddress:给定主机的名称,根据系统上配置的名称服务返回其IP地址数组。
package com.wyx.ip;
import java.net.InetAddress;
import java.net.UnknownHostException;
public class Demo1 {
public static void main(String[] args) throws UnknownHostException {
//InetAddress.getByName(string host)确定主机名称的ip地址,主机名称可以是机器名称,也可以是ip地址,返回此对象
// InetAddress inetAddress = InetAddress.getByName("192.168.0.103");
InetAddress inetAddress = InetAddress.getByName("LAPTOP-4R43I4O8");
//打印这个对象
System.out.println(inetAddress);//LAPTOP-4R43I4O8/192.168.0.103
//调用下面的方法
System.out.println(inetAddress.getHostAddress());//192.168.0.103
System.out.println(inetAddress.getHostName());//LAPTOP-4R43I4O8
}
}
2.1端口号
端口号:由两个字节表示的整数,取值范围:0~65535
其中0~1023之间端口号用于一些知名的网络服务或者应用
一个端口号只能被一个应用程序使用
3.1协议
UDP协议
用户数据报协议
UDP是面向无连接的通信协议(不管是否链接成功,都要发送消息)
速度快,有大小限制最多发送64k,数据不安全,易丢失数据
发送端
package com.wyx.udp;
import java.io.IOException;
import java.net.*;
public class SendMessageDemo {
public static void main(String[] args) throws IOException {
//发送数据
//1.创建DatagramSocket()对象
//参数:空参所有端口号中随机一个进行使用
//有参:从指定的端口号中发送
DatagramSocket datagramSocket = new DatagramSocket();
//2.打包数据
String str="你好";//需要发送的数据
byte[] bytes = str.getBytes();//把需要发送的数据转成字节数组
//创建InetAddress对象,用于指定接收方的ip地址
InetAddress byName = InetAddress.getByName("127.0.0.1");//发送给指定电脑
int port = 10086;//接收端的端口号
DatagramPacket datagramPacket = new DatagramPacket(bytes, bytes.length, byName, port);//打包数据
//3.发送数据
datagramSocket.send(datagramPacket);
//4.释放资源
datagramSocket.close();
}
}
接收端
package com.wyx.udp;
import java.io.IOException;
import java.net.DatagramPacket;
import java.net.DatagramSocket;
import java.net.InetAddress;
import java.net.SocketException;
public class ReceiveMessageDemo {
public static void main(String[] args) throws IOException {
//接受数据
//1.创建DatagramSocket对象
//在创建接受数据对象时候,一定要绑定接口,并且与发送端 发送的的接口一致
DatagramSocket datagramSocket = new DatagramSocket(10086);
//2.接受数据(接收到的数据是一个数据包)
byte[] bytes = new byte[1024];//用来存放数据
DatagramPacket datagramPacket = new DatagramPacket(bytes, bytes.length);//创建一个数据包,用来存放接收到的数据包
//receive该方法是阻塞的,程序执行到这一步的时候,会在这里死等,等发送端发送消息
datagramSocket.receive(datagramPacket);//接受数据,把接收到的数据放到datagramPacket包中
//3.解析数据包
byte[] data = datagramPacket.getData();//获取数据,获取到的数据就是上面bytes变量中存的数据
int length = datagramPacket.getLength();//获取数据的字节数
InetAddress address = datagramPacket.getAddress();//获取发送方的ip地址
int port = datagramPacket.getPort();//获取发送方的端口
System.out.println("接受数据:" + new String(data,0,length));//接受数据:你好
System.out.println("发送方的ip地址是:" + address);//发送方的ip地址是:/127.0.0.1
System.out.println("发送方端口号是:" + port);//发送方端口号是:50574
//4.释放资源
datagramSocket.close();
}
}
先运行接收端,再运行发送端
练习
UDP发送数据:数据来源于键盘录入,直到输入的数据是886,发送数据结束
UDP接受数据:因为接收端不知道发送端什么时候停止发送,故采用死循环的方式接受
发送端
package com.wyx.udp2;
import java.io.IOException;
import java.net.*;
import java.util.Scanner;
public class SendMessageDemo {
public static void main(String[] args) throws IOException {
//1创建对象
DatagramSocket datagramSocket = new DatagramSocket();
//2打包数据
Scanner scanner = new Scanner(System.in);
while (true){
System.out.println("请输入你要发送的数据");
String next = scanner.next();
if (next.equals("886")) {
break;
} else {
byte[] bytes = next.getBytes();
InetAddress byName = InetAddress.getByName("127.0.0.1");
int port = 10086;
DatagramPacket datagramPacket = new DatagramPacket(bytes, bytes.length, byName, port);
//3发送数据
datagramSocket.send(datagramPacket);
}
}
//4.释放资源
datagramSocket.close();
}
}
接收端
package com.wyx.udp2;
import java.io.IOException;
import java.net.DatagramPacket;
import java.net.DatagramSocket;
import java.net.SocketException;
public class ReceiveMessageDemo {
public static void main(String[] args) throws IOException {
//1创建对象
DatagramSocket datagramSocket = new DatagramSocket(10086);
//2接受数据
byte[] bytes = new byte[1024];
DatagramPacket datagramPacket = new DatagramPacket(bytes, bytes.length);
while (true) {
datagramSocket.receive(datagramPacket);
//3解析数据
System.out.println("接受数据:" + new String(datagramPacket.getData(),0,datagramPacket.getLength()) );
}
//4.释放资源
// datagramSocket.close();
}
}
UDP的三种通信方式
1.单播(一对一发送数据)
2.组播(一对一组发送数据)
3.广播(一对局域网中全部发送数据)
TCP协议
传输控制协议
TCP协议是面向链接的通讯协议。(先判断是否链接成功,链接成功之后,再去发送消息)
速度慢,没有大小限制,数据安全
TCP通信协议是一种可靠的网络协议,它在通信的两端各建立一个Socket对象
通信之前要保证链接已经建立
通过Socket产生IO流来进行网络通信
客户端发送数据
package com.wyx.tcp;
import java.io.IOException;
import java.io.OutputStream;
import java.net.Socket;
//客户端,发送数据,tcp协议
public class Client {
public static void main(String[] args) throws IOException {
//1.创建Socket对象
//细节:在创建对象同时会连接服务器
//如果连接不上,会报错
Socket socket = new Socket("127.0.0.1", 10000);
//2.可以从连接通道中获取输出流
OutputStream os = socket.getOutputStream();
os.write("你好呀".getBytes());//需要发送的数据
//3.释放资源
os.close();
socket.close();
}
}
服务端接受数据
package com.wyx.tcp;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.net.ServerSocket;
import java.net.Socket;
//服务端,接受数据,tcp协议
public class Server {
public static void main(String[] args) throws IOException {
//1.创建ServerSocket对象,端口号要和发送方端口号一致
ServerSocket ss = new ServerSocket(10000);
//2.监听客户端链接,就是调用accept方法,死等,等客户端来链接,链接成功会返回客户端的链接对象
Socket socket = ss.accept();
//3.从链接通道中获取输入流读取数据
InputStream is = socket.getInputStream();//字节输入流
InputStreamReader isr = new InputStreamReader(is);//将字节流转为字符流
int b;
while ((b=isr.read())!=-1){
System.out.println((char)b);
}
//4.释放资源
socket.close();//断开与客户端链接
ss.close();//关闭服务器
}
}