Java創(chuàng)建多線程局域網(wǎng)聊天室實例
局域網(wǎng)聊天室
在學習了一個學期的java以后,覺得java真是博大精深,徹底放棄了因為c++而輕視java的心態(tài),搞了一個多線程的聊天室,熟悉了一下服務(wù)器和客戶機的操作。
1.TCP
要實現(xiàn)局域網(wǎng)連接,就必須知道信息傳輸?shù)脑怼?br />
在局域網(wǎng)里面?zhèn)鬏數(shù)男畔⒍际且园男问?,我使用的TCP包傳輸數(shù)據(jù),TCP包里面封裝了IP報文。
下面這句話就是通過一個靜態(tài)IPV4協(xié)議的類得到一個服務(wù)器的IP地址。
address = InetAddress.getByName("192.168.43.86");
2.套接字
在TCP中得到了服務(wù)器的IP地址,但是光憑IP地址無法對具體應(yīng)用進行鎖定,所以引入了套接字這個概念。端口號用來鎖定主機的進程。端口號一般取1024~49151,因為0 ~ 1023是熟知端口號,一般用于一些HTTP等等常用的端口,49152 ~ 65535是臨時端口號,也不能隨機占用,一般是程序運行過程中的臨時分配。
套接字=IP+端口號
這句話就是定義一個端口號9998和IP為192.168.43.86的套接字。
int port = 9998; socket = new Socket(address,port);
3.C/S架構(gòu)

從Java類的角度看,服務(wù)器和客戶端通過套接字連接抽象了一個連接。服務(wù)器通過建立自己的套接字端口并監(jiān)聽有無客戶在此端口連接,實現(xiàn)信息的讀取功能??蛻魴C通過服務(wù)器約定好的端口號,來對服務(wù)器進行傳輸數(shù)據(jù)。在服務(wù)器開啟后,運行客戶機,將與服務(wù)器進行三次握手建立TCP連接,然后在此連接的基礎(chǔ)上,實現(xiàn)客戶機與服務(wù)器的通信。
4.多線程
由于服務(wù)器可能同時服務(wù)多個對象,若是采用傳統(tǒng)的方法進行服務(wù)器連接,則會出現(xiàn)多個客戶機等待一個客戶機與服務(wù)器交互的現(xiàn)象。為了解決這個問題,采用多線程的方法。
用SuperSocket類繼承socket類并實現(xiàn)Runnable接口,實現(xiàn)多線程運行。
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);
5.服務(wù)器
服務(wù)器的架構(gòu)第三部分所示,代碼實現(xiàn)如下
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);
//實例化具有多線程功能的服務(wù)器專用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"){
//結(jié)束線程
break;
}
}
} finally {
try {
//關(guān)閉套接字
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 {
//初始服務(wù)器型套接字
serverSocket = new ServerSocket(port);
buffer = new byte[1024];
} catch (IOException e) {
e.printStackTrace();
}
}
@Override
public void run() {
try {
//等待端口連接
socket = serverSocket.accept();
//連接完成后創(chuàng)建輸入流
is = socket.getInputStream();
//讀取客戶端傳送信息
int len = is.read(buffer);
String str = new String(buffer, 0, len);
System.out.println(str);
} catch (IOException e) {
e.printStackTrace();
}
}
}
客戶端
客戶端的架構(gòu)第三部分所示,代碼實現(xiàn)如下
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");
//規(guī)定端口號,建立套接字
int port = 9998;
socket = new Socket(address,port);
//綁定套接字的輸出流
os = socket.getOutputStream();
sca = new Scanner(System.in);
while(true) {
message = sca.next();
//寫入輸出流,在局域網(wǎng)中傳輸
os.write(message.getBytes());
}
} catch (UnknownHostException e) {
e.printStackTrace();
}catch (IOException e) {
e.printStackTrace();
}finally {
try {
//關(guān)閉端口號,關(guān)閉io流
os.close();
socket.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}
}
搞定,雖然特別簡陋,但是也能實現(xiàn)局域網(wǎng)類的通信。如果需要復(fù)制代碼的,記得改一下服務(wù)器的IP地址,IP地址可以在cmd下用ipconfig命令查看。打算期末考試完了以后再加上GUI并把這個功能加到具有alpha剪枝算法的AI六子棋對戰(zhàn)中去。
到此這篇關(guān)于Java創(chuàng)建多線程局域網(wǎng)聊天室實例的文章就介紹到這了,更多相關(guān)Java創(chuàng)建多線程聊天室內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
Java中Integer.parseInt和Integer.valueOf區(qū)別小結(jié)
在Java中,Integer.parseInt()和Integer.valueOf()都可以將字符串轉(zhuǎn)換為整數(shù)類型,那么他們有哪些區(qū)別呢,本文就來詳細的介紹一下2023-09-09
SpringBoot中Controller參數(shù)與返回值的用法總結(jié)
這篇文章主要介紹了SpringBoot中Controller參數(shù)與返回值的用法,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教2023-07-07
使用@pathvariable與@requestparam碰到的一些問題及解決
這篇文章主要介紹了使用@pathvariable與@requestparam碰到的一些問題及解決,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教2021-08-08

