您好,登錄后才能下訂單哦!
這篇文章主要講解了“怎么用Java創建多線程局域網聊天室”,文中的講解內容簡單清晰,易于學習與理解,下面請大家跟著小編的思路慢慢深入,一起來研究和學習“怎么用Java創建多線程局域網聊天室”吧!
在學習了一個學期的java以后,覺得java真是博大精深,徹底放棄了因為c++而輕視java的心態,搞了一個多線程的聊天室,熟悉了一下服務器和客戶機的操作。
要實現局域網連接,就必須知道信息傳輸的原理。
在局域網里面傳輸的信息都是以包的形式,我使用的TCP包傳輸數據,TCP包里面封裝了IP報文。
下面這句話就是通過一個靜態IPV4協議的類得到一個服務器的IP地址。
address = InetAddress.getByName("192.168.43.86");
在TCP中得到了服務器的IP地址,但是光憑IP地址無法對具體應用進行鎖定,所以引入了套接字這個概念。端口號用來鎖定主機的進程。端口號一般取1024~49151,因為0 ~ 1023是熟知端口號,一般用于一些HTTP等等常用的端口,49152 ~ 65535是臨時端口號,也不能隨機占用,一般是程序運行過程中的臨時分配。
套接字=IP+端口號
這句話就是定義一個端口號9998和IP為192.168.43.86的套接字。
int port = 9998; socket = new Socket(address,port);
從Java類的角度看,服務器和客戶端通過套接字連接抽象了一個連接。服務器通過建立自己的套接字端口并監聽有無客戶在此端口連接,實現信息的讀取功能。客戶機通過服務器約定好的端口號,來對服務器進行傳輸數據。在服務器開啟后,運行客戶機,將與服務器進行三次握手建立TCP連接,然后在此連接的基礎上,實現客戶機與服務器的通信。
由于服務器可能同時服務多個對象,若是采用傳統的方法進行服務器連接,則會出現多個客戶機等待一個客戶機與服務器交互的現象。為了解決這個問題,采用多線程的方法。
用SuperSocket類繼承socket類并實現Runnable接口,實現多線程運行。
class SuperSocket extends Socket implements Runnable
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);
服務器的架構第三部分所示,代碼實現如下
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(); } } }
客戶端
客戶端的架構第三部分所示,代碼實現如下
package TCP; import java.io.IOException; import java.io.OutputStream; import java.net.InetAddress; import java.net.Socket; import java.net.UnknownHostException; import java.util.Scanner; public class TCPclient { public static void main(String[] args) { InetAddress address=null; Socket socket=null; OutputStream os=null; String message=null; Scanner sca=null; try { //得到本機IP地址 address = InetAddress.getByName("192.168.43.86"); //規定端口號,建立套接字 int port = 9998; socket = new Socket(address,port); //綁定套接字的輸出流 os = socket.getOutputStream(); sca = new Scanner(System.in); while(true) { message = sca.next(); //寫入輸出流,在局域網中傳輸 os.write(message.getBytes()); } } catch (UnknownHostException e) { e.printStackTrace(); }catch (IOException e) { e.printStackTrace(); }finally { try { //關閉端口號,關閉io流 os.close(); socket.close(); } catch (IOException e) { e.printStackTrace(); } } } }
搞定,雖然特別簡陋,但是也能實現局域網類的通信。如果需要的,記得改一下服務器的IP地址,IP地址可以在cmd下用ipconfig命令查看。打算期末考試完了以后再加上GUI并把這個功能加到具有alpha剪枝算法的AI六子棋對戰中去。
感謝各位的閱讀,以上就是“怎么用Java創建多線程局域網聊天室”的內容了,經過本文的學習后,相信大家對怎么用Java創建多線程局域網聊天室這一問題有了更深刻的體會,具體使用情況還需要大家實踐驗證。這里是億速云,小編將為大家推送更多相關知識點的文章,歡迎關注!
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。