내 연락처 정보
우편메소피아@프로톤메일.com
2024-07-12
한어Русский языкEnglishFrançaisIndonesianSanskrit日本語DeutschPortuguêsΕλληνικάespañolItalianoSuomalainenLatina
网络通信协议:通信协议是对计算机必须遵守的规则,只有遵守这些规则,计算机之间才能进行通信。
java.net 包中提供了两种常见的网络协议的支持
TCP의 3방향 핸드셰이크: TCP 프로토콜에서는 데이터 전송 준비 단계에서 연결의 신뢰성을 보장하기 위해 클라이언트와 서버 간에 세 가지 상호 작용이 있습니다.
协议 + IP地址 + 端口号
TCP通信能实现两台计算机之间的数据交互,通信的两端,要严格区分为客户端(Client)与服务端(Server)。
Java에서는 TCP 통신 프로그램을 구현하기 위해 두 가지 클래스가 제공됩니다.
Socket 类:该类实现客户端套接字,套接字指的是两台设备之间通讯的端点。
건설 방법:
public Socket(String host, int port)
:소켓 객체를 생성하고 이를 지정된 호스트의 지정된 포트 번호에 연결합니다. 지정된 호스트가 null인 경우 지정된 주소가 루프백 주소(루프백 주소(127.xxx)는 로컬 루프백 주소(Loopback Address)입니다.)。
회원 방법:
public InputStream getInputStream()
: 이 소켓의 입력 스트림을 반환합니다.public OutputStream getOutputStream()
: 이 소켓의 출력 스트림을 반환합니다.public void close()
: 이 소켓을 닫습니다.public void shutdownOutput()
: 이 소켓의 출력 스트림을 비활성화합니다.ServerSocket 类:这个类实现了服务器套接字,该对象等待通过网络的请求。
건설 방법:
public ServerSocket(int port): ServerSocket 객체를 생성할 때 이 생성자를 사용하여 포인터에 바인딩합니다.
특정 포트 번호에서 매개변수 port는 포트 번호입니다.
회원 방법:
public Socket accept()
: 연결을 수신하고 수락하고 클라이언트와의 통신을 위해 새 Socket 객체를 반환합니다.이 방법
연결이 설정될 때까지 차단됩니다.
TCP 통신 분석:
코드 예:
import java.io.IOException;
import java.io.InputStream;
import java.net.ServerSocket;
import java.net.Socket;
public class ServerTCP {
public static void main(String[] args) throws IOException {
System.out.println("服务端启动 , 等待连接 .... ");
// 1.创建 ServerSocket对象,绑定端口,开始等待连接
ServerSocket ss = new ServerSocket(6666);
// 2.接收连接 accept 方法, 返回 socket 对象.
Socket server = ss.accept();
// 3.通过socket 获取输入流
InputStream is = server.getInputStream();
// 4.一次性读取数据
// 4.1 创建字节数组
byte[] b = new byte[1024];
// 4.2 据读取到字节数组中.
int len = is.read(b);
// 4.3 解析数组,打印字符串信息
String msg = new String(b, 0, len);
System.out.println(msg);
//5.关闭资源.
is.close();
server.close();
}
}
서버는 포트 번호를 지정하고, accept() 메소드를 통해 Socket 객체를 획득하고, 클라이언트 객체를 통해 입력 스트림을 획득하고, 마지막으로 데이터를 읽고 클라이언트가 보낸 메시지를 기다립니다.
import java.net.Socket;
public class ClientTCP {
public static void main(String[] args) throws Exception {
System.out.println("客户端 发送数据");
// 1.创建 Socket ( ip , port ) , 确定连接到哪里.
Socket client = new Socket("localhost", 6666);
// 2.获取流对象 . 输出流
OutputStream os = client.getOutputStream();
// 3.写出数据.
os.write("你好么? tcp ,我来了".getBytes());
// 4. 关闭资源 .
os.close();
client.close();
}
}
클라이언트가 생성되면 서버에 대한 연결을 용이하게 하기 위해 연결의 IP 주소와 포트 번호를 지정하고 클라이언트 Socket 객체를 통해 출력 스트림과 출력 데이터를 얻습니다.
数据准备:
D 드라이브 아래에 test.jpg 파일을 넣고 테스트 폴더를 생성합니다.
코드 예:
import java.io.*;
import java.net.ServerSocket;
import java.net.Socket;
public class FileUpload_Server {
public static void main(String[] args) throws IOException {
System.out.println("服务器 启动..... ");
// 1. 创建服务端ServerSocket
ServerSocket serverSocket = new ServerSocket(6666);
// 2. 循环接收,建立连接
while (true) {
Socket accept = serverSocket.accept();
/* 3. socket对象交给子线程处理,进行读写操作Runnable接口中,只有一个run方法,使用lambda表达式简化格式 */
new Thread(() -> {
try ( //3.1 获取输入流对象
BufferedInputStream bis = new BufferedInputStream(accept.getInputStream());
//3.2 创建输出流对象, 保存到本地 .
FileOutputStream fis = new FileOutputStream("D:/test/" + System.currentTimeMillis() + ".jpg");
BufferedOutputStream bos = new BufferedOutputStream(fis)) {
// 3.3 读写数据
byte[] b = new byte[1024 * 8];
int len;
while ((len = bis.read(b)) != -1) {
bos.write(b, 0, len);
}
// 4.=======信息回写===========================
System.out.println("back ........");
OutputStream out = accept.getOutputStream();
out.write("上传成功".getBytes());
out.close();
//5. 关闭 资源
bos.close();
bis.close();
accept.close();
System.out.println("文件上传已保存");
} catch (IOException e) {
e.printStackTrace();
}
}).start();
}
}
}
여기서는 먼저 서버 개체를 생성하고 while(true)를 사용하여 서버에 대한 지속적인 연결을 확인한 다음 스레드를 시작하여 사용자가 대용량 파일을 업로드할 때 다른 사용자가 파일을 업로드하는 효율성에 영향을 미치지 않도록 합니다. 업로드 시 동일한 파일 이름으로 인해 파일 이름이 덮어쓰이는 일이 없도록 시스템 밀리초 + '.jpg'를 사용하여 파일 이름을 설정하세요.
import java.io.*;
import java.net.Socket;
public class FileUpload_Client {
public static void main(String[] args) throws IOException {
// 1.创建流对象
// 1.1 创建输入流,读取本地文件
BufferedInputStream bis = new BufferedInputStream(new FileInputStream("D:\test.jpg"));
// 1.2 创建输出流,写到服务端
Socket socket = new Socket("localhost", 6666);
BufferedOutputStream bos = new BufferedOutputStream(socket.getOutputStream());
//2.写出数据.
byte[] b = new byte[1024 * 8 ];
int len ;
while (( len = bis.read(b))!=-1) {
bos.write(b, 0, len);
}
// 关闭输出流,通知服务端,写出数据完毕
socket.shutdownOutput();
System.out.println("文件发送完毕");
// 3. =====解析回写============
InputStream in = socket.getInputStream();
byte[] back = new byte[20];
in.read(back);
System.out.println(new String(back));
in.close();
// ============================
// 4.释放资源
socket.close();
bis.close();
}
}
여기에서 사용자가 보낸 파일을 서버가 하드 디스크에 성공적으로 저장한 것을 볼 수 있습니다.
Java를 좋아하는 분들은 이 기사에 대해 알아보십시오. 저자는 계속해서 기사를 업데이트할 것이며 여러분의 관심과 수집을 기대합니다. . .