2024-07-12
한어Русский языкEnglishFrançaisIndonesianSanskrit日本語DeutschPortuguêsΕλληνικάespañolItalianoSuomalainenLatina
网络通信协议:通信协议是对计算机必须遵守的规则,只有遵守这些规则,计算机之间才能进行通信。
java.net 包中提供了两种常见的网络协议的支持
TCP इत्यस्मिन् त्रिपक्षीयहस्तप्रहारः : १. TCP प्रोटोकॉलमध्ये, दत्तांशप्रेषणस्य सज्जतापदे, संयोजनस्य विश्वसनीयतां सुनिश्चित्य क्लायन्ट्-सर्वरयोः मध्ये त्रीणि अन्तरक्रियाणि भवन्ति
协议 + IP地址 + 端口号
TCP通信能实现两台计算机之间的数据交互,通信的两端,要严格区分为客户端(Client)与服务端(Server)。
जावा मध्ये TCP संचारकार्यक्रमस्य कार्यान्वयनार्थं द्वौ वर्गौ प्रदत्तौ स्तः :
Socket 类:该类实现客户端套接字,套接字指的是两台设备之间通讯的端点。
निर्माणविधिः : १.
public Socket(String host, int port)
:एकं सॉकेट् ऑब्जेक्ट् रचयति तथा च निर्दिष्टे होस्ट् इत्यत्र निर्दिष्टेन पोर्ट् सङ्ख्यायाः सह संयोजयति । यदि निर्दिष्टः होस्ट् शून्यः अस्ति तर्हि निर्दिष्टसङ्केतस्य लूपबैकसङ्केतः (लूपबैक-सङ्केतः (127.xxx) स्थानीय-लूप्बैक्-सङ्केतः (Loopback Address) अस्ति ।)。
सदस्यविधयः : १.
public InputStream getInputStream()
: अस्य सॉकेट् कृते निवेशप्रवाहं प्रत्यागच्छति ।public OutputStream getOutputStream()
: अस्य सॉकेट् कृते आउटपुट् स्ट्रीम् प्रत्यागच्छति ।public void close()
: एतत् सॉकेटं पिधाय।public void shutdownOutput()
: अस्य सॉकेट् कृते आउटपुट् स्ट्रीम् अक्षमम् करोति ।ServerSocket 类:这个类实现了服务器套接字,该对象等待通过网络的请求。
निर्माणविधिः : १.
public ServerSocket(int port): ServerSocket ऑब्जेक्ट् निर्मायन्ते सति सूचकेन सह बाइण्ड् कर्तुं एतस्य कन्स्ट्रक्टर् इत्यस्य उपयोगं कुर्वन्तु ।
कस्मिंश्चित् पोर्ट् सङ्ख्यायां पैरामीटर् पोर्ट् पोर्ट् सङ्ख्या भवति ।
सदस्यविधयः : १.
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) इत्यस्य उपयोगं कुर्मः, ततः यदा कश्चन उपयोक्ता महतीं सञ्चिकां अपलोड् करोति तदा अन्येषां उपयोक्तृणां सञ्चिकाः अपलोड् करणस्य कार्यक्षमता प्रभाविता न भविष्यति इति सुनिश्चित्य एकं थ्रेड् आरभामः अपलोड्-काले समानसञ्चिकानामकारणात् सञ्चिकानाम अधिलिखितं न भविष्यति इति सुनिश्चित्य सञ्चिकानाम सेट् कर्तुं system milliseconds + '.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();
}
}
अत्र वयं द्रष्टुं शक्नुमः यत् अस्माकं सर्वरेण उपयोक्त्रा प्रेषिता सञ्चिका हार्डडिस्क मध्ये सफलतया रक्षिता ।
जावा-प्रेमिणः लेखस्य विषये ज्ञातुं स्वागतं कुर्वन्ति लेखकः तस्य अद्यतनीकरणं निरन्तरं करिष्यति तथा च भवतः ध्यानं संग्रहणं च प्रतीक्षते। . .