文章目录
网络编程
计算机之间通过网络进行数据传输
软件结构
- C/S,Client/Server,客户端服务器,精美但麻烦
- B/S,Browser/Server,浏览器服务器,方便但劣质
比如说,浏览器上所有显示的资源都需要服务器传输,而客户端实现在本地存储了图片等资源,到时候告诉去哪访问就行了
网络编程三要素
- IP,设备的唯一标识
- 端口号,应用程序在设备中唯一的标识
- 协议,UDP\TCP\HTTP\HTTPS\FTP
IP
IPv4,32位
IPv6,128位
IPv4细节
- 局域网IP解决IP不够,以192.168…开头是局域网内的设备
- 127.0.0.1表示本机
- ipconfig查看本机ip地址,ping检查网络是否连通
InetAddress
public static void main(String[] args) throws UnknownHostException {
//根据主机名获取ip信息
InetAddress address = InetAddress.getByName("DESKTOP-2NA3243");
System.out.println(address);
//IP地址
System.out.println(address.getHostAddress());
//主机名
System.out.println(address.getHostName());
}
端口号
- 两个字节表示的整数,取值范围,0-65535
- 0-1023之间的端口用于指明的网络服务或应用
- 自己用1024以上的端口号就可以
协议
OSI演化为TCP\IP
UDP协议,面向无连接通信协议,速度快,只管发,不管收不收的到,比如视频会议,刷视频
TCP协议,面向连接的通信协议,安全可靠,比如发邮件,发消息
UDP
UDP协议(发数据)
public static void main(String[] args) throws IOException {
//发送数据
//创建socket对象(快递公司)
//空参:端口随机指定一个作为发送端口
//有参:端口指定一个作为发送端口
DatagramSocket datagramSocket = new DatagramSocket();
//打包数据
String str = "你好威啊!!";
byte[] bytes = str.getBytes();
InetAddress address = InetAddress.getByName("127.0.0.1");
int port = 10086;
DatagramPacket datagramPacket = new DatagramPacket(bytes, bytes.length, address, port);
//发送数据
datagramSocket.send(datagramPacket);
//释放数据
datagramSocket.close();
}
UDP协议(接受数据)
public static void main(String[] args) throws IOException {
//快递公司
DatagramSocket datagramSocket = new DatagramSocket(10086);
//接受数据
byte[] bytes = new byte[1024];
DatagramPacket datagramPacket = new DatagramPacket(bytes, bytes.length);
datagramSocket.receive(datagramPacket);
//解析数据
byte[] data = datagramPacket.getData();
int length = datagramPacket.getLength();
InetAddress address = datagramPacket.getAddress();
int port = datagramPacket.getPort();
System.out.println("接受到数据"+new String(data,0,length));
System.out.println("该数据是从"+address+"这台电脑中的"+port+"端口发送的");
//释放资源
datagramSocket.close();
}
UDP聊天室
单播,组播,广播
- 单播,DatagramSocket()
- 组播,MulticastSocket(),224.0.0.0-224.0.0.255是预留的组播地址
- 广播,将发送的ip改为InetAddress.getByName(“255.255.255.255”);向局域网所有电脑发送信息
TCP
可靠的网络协议,在通信两端各建立一个scoket对象
接收端
public static void main(String[] args) throws IOException {
ServerSocket serverSocket = new ServerSocket(10001);
Socket accept = serverSocket.accept();
InputStream inputStream = accept.getInputStream();
int b;
while ((b = inputStream.read()) != -1){
System.out.println((char)b);
}
serverSocket.close();
accept.close();
}
发送端
public static void main(String[] args) throws IOException {
Socket socket = new Socket("127.0.0.1",10001);
OutputStream outputStream = socket.getOutputStream();
outputStream.write("aaa".getBytes());
outputStream.close();
socket.close();
}
中文乱码问题
中文一个字是3个字节
接受端修改
public static void main(String[] args) throws IOException {
ServerSocket serverSocket = new ServerSocket(10001);
Socket accept = serverSocket.accept();
//InputStream inputStream = accept.getInputStream();
//InputStreamReader inputStreamReader = new InputStreamReader(inputStream);
//BufferedReader bufferedReader = new BufferedReader(inputStreamReader);
//将字节流装换为字符流,并封装为缓冲流
BufferedReader bufferedReader = new BufferedReader(new InputStreamReader(accept.getInputStream()));
int b;
while ((b = bufferedReader.read()) != -1){
System.out.println((char)b);
}
serverSocket.close();
accept.close();
}
代码细节,三次握手和四次挥手
三次握手协议,服务器监听,客户端先主动向服务器握手
四次挥手协议,需要保证服务器接受到了信息再断开连接