网络编程三要素 ? ? ? ?协议????????IP地址????????端口号
协议
协议 ? ? ? ? ? ? ?计算机之间进行数据传输需要遵守的规则 ? ? ? ? ? ? ?UDP: ? ? ? ? ? ? ? ? 面向无连接的通信协议,两台计算机进行数据传输不需要建立连接, ? ? ? ? ? ? ? ? 发送端给接收端发送数据 不会确认接收端是否存在 接收端接收到数据 也不会告知发送端
特点 ? ? ? ? ? ? ? ? ? ? 两台计算机不需要建立连接 ,消耗资源少,发送效率高,但是每次发送的最大不能超过64KB ? ? ? ? ? ? ? ? ? ? 不保证数据的完整性 ? ? ? ? ? ? ?TCP: ? ? ? ? ? ? ? ? ?面向连接的通信协议,客户端与服务端必须建立连接,可以保证两台计算机之间可靠的无差错的数据传输.
? ? ? ? ? ? ? ? ?客户端 -----> 服务端 ? ? ? ? ? ? ? ? ?客户端 <----- 服务端 ? ? ? ? ? ? ? ? ?客户端 -----> 服务端
? ? ? ? ? ? ? ? ?特点 ? ? ? ? ? ? ? ? ? ? ?必须建立连接,消耗资源多,发送效率低,但是每次发送数据没有限制,可以保证数据的完整性
? ? ? ? ? ? ? ? ? ? ?上传与下载一定使用TCP协议
? IP地址
查看本机ip ?ipconfig
查看网络是否能够连通
ping ?ip地址 ?ping ?网址
特殊的ip 127.0.0.1
localhost
端口号
如果说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();
}
}
|