网络编程
一、网络编程入门
1. 网络编程三要素
网络编程实现,不同计算机之间的数据交换
网络编程三要素:
- IP地址
计算机的标识符 - 端口
网络通信本质上是两个应用程序之间的通信。端口是应用程序的标识 - 协议
遵守的规则(UDP协议和TCP协议)
IP
常用命令:
- ipconfig:查看本机ip地址
- ping IP地址:检查网络是否连通
- 特殊ip地址:127.0.0.1
回送地址,可以代表本机,一般用来测试
端口
- 应用程序的唯一标识
- 0- 65535,0~1023知名网络服务,不要用
协议
-
连接和通讯的规则叫做协议
-
UDP:
UDP是无连接通信协议,即在数据传输时,数据的发送端和接收端不建立逻辑连接。简单来说,当一台计算机向另外一台计算机发送数据时,发送端不会确认接收端是否存在,就会发出数据,同样接收端在收到数据时,也不会向发送端反馈是否收到数据。由于使用UDP协议消耗资源小,通信效率高,所以通常都会用于音频、视频和普通数据的传输
例如视频会议通常采用UDP协议,因为这种情况即使偶尔丢失一两个数据包,也不会对接收结果产生太大影响。但是在使用UDP协议传送数据时,由于UDP的面向无连接性,不能保证数据的完整性,因此在传输重要数据时不建议使用UDP协议
-
TCP
传输控制协议(Transmission Control Protocol)TCP协议是面向连接的通信协议,即传输数据之前,在发送端和接收端建立逻辑连接,然后再传输数据,它提供了两台计算机之间可靠无差错的数据传输。在TCP连接中必须要明确客户端与服务器端,由客户端向服务端发出连接请求,每次连接的创建都需要经过“三次握手”
三次握手:TCP协议中,在发送数据的准备阶段,客户端与服务器之间的三次交互,以保证连接的可靠
2. UDP通信程序
不可靠网络协议,两端建立Socket对象
发数据:
package arrays;
import java.io.IOException;
import java.net.*;
public class Demo {
public static void main(String[] args) throws IOException {
//创建发送对象
DatagramSocket datagramSocket = new DatagramSocket();
byte[] bys = "hello,udp,我来了!".getBytes();
DatagramPacket datagramPacket = new DatagramPacket(bys,bys.length, InetAddress.getByName("192.168.1.66"),10086);
datagramSocket.send(datagramPacket);
datagramSocket.close();
}
}
接数据:
package arrays;
import java.io.IOException;
import java.net.DatagramPacket;
import java.net.DatagramSocket;
public class ReceiveDemo {
public static void main(String[] args) throws IOException {
//创建数据接收对象
DatagramSocket ds = new DatagramSocket(10086);
byte[] bys = new byte[1024];
DatagramPacket dp = new DatagramPacket(bys, bys.length);
//接收数据
ds.receive(dp);
//解析数据并显示
System.out.println("数据是:" + new String(dp.getData(), 0, dp.getLength()));
ds.close();
}
}
案例:UDP发送接受数据练习
package arrays;
import java.io.IOException;
import java.net.*;
import java.util.Scanner;
public class SendDemo {
public static void main(String[] args) throws IOException {
DatagramSocket ds = new DatagramSocket();
Scanner sc = new Scanner(System.in);
String line1 = sc.nextLine();
while (!line1.equals("886")) {//不是886,打包数据并发送
DatagramPacket dp = new DatagramPacket(line1.getBytes(), line1.getBytes().length, InetAddress.getByName("127.0.0.1"), 12345);
ds.send(dp);
line1 = sc.nextLine();
}
ds.close();
}
}
package arrays;
import java.io.IOException;
import java.net.DatagramPacket;
import java.net.DatagramSocket;
public class ReceiveDemo {
public static void main(String[] args) throws IOException {
DatagramSocket ds = new DatagramSocket(12345);
while (true) {//接受 ,解析
byte[] bys = new byte[1024];
DatagramPacket dp = new DatagramPacket(bys, bys.length);
ds.receive(dp);
System.out.println("数据是:" + new String(dp.getData(), 0, dp.getLength()));
}
}
}
老师写的关于发送的简单,里面特殊流不熟练,理解不透彻
package arrays;
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.net.*;
import java.nio.charset.StandardCharsets;
import java.util.Scanner;
public class SendDemo {
public static void main(String[] args) throws IOException {
DatagramSocket ds = new DatagramSocket();
//键盘录入封装(不熟练)
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
String line;
while ((line = br.readLine()) != null) {
//886结束
if (line.equals("886")) {
break;
}
DatagramPacket dp = new DatagramPacket(line.getBytes(), line.getBytes().length, InetAddress.getByName("127.0.0.1"), 12345);
ds.send(dp);
}
ds.close();
/* DatagramSocket ds = new DatagramSocket();
Scanner sc = new Scanner(System.in);
String line1 = sc.nextLine();
while (!line1.equals("886")) {//不是886,打包数据并发送
DatagramPacket dp = new DatagramPacket(line1.getBytes(), line1.getBytes().length, InetAddress.getByName("127.0.0.1"), 12345);
ds.send(dp);
line1 = sc.nextLine();
}
ds.close();*/
}
}
3. TCP通信程序
原理:
TCP通信协议是一种可靠的网络协议,它在通信的两端各建立一个Socket对象,从而在通信的两端形成网络虚拟链路,一旦建立了虚拟的网络链路,两端的程序就可以通过虚拟链路进行通信
Java对基于TCP协议的的网络提供了良好的封装,使用Socket对象来代表两端的通信端口,并通过Socket产生IO流来进行网络通信
Java为客户端提供了Socket类,为服务器端提供了ServerSocket类
发送数据:
三个步骤:
package arrays;
import java.io.*;
import java.net.*;
public class SendDemo {
public static void main(String[] args) throws IOException {
//创建客户端Socket对象
Socket s = new Socket("127.0.0.1", 10000);
//获取输出流,写数据
OutputStream os = s.getOutputStream();
os.write("hello,TCP,我来了".getBytes());
//释放资源
s.close();
}
}
接收数据
package arrays;
import java.io.IOException;
import java.io.InputStream;
import java.net.ServerSocket;
import java.net.Socket;
public class ReceiveDemo {
public static void main(String[] args) throws IOException {
//创建服务器对象
ServerSocket ss = new ServerSocket(10000);
//Socket accept()侦听要连接到此套接字并接受它【监听客户端连接并返回Socket对象】
Socket s = ss.accept();
//获取输入流,读取数据,并显示
InputStream is = s.getInputStream();
byte[] bys = new byte[1024];
int len = is.read(bys);
System.out.println("数据是:" + new String(bys, 0, len));
ss.close();
s.close();
}
}