网络编程三要素
协议 IP地址 端口号
协议
协议
计算机之间进行数据传输需要遵守的规则
UDP:
面向无连接的通信协议,两台计算机进行数据传输不需要建立连接,
发送端给接收端发送数据 不会确认接收端是否存在 接收端接收到数据 也不会告知发送端特点
两台计算机不需要建立连接 ,消耗资源少,发送效率高,但是每次发送的最大不能超过64KB
不保证数据的完整性
TCP:
面向连接的通信协议,客户端与服务端必须建立连接,可以保证两台计算机之间可靠的无差错的数据传输.客户端 -----> 服务端
客户端 <----- 服务端
客户端 -----> 服务端特点
必须建立连接,消耗资源多,发送效率低,但是每次发送数据没有限制,可以保证数据的完整性上传与下载一定使用TCP协议
IP地址
查看本机ip
ipconfig查看网络是否能够连通
ping ip地址
ping 网址特殊的ip
127.0.0.1localhost
端口号
如果说IP地址可以唯一标识网络中的设备,那么端口号就可以唯一标识设备中的进程(应用程序)了。
取值范围是0~65535。其中,0~1023之间的端口号用于一些知名的网络服务和应用
普通的应用程序需要使用1024以上的端口号。如果端口号被另外一个服务或应用所占用,会导致当前程序启动失败。
java.net.InetAddress ip地址
静态方法创建对象
static InetAddress getLocalHost() 返回本地主机的ip地址对象
static InetAddress getByName(String ip) 根据ip获取到ip地址对象 ip可以是网址 也可以是ip地址 也可以是主机名
UDP
UDP发送端
java.net.DatagramSocket
构造方法
public DatagramSocket() 发送端
方法
send(DatagramPacket dp) 发送数据包java.net.DatagramPacket
构造方法
DatagramPacket(byte[] buf, int length, InetAddress address, int port)
发送端数据包 封装 数据 接收端地址 接收端端口
public class UDPSend {
public static void main(String[] args) throws IOException {
// 1.创建发送端对象
DatagramSocket ds = new DatagramSocket();
// 2.创建数据包对象 封装数据 接收端地址 接收端的端口
byte[] bytes = "hello,UDP!".getBytes();
//接收端的ip地址对象
InetAddress ip = InetAddress.getByName("127.0.0.1");
//端口号
int port = 5555;
DatagramPacket dp = new DatagramPacket(bytes,bytes.length,ip,port);
// 3.调用发送端对象的send方法 发送数据包
ds.send(dp);
//关闭资源
ds.close();
}
}
UDP接收端
构造方法
public DatagramSocket(int port) 创建接收端绑定端口号
方法
void receive(DatagramPacket p) 接收数据包
java.net.DatagramPacket
构造方法
DatagramPacket(byte[] buf, int length) 接收端数据包
public class UDPReceive {
public static void main(String[] args) throws IOException {
//1.创建接收端对象
DatagramSocket ds = new DatagramSocket(5555);
//2.创建数据包对象
byte[] bytes = new byte[1024*64];
DatagramPacket dp = new DatagramPacket(bytes,bytes.length);
// 3.接收端对象调用 receive方法 接收数据包
ds.receive(dp);
// 4.拆包
int length = dp.getLength(); //获取发送过来数据的长度
InetAddress ip = dp.getAddress(); //获取发送端的ip地址
int port = dp.getPort(); //获取发送端发送数据的端口号
System.out.println(ip+":"+port+" "+new String(bytes,0,length));
ds.close();
}
}
TCP
java.net.Socket 客户端
构造方法
public Socket(String ip,int port) 绑定服务端ip和端口
public Socket(InetAddress ip ,int port)方法
public OutputStream getOutputStream() 获取字节输出流
public InputStream getInputStream() 获取字节输入流
public class TCPClient {
public static void main(String[] args) throws IOException {
// 1.创建客户端对象
Socket s = new Socket("127.0.0.1",6666);
// 2.获取字节输出流对象
OutputStream out = s.getOutputStream();
// 3.使用字节输出流向服务端写数据 "你好"
out.write("你好".getBytes());
System.out.println("-------------接收服务器返回的数据---------------");
// 4.获取字节输入流对象
InputStream in = s.getInputStream();
// 5.接收服务器返回的数据
byte[] bytes = new byte[1024];
int len = in.read(bytes);
System.out.println(new String(bytes,0,len));
// 6.关闭资源
in.close();
out.close();
s.close();
}
}
java.net.ServerSocket 服务端
构造方法
public ServerSocket(int port) 创建服务端对象 绑定端口号方法
Socket accept() 接收正在连接的客户端对象 具有阻塞功能
public class TCPServer {
public static void main(String[] args) throws IOException {
// 1.创建服务端对象
ServerSocket ss = new ServerSocket(6666);
//2.调用accept方法接收正在连接的客户端对象
Socket s = ss.accept();
// 3.获取字节输入流对象
InputStream in = s.getInputStream();
// 4.接收当前客户端发送过来的数据 "你好"
byte[] bytes = new byte[1024];
int len = in.read(bytes);
System.out.println(new String(bytes,0,len));
System.out.println("---------------向客户端返回数据-------------------");
// 5.获取字节输出流对象
OutputStream out = s.getOutputStream();
// 6.给客户端返回数据
out.write("大家好".getBytes());
// 7.关闭资源
out.close();
in.close();
s.close();
ss.close();
}
}