Untuk mencapai sambungan LAN, anda mesti mengetahui prinsip penghantaran maklumat.
Maklumat yang dihantar dalam LAN adalah dalam bentuk paket Saya menggunakan paket TCP untuk menghantar data, dan paket IP terkandung dalam paket TCP.
Ayat berikut adalah untuk mendapatkan alamat IP pelayan melalui kelas protokol IPV4 statik.
address = InetAddress.getByName("192.168.43.86");
Alamat IP pelayan diperoleh dalam TCP, tetapi alamat IP sahaja tidak boleh mengunci aplikasi tertentu, jadi konsep soket diperkenalkan. Nombor port digunakan untuk mengunci proses hos. Nombor port biasanya 1024~49151, kerana 0~1023 ialah nombor port yang terkenal dan biasanya digunakan untuk beberapa port biasa seperti HTTP 49152~65535 ialah nombor port sementara dan tidak boleh diduduki secara rawak diperuntukkan semasa program dijalankan.
Soket = IP + nombor port
Ayat ini mentakrifkan soket dengan nombor port 9998 dan IP 192.168.43.86.
int port = 9998; socket = new Socket(address,port);
Dari perspektif kelas Java, pelayan dan klien mengabstrak sambungan melalui sambungan soket. Pelayan merealisasikan fungsi membaca maklumat dengan mewujudkan port soketnya sendiri dan memantau sama ada pelanggan menyambung ke port ini. Pelanggan menghantar data ke pelayan melalui nombor port yang dipersetujui oleh pelayan. Selepas pelayan dihidupkan, jalankan klien dan lakukan jabat tangan tiga hala dengan pelayan untuk mewujudkan sambungan TCP Kemudian, berdasarkan sambungan ini, komunikasi antara klien dan pelayan direalisasikan.
Memandangkan pelayan boleh menyediakan berbilang objek pada masa yang sama, jika kaedah tradisional digunakan untuk sambungan pelayan, akan terdapat berbilang pelanggan menunggu untuk satu pelanggan berinteraksi dengan pelayan. Untuk menyelesaikan masalah ini, pendekatan multi-threading digunakan.
Gunakan kelas SuperSocket untuk mewarisi kelas soket dan melaksanakan antara muka Runnable untuk mencapai operasi berbilang benang.
class SuperSocket extends Socket implements Runnablerrree
Seni bina pelayan ditunjukkan di bahagian ketiga Kod ini dilaksanakan seperti berikut
SuperSocket socket_1 = new SuperSocket(9999); SuperSocket socket_2 = new SuperSocket(9998); SuperSocket socket_3 = new SuperSocket(9997); Thread s1 = new Thread(socket_1); Thread s2 = new Thread(socket_2); Thread s3 = new Thread(socket_3);
Klien
Seni bina. daripada pelanggan ditunjukkan dalam bahagian ketiga Seperti yang ditunjukkan, pelaksanaan kod adalah seperti berikut
package TCP; import java.io.IOException; import java.io.InputStream; import java.net.ServerSocket; import java.net.Socket; import java.util.Scanner; public class TCPserver2 { public static void main(String[] args) { Scanner scan = new Scanner(System.in); //实例化具有多线程功能的服务器专用socket类 //需要传递端口号作为初始化变量 SuperSocket socket_1 = new SuperSocket(9996); SuperSocket socket_2 = new SuperSocket(9998); SuperSocket socket_3 = new SuperSocket(9997); //建立三个子线程 Thread s1 = new Thread(socket_1); Thread s2 = new Thread(socket_2); Thread s3 = new Thread(socket_3); try { while(true) { //开启线程 s1.start(); s2.start(); s3.start(); if(scan.next()=="123"){ //结束线程 break; } } } finally { try { //关闭套接字 socket_1.close(); socket_2.close(); socket_3.close(); } catch (IOException e) { e.printStackTrace(); } } } } class SuperSocket extends Socket implements Runnable{ InputStream is; byte[] buffer; Socket socket=null; ServerSocket serverSocket=null; public SuperSocket(int port){ try { //初始服务器型套接字 serverSocket = new ServerSocket(port); buffer = new byte[1024]; } catch (IOException e) { e.printStackTrace(); } } @Override public void run() { try { //等待端口连接 socket = serverSocket.accept(); //连接完成后创建输入流 is = socket.getInputStream(); //读取客户端传送信息 int len = is.read(buffer); String str = new String(buffer, 0, len); System.out.println(str); } catch (IOException e) { e.printStackTrace(); } } }
Atas ialah kandungan terperinci Cara membuat ruang sembang LAN berbilang benang di Java. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!