文章目录
一. 网络编程
底层数据的传输`
1.1 IP
定位节点
1.2端口(port)
区分不同软件,通过端口,可以在一个主机上运行多个网络应用程序。
1.3URL
统一资源定位符,可以直接从 URL 中读取字节流数据。
二、传输层协议
UDP:
简单,效率高,开销小,不安全,大小有限制
TCP****:
面向连接,安全,效率低,大小没限制
2.1 InetAddress:
封装计算机的ip地址和DNS的类,没有公有的构造函数,只能通过静态方法来创建实例。
InetAddress.getByName(“www.4399.com”)–返回 服务器的ip
InetAddress.getLocalHost–返回本地主机的地址。
InetAddress.getHostAddress–主机地址,以文本形式返回 IP 地址字符串。
InetAddress.getHostName–获取此 IP 地址的主机名
2.2 Socket:
Socket编程 : 套接字。 传输层为应用层开辟一个小口子,不同的传输层协议对Socket的实现不同,所以网络编程称之为面向Socket编程。
Socket: 客户端
ServerSocket:服务端
客户端和服务端通过OutputStream、InputStream进行输入输出,需要数据处理流DataOutputStream、DataInputStream来保证基本数据类型和String字节流的功能流。
三、在UDP协议下数据传输
UDP协议下实现基础的数据传输基于字节数组, UDP发送端与接收端是平等的。
客户端实现步骤:
- 定义发送端
- 准备数据
- 打包 DatagramPacket(byte[] buf, int offset, int length, SocketAddress address)
构造一个数据报包,用于将长度为length 、偏移量为offset的数据包发送到指定主机上的指定端口号。- 发送
- 关闭
//定义发送端,端口9999
DatagramSocket socket = new DatagramSocket(9999);
//准备数据
byte[] bytes = "hello".getBytes();
//打包
DatagramPacket packet = new DatagramPacket(bytes,0,bytes.length,new InetSocketAddress("localHost",9888));
//发送
socket.send(packet);
//关闭
socket.close();
接收端实现步骤:
- 定义接受端
- 准备一个包裹,用来接收数据
- 接受、处理数据
- 关闭
//定义接收端
DatagramSocket socket = new DatagramSocket(9888);
//准备接收数据的包
byte[] bytes = new byte[1024];
DatagramPacket packet = new DatagramPacket(bytes,0,bytes.length);
//接收
socket.receive(packet);
// 处理数据
// byte[] getData() 返回数据缓冲区
byte[] bytes1 = packet.getData();
int length = packet.getLength();
System.out.println(new String(bytes1,0,length));
//关闭
socket.close();
四、在TCP协议下数据传输
面相连接 基于三次握手连接,基于四次挥手断开;数据传输基于IO流,两端不平等.
客户端实现步骤:
- 1.定义我是客户端,同时建立与服务器端的连接,如果连接建立不成功,抛出异常,因为连接被拒绝
- 2.准备数据
- 3.获取字节输出流,往服务器发送数据
- 4.刷出
- 5.关闭
//1.我是发送端
Socket client = new Socket("127.0.0.1",9999);
//2.准备数据,
String message ="你好";
//3,创建连接,输出流
DataOutputStream output = new DataOutputStream(client.getOutputStream());
//4.写出
output.writeUTF(message);
//5.刷出
output.flush();
//6.关闭
output.close();
client.close();
服务端实现步骤:
- 1.建立服务器端
- 2.阻塞式监听
- 3.获取输入流,读取客户端发送的数据
- 4.处理数据
- 5.关闭
//我是服务端
ServerSocket server =new ServerSocket(9999);
//监听,建立联系
Socket client= server.accept();
//输入流,读取
DataInputStream inputStream = new DataInputStream(client.getInputStream());
String mess= inputStream.readUTF();
System.out.println(mess);
//关闭
inputStream.close();
server.close();
client.close();
五、课后练习
1.tcp实现文件上传,客户端本地读取文件内容发送端服务器端,服务器接收数据保存到本地文件中,实现文件上传
public class FileIn {
public static void main(String[] args) throws IOException {
//创建客户端
Socket socket = new Socket("127.0.0.1",8989);
//文件输入,读取文件,作为数据
InputStream input = new FileInputStream("D://test//1.txt");
int len = -1;
byte[] car = new byte[1024];
byte[] bytes = input.readAllBytes();
String me = new String(bytes);
/* String message=null;
while((len=input.read(car))!=-1) {
message=new String(car,0,len);
}*/
DataOutputStream data = new DataOutputStream(socket.getOutputStream());
//data.writeUTF(message);
data.writeUTF(me);
data.flush();
data.close();
//数据输出流
//刷出,关闭
}
}
public class FileOut {
public static void main(String[] args) throws IOException {
//定义服务端
ServerSocket server = new ServerSocket(8989);
//数据监听
Socket socket =server.accept();
DataInputStream in = new DataInputStream(socket.getInputStream());
//读取数据
String message = in.readUTF();
System.out.println(message);
//关闭
in.close();
socket.close();
server.close();
OutputStream out = new FileOutputStream("D://test//3.txt");
out.write(message.getBytes());
out.flush();
out.close();
}
}
2.tcp实现,客户端接收用户输入的用户名与密码信息,以username=zhangsan&password=123的格式发送到服务器,服务器端本地接收校验 当用户名为scott,密码为1234为登录成功,否则失败,结束服务器本地输出。
public class Login {
public static void main(String[] args) throws IOException {
//创建客户端
Socket socket = new Socket("127.0.0.1",8999);
//准备数据
Scanner in = new Scanner(System.in);
System.out.println("请输入用户名");
String username = in.next();
System.out.println("请输入用户名");
Scanner in1 = new Scanner(System.in);
String password = in1.next();
String message = "username="+username+"&password="+password;
System.out.println(message);
//输出流,写出数据
DataOutputStream out = new DataOutputStream(socket.getOutputStream());
out.writeUTF(message);
//刷出关闭
out.flush();
out.close();
}
}
public class Logout {
public static void main(String[] args) throws IOException {
//创建服务器接收端
ServerSocket server = new ServerSocket(8999);
//监听
Socket lis = server.accept();
//输入流+接收数据
DataInputStream data = new DataInputStream(lis.getInputStream());
//读取数据+判断数据
String strings = data.readUTF();
System.out.println(strings);
String[] arr = strings.split("&");
String[] user = arr[0].split("=");
/*if(user[1].equals("zhangsan")){
System.out.println("right");
}*/
String[] pass = arr[1].split("=");
if(user[1].equals("zhangsan")&&pass[1].equals("123")){
System.out.println("login success");
}
//关闭
lis.close();
server.close();
data.close();
}
}