informasi kontak saya
Surat[email protected]
2024-07-12
한어Русский языкEnglishFrançaisIndonesianSanskrit日本語DeutschPortuguêsΕλληνικάespañolItalianoSuomalainenLatina
Semua API Socket disediakan oleh sistem. API yang disediakan oleh sistem yang berbeda berbeda-beda, tetapi API sistem ini diringkas lebih lanjut dalam Java.
Socket api di UDP berfokus pada dua kelas: DatagramSocket dan DatagramPacket
Fungsi kelas ini dapat dikatakan sebagai remote control untuk “mengoperasikan kartu jaringan”, yaitu operasi membaca dan menulis pada kartu jaringan, yang dapat dipahami sebagai membaca dan menulis seperti file.
Beberapa metode disediakan:
Kelas ini menjelaskan datagram UDP. Objek DatagramPacket setara dengan datagram UDP. Setelah dikirim dan diterima, objek DatagramPacket dikirimkan.
Gema: Klien mengirimkan permintaan berbeda ke server, dan server mengembalikan respons berbeda. Tapi gema di sini adalah apa yang diminta klien ke server, dan server merespons tanpa perhitungan atau logika bisnis apa pun.
public class udpEchoServer {
public DatagramSocket socket = null;
public udpEchoServer(int port) throws SocketException {
socket = new DatagramSocket(port);
}
public void start() throws IOException {
System.out.println("服务器启动!!!");
while (true) {
//接受客户端请求
DatagramPacket requestPacket = new DatagramPacket(new byte[4096],4096);
socket.receive(requestPacket);
//为了更好处理数据并方便打印,将接受的数据转化为字符串操作
String request = new String(requestPacket.getData(),0,requestPacket.getLength());
//处理客户端的请求(算术计算或者业务逻辑)
String response = this.process(request);
//将处理完的请求返还给客户端
DatagramPacket resposePacket = new DatagramPacket(response.getBytes(),0,response.getBytes().length,
requestPacket.getSocketAddress());
socket.send(resposePacket);
//打印客户端的ip地址端口号和接收客户端的数据以及处理完客户端后的数据
System.out.printf("[%s:%d] req = %s,resp = %sn",requestPacket.getAddress(),requestPacket.getPort(),
request,response);
}
}
public String process(String request) {
return request;
}
public static void main(String[] args) throws IOException {
udpEchoServer udpEchoServer = new udpEchoServer(9999);
udpEchoServer.start();
}
}
Objek DatagramPacket mewakili datagram. Datagram UDP terdiri dari header dan payload. Alamat IP dan nomor port di header adalah atribut dari kelas DatagramPacket, tetapi kelas payload tidak disediakan, jadi pemrogram perlu melakukannya. Disediakan sendiri, jadi seperti seorang biksu yang meminta sedekah, Anda perlu menyediakan mangkuk untuk sedekah, dan kemudian setiap keluarga memasukkan makanan ke dalam mangkuk tersebut. Karena inti dari datagram adalah data biner, saya menyediakan array byte sebagai muatannya . Menyimpan data.
Data yang diterima dari klien harus dikembalikan ke klien setelah diproses oleh server, sehingga perlu dibuat objek DatagramPacket untuk menyimpan data yang diproses oleh server, kemudian server mengirimkannya ke klien. Saat ini objek DatagramPacket tidak perlu menyediakan ruang kosong, cukup masukkan data yang telah diproses ke dalam objek ini Karena alamat IP klien dan nomor port dicatat saat menerima data, hanya alamat IP dan nomor port klien dicatat saat mengirimkannya ke klien. Anda perlu mendapatkan alamat IP dan nomor port klien melalui requestPacket.getSocketAddress().
Karena servernya tetap, Anda dapat langsung mengatur sendiri nomor portnya. Nomor port tersebut dibuat saat server dimulai.
Mengapa saya memerlukan alamat IP nomor port?
Untuk mencapai keberhasilan komunikasi antara kedua pihak, empat indikator inti berikut harus ada:
Port sumber, IP sumber, port tujuan, IP tujuan
Melalui keempat indikator inti ini, komunikasi jaringan antara kedua pihak dapat tercapai. Tidak ada alamat IP server di sini karena klien dan server berada di host yang sama. Kita dapat menggunakan IP untuk mewakili 172.0.0.1, juga dikenal sebagai IP loopback.
public class udpEchoClient {
private DatagramSocket socket = null;
private String serverIp;
private int serverProt;
public udpEchoClient(String serverIp, int serverProt) throws SocketException {
socket = new DatagramSocket();
this.serverIp = serverIp;
this.serverProt = serverProt;
}
public void start() throws IOException {
System.out.println("客户端启动!");
//1.从控制台获取字符串
Scanner scanner = new Scanner(System.in);
while(true) {
System.out.println("请输入要发送的请求: ");
String request = scanner.nextLine();
//2.将输入的字符串发送给服务器,还要将发送的目标确定,IP和端口号
DatagramPacket requestPacket = new DatagramPacket(request.getBytes(), 0, request.getBytes().length,
InetAddress.getByName(serverIp), serverProt);
socket.send(requestPacket);
//3.从服务器读取到经过处理的响应
DatagramPacket responsePackt = new DatagramPacket(new byte[4096], 4096);
socket.receive(responsePackt);
//将响应打印在控制台
String response = new String(responsePackt.getData(), 0, responsePackt.getLength());
System.out.println(response);
}
}
public static void main(String[] args) throws IOException {
udpEchoClient udpEchoClient = new udpEchoClient("127.0.0.1",9999);
udpEchoClient.start();
}
}
Untuk string yang diterima dari konsol, objek requestPacket memperoleh referensi dan panjang objek string, serta IP dan Protnya sendiri, dan kemudian mengirimkannya ke server melalui metode kirim soket.
Untuk menerima respon dari server, Anda perlu membuat objek responPackt dan membuat array byte kosong terlebih dahulu untuk menerima respon yang diterima dari server.
Bedakan beberapa metode:
Sebelum membedakan metode, kita perlu memahami konsep byte, karakter, dan bentuk pengkodean
Byte dan karakter pada dasarnya adalah biner, yaitu data seperti 0101, karena komputer hanya mengenali 0101.
Byte: Byte adalah unit dasar untuk penyimpanan data komputer. 1 byte adalah 8 bit. Setiap bit bisa bernilai 0 atau 1, artinya satu byte dapat mewakili 256 nilai berbeda.
Karakter: Karakter adalah unit dasar untuk mewakili informasi teks. Menurut bentuk pengkodean yang berbeda, jumlah byte yang sesuai dengan karakter bervariasi. Melalui bentuk pengkodean, karakter dapat diubah menjadi byte dan kemudian byte dapat digunakan untuk mewakili data data dan menyimpan data.
Bentuk pengkodean:
Metodenya berbeda:
Di sini kita dapat menerapkan gagasan pewarisan dan polimorfisme untuk mengimplementasikan server ini, karena perbedaan penting antara server terjemahan kamus dan server gema adalah pemrosesan respons, sehingga kita dapat mewarisi dan menggunakan kembali kode yang diulang dan memperluas kode yang diperlukan.
public class udpDictServer extends udpEchoServer{
HashMap<String,String> map = null;
public udpDictServer(int port) throws SocketException {
super(port);
map = new HashMap<>();
map.put("server","服务");
map.put("client","客户端");
map.put("cat","🐱");
map.put("dog","🐕");
map.put("pig","🐖");
}
@Override
public String process(String request) {
return map.getOrDefault(request, "该词汇没有查询到");
}
public static void main(String[] args) throws IOException {
udpDictServer udpDictServer = new udpDictServer(9999);
udpDictServer.start();
}
}
Untuk mengimplementasikan terjemahan kamus ini, Anda juga memerlukan peta dalam struktur data, dan menggunakan pasangan nilai kunci di peta untuk menyimpan data.
Kemudian operasi bisnis tertentu hanya perlu menulis ulang metode prosesnya.
Saat dijalankan di sini, meskipun ini mengacu pada objek udpEchoServer dari kelas induk, karena subkelas udpDictServer mewarisi kelas induk udpEchoServer dan mengesampingkan metode proses, metode proses yang dijalankan karena fitur polimorfik sebenarnya adalah proses dari metode subkelas.