网络模型:![](https://i-blog.csdnimg.cn/blog_migrate/c1e94733ba6d30375660eb03d690046f.png)
网络通信:
需要ip和端口号
ip是网络中计算机的唯一标识;
端口号是计算机中的程序的位置;
传输协议:
TCP协议、CDP协议
TCP:
通信前,需要先建立连接。然后才能发送消息。
它是一种可靠的传输协议,效率低。
通信完毕,断开连接。
就像我们打电话:先要拨通对方的号码,然后才能交流,交流结束后挂断。
UDP:
不需要建立连接,直接发送信息。
信息是以数据报的形式封装的,里面包含:对方的ip,端口号,信息==。
它是一种不可靠的传输协议,效率高。
好比发短信,不管对象是否存在,直接发出去,对方是否收到也不管,信息是否正确也不管。
二者区别:
TCP是面向连接的可靠的传输协议,效率较低。
UDP是无需连接的不可靠的传输协议,效率高。
基于TCP的网络编程:(需要建立连接)
服务器:
//(1)和客户端建立连接
// 启动服务器,指定服务器接收信息的端口号9999
ServerSocket server=new ServerSocket(9999);
// 等待接收客户端的连接请求
// 如果没有没有客户端发送连接请求,将阻塞(等待)。
// 一旦接收到客户端请求,返回一个和客户端通信的套接字。
Socket s=server.accept();
System.out.println("--服务器和客户端建立了连接--");
//(2)接收信息
// 使用Socket套接字通信
InputStream recieve = s.getInputStream();
byte[] b=new byte[1024];
// read方法阻塞
int i = recieve.read(b);
System.out.println(new String(b,0,i));
recieve.close();
//(3)和客户端断开连接
s.close();
server.close();
客户端:
//(1)和服务器建立连接
// 创建一个套接字,向服务器发送连接请求,建立连接。
// 指定服务器的ip:localhost和服务器接收信息的端口号9999
Socket c=new Socket("localhost",9999);
System.out.println("++客户端和服务器建立连接++");
//(2)发送信息
// 使用Socket套接字进行通信
OutputStream send=c.getOutputStream();
send.write("你好啊,服务器!".getBytes());
send.close();
//(3)和服务器断开连接
c.close();
基于CDP的网络编程:(无需建立连接)
服务器:
//(1)接收信息
//(2)关闭socket
package com.hs.udp;
import java.io.IOException;
import java.net.DatagramPacket;
import java.net.DatagramSocket;
import java.net.SocketException;
public class UdpServer {
public static void main(String[] args) throws IOException {
// 1、接收信息
// (1)创建一个套接字,指定接收信息的端口是8888
DatagramSocket s=new DatagramSocket(8888);
// (2)准备一个空的数据报
byte[] b=new byte[1024];
DatagramPacket p=new DatagramPacket(b,0,b.length);
// (3)接收信息
// 带有阻塞的方法
s.receive(p);
System.out.println(new String(b));
// 2、关闭socket
s.close();
}
}
客户端:
//(1)发送信息
//(2)关闭socket
package com.hs.udp;
import java.io.IOException;
import java.net.*;
public class UdpClient {
public static void main(String[] args) throws IOException {
// 1、发送信息
// (1) 创建一个套接字
DatagramSocket c=new DatagramSocket();
// (2)准备一个数据报
byte[] b="你好啊,服务器!".getBytes();
// 服务器的地址和端口
InetAddress addr=InetAddress.getByName("localhost");
DatagramPacket p=new DatagramPacket(b,0,b.length,addr,8888);
// (3)发送数据报
c.send(p);
// 2、关闭socket
c.close();
}
}