要實現區域網路連接,就必須知道訊息傳輸的原理。
在區域網路裡面傳輸的資訊都是以包的形式,我使用的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(); } } } }
以上是如何用Java建立多執行緒區域網路聊天室的詳細內容。更多資訊請關注PHP中文網其他相關文章!