网络通信协议
- 应用层
- 传输层
- tcp(Transaction control protocol 传输控制协议) 、udp(user datagram protocol 用户数据报协议)
- udp协议:面向无连接的协议,效率高,丢包多
- tcp协议:面向连接,有三次握手,相对udp安全,但没有udp效率高。
网络编程三要素
Tcp通信概念
通信的步骤
- 服务器端先启动
- 服务器端不会主动的请求客户端,必须使用客户端请求服务器端
- 客户端和服务器端建立一个逻辑上的链接,这个链接包含一个对象,这个对象就是IO对象,之后二者就可以用IO对象进行通信了
- 通信的数据不仅仅是字符,所以IO对象是字节流对象
客户端必须明确两件事情 1.多个客户端同时和服务器端进行交互,服务器端必须明确和那个客户端进行交互,在服务器端有一个方法,叫accept,可以获取到请求的客户端对象 2.多个客户端同时和服务器进行交互,就需要使用多个IO流对象 服务器是没有IO流的,服务器可以获取到请求的客户端对象Socket使用每个客户端Socket中提供的IO流和客户端进行交互, 服务器使用客户端的字节输入流读取客户端发送的数据, 服务器端使用客户端的字节输出流发送给客户端信息。
tcp通信的服务端
package net;
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import java.net.ServerSocket;
import java.net.Socket;
public class TcpServer {
public static void main(String[] args) throws IOException {
ServerSocket serverSocket = new ServerSocket(8888);
Socket socket = serverSocket.accept();
InputStream inputStream = socket.getInputStream();
byte car[] = new byte[1024];
int len = 0;
len = inputStream.read(car);
System.out.println("客户端发送的数据---------------" + new String(car, 0, len));
OutputStream outputStream = socket.getOutputStream();
outputStream.write("服务器收到".getBytes());
socket.close();
serverSocket.close();
}
}
TCP通信客户端
package net;
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import java.net.Socket;
public class TCPClient {
public static void main(String[] args) throws IOException {
Socket socket = new Socket("127.0.0.1", 8888);
OutputStream outputStream = socket.getOutputStream();
outputStream.write("你好服务器".getBytes());
InputStream inputStream = socket.getInputStream();
byte[] car = new byte[1024];
int len = 0;
len = inputStream.read(car);
System.out.println("服务器返回的数据 -------------" + new String(car, 0, len));
socket.close();
}
}
文件上传案例
分析
客户端服务器端代码
启动时先启动服务器端的代码
package net_fileUpload;
import java.io.*;
import java.net.ServerSocket;
import java.net.Socket;
public class TcpServer {
public static void main(String[] args) throws IOException {
ServerSocket serverSocket = new ServerSocket(8888);
Socket accept = serverSocket.accept();
InputStream inputStream = accept.getInputStream();
File file = new File("F:\\uploadFile");
if (!file.exists()){
file.mkdir();
}
FileOutputStream fileOutputStream = new FileOutputStream(file + "\\copy.txt");
int len = 0;
byte[] bytes = new byte[1024];
while ((len = inputStream.read(bytes)) != -1){
fileOutputStream.write(bytes,0,len);
}
OutputStream outputStream = accept.getOutputStream();
outputStream.write("上传成功".getBytes());
outputStream.close();
fileOutputStream.close();
inputStream.close();
serverSocket.close();
}
}
客户端代码
package net_fileUpload;
import java.io.FileInputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import java.net.Socket;
public class TcpClient {
public static void main(String[] args) throws IOException {
FileInputStream fileInputStream = new FileInputStream("F:\\aaa.txt");
Socket socket = new Socket("127.0.0.1",8888);
OutputStream outputStream = socket.getOutputStream();
int len = 0;
byte[] car = new byte[1024];
while ((len = fileInputStream.read(car)) != -1) {
outputStream.write(car, 0, len);
}
socket.shutdownOutput();
InputStream inputStream = socket.getInputStream();
while ((len = inputStream.read(car)) != -1) {
System.out.println("服务器说" + new String(car, 0, len));
}
socket.close();
fileInputStream.close();
}
}
客户端服务器代码优化
视频
b\s架构案例
https://www.bilibili.com/video/BV144411X79Q?p=15
|