τα στοιχεία επικοινωνίας μου
Ταχυδρομείο[email protected]
2024-07-12
한어Русский языкEnglishFrançaisIndonesianSanskrit日本語DeutschPortuguêsΕλληνικάespañolItalianoSuomalainenLatina
网络通信协议:通信协议是对计算机必须遵守的规则,只有遵守这些规则,计算机之间才能进行通信。
java.net 包中提供了两种常见的网络协议的支持
Τριμερής χειραψία στο TCP: Στο πρωτόκολλο TCP, στο στάδιο προετοιμασίας της αποστολής δεδομένων, υπάρχουν τρεις αλληλεπιδράσεις μεταξύ του πελάτη και του διακομιστή για να διασφαλιστεί η αξιοπιστία της σύνδεσης.
协议 + IP地址 + 端口号
TCP通信能实现两台计算机之间的数据交互,通信的两端,要严格区分为客户端(Client)与服务端(Server)。
Στην Java, παρέχονται δύο κλάσεις για την υλοποίηση προγραμμάτων επικοινωνίας TCP:
Socket 类:该类实现客户端套接字,套接字指的是两台设备之间通讯的端点。
Μέθοδος κατασκευής:
public Socket(String host, int port)
:Δημιουργεί ένα αντικείμενο υποδοχής και το συνδέει με τον καθορισμένο αριθμό θύρας στον καθορισμένο κεντρικό υπολογιστή. Εάν ο καθορισμένος κεντρικός υπολογιστής είναι μηδενικός, ισοδυναμεί με την καθορισμένη διεύθυνση που είναι η διεύθυνση βρόχου (Η διεύθυνση loopback (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();
}
}
Ο διακομιστής καθορίζει τον αριθμό θύρας, λαμβάνει το αντικείμενο Socket μέσω της μεθόδου accept(), λαμβάνει τη ροή εισόδου μέσω του αντικειμένου πελάτη και, τέλος, διαβάζει τα δεδομένα και περιμένει το μήνυμα που αποστέλλεται από τον πελάτη.
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 πελάτη.
数据准备:
Τοποθετήστε ένα αρχείο με το όνομα test.jpg κάτω από τη μονάδα δίσκου D και δημιουργήστε έναν δοκιμαστικό φάκελο
Παράδειγμα κώδικα:
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 είναι ευπρόσδεκτοι να μάθουν για το άρθρο Ο συγγραφέας θα συνεχίσει να το ενημερώνει και να περιμένει την προσοχή και τη συλλογή σας. . .