电脑知识|欧美黑人一区二区三区|软件|欧美黑人一级爽快片淫片高清|系统|欧美黑人狂野猛交老妇|数据库|服务器|编程开发|网络运营|知识问答|技术教程文章 - 好吧啦网

您的位置:首頁技術文章
文章詳情頁

JAVA實現SOCKET多客戶端通信的案例

瀏覽:2日期:2022-08-20 10:32:52

一、ServerSocket

1.為了方便調試,先創建一個界面用于顯示客戶端連接信息

JAVA實現SOCKET多客戶端通信的案例

基于javafx包寫的一個簡單界面!

javafx.scene.control.TextArea ta = new javafx.scene.control.TextArea(); @Override public void start(Stage primaryStage) throws Exception { scene = new Scene(ta,450,200); primaryStage.setTitle('SocketServer'); primaryStage.setScene(scene); primaryStage.show(); pStage = primaryStage; new Thread(new MyServer()).start(); //創建線程啟動Socket服務 }

2.啟動Socket服務

public class MyServer implements Runnable{ @Override public void run() { try{ java.net.ServerSocket serverSocket = new java.net.ServerSocket(8000); ta.appendText('Server started at ' + new Date()+'n'); while(true){ Socket socket = serverSocket.accept(); //程序會在這里阻塞,直到等到客戶端連接 clientNumber++; /* 這里就是在界面中輸出一些服務器、和連接的客戶端信息 */ Platform.runLater(()->{ ta.appendText('Starting thread for client ' + clientNumber + ' at ' +new Date() +'n'); InetAddress inetAddress = socket.getInetAddress(); ta.appendText('Client '+clientNumber + '’s host name is' +inetAddress.getHostName() +'n'); ta.appendText('Client'+clientNumber + '’s IP address is '+ inetAddress.getHostAddress()+'n'); }); /* 每有一個客戶端連接服務器就創建一個線程,進行通信處理 */ new Thread(new HandleServer(socket)).start(); try{ Thread.sleep(100); //多個客戶端連續快速連接服務器時,可能出現問題,這里設置延時 }catch (InterruptedException e){ e.printStackTrace(); } } }catch (IOException e){ e.printStackTrace(); } } }

這一段代碼主要作用就是循環等待客戶端連接服務器:

Socket socket = serverSocket.accept();

在寫這篇博客時,突然想知道阻塞的原理就去查了一下。。。。

然而并沒有看懂。。這個應該涉及到操作系統層面,等之后把操作系統搞明白了在來補充吧。

3.服務器處理類HandleServer

class HandleServer implements Runnable { private Socket socket; private int name; private int toClientID; private DataOutputStream outputStream; private DataInputStream inputStream; public HandleServer(Socket socket){ this.socket = socket; ServerTools.Tools().add(this); this.name = clientNumber; } @Override public void run() { try{ inputStream = new DataInputStream(socket.getInputStream()); outputStream = new DataOutputStream(socket.getOutputStream()); outputStream.writeUTF('Your ID is:'+clientNumber); while (true){ toClientID = inputStream.readInt(); String messageGET = inputStream.readUTF(); int err = ServerTools.Tools().MyWriteUTF(messageGET,toClientID); //MyWriteUTF 是一個自定義方法,serverTools.Tools()是一個工具類,一個靜態對象。 if (err==0){ outputStream.writeUTF('No have this ID!'); } Platform.runLater(()->{ ta.appendText(socket.getInetAddress().getHostName()+' Message received from client:' + messageGET +'n' ); }); System.out.println(clientNumber); } }catch (IOException e){ clientNumber--; System.out.println(clientNumber); System.err.println('Client is closed!'); } }

這一塊的代碼主要就是創建輸入輸出數據流了

inputStream = new DataInputStream(socket.getInputStream());

outputStream = new DataOutputStream(socket.getOutputStream());

4.一些方法方便ServerTools類實現

public void MyWriteUTF(String message){ try { outputStream.writeUTF(message); } catch (IOException e) { ServerTools.Tools().remove(this); e.printStackTrace(); } } public int getName() { return name; }

二、ServerTools

1.實現指定服務器ID輸出信息的工具

public class ServerTools { private static final ServerTools servertools = new ServerTools(); public static ServerTools Tools(){ return servertools; } Vector<MyServerSocket.HandleServer> vector = new Vector<MyServerSocket.HandleServer>(); public void add(MyServerSocket.HandleServer cs){ vector.add(cs); } public void remove(MyServerSocket.HandleServer cs){ vector.remove(cs); } public int MyWriteUTF(String message,int target) { for (int i = 0; i <= target; i++){ try { if (vector.get(i).getName() == target) { MyServerSocket.HandleServer MSSHC = vector.get(i); MSSHC.MyWriteUTF(message); return 1; } }catch (ArrayIndexOutOfBoundsException e){ e.printStackTrace(); return 0; } } return 0; }}

vector用于保存客戶端連接信息

一個粗糙的處理方式,邏輯上缺陷還很嚴重,主要我好像沒找到這樣的框架???

缺陷:因為服務器要返回客戶端的ID讓客戶端將ID顯示到交互界面,所以存在情況客戶端多次連接斷開后會使返回的ID出現重復

三、ClientSocket

1.同樣的先建一個簡單的界面用于輸出信息和顯示信息

JAVA實現SOCKET多客戶端通信的案例

第一個編輯框就是 輸入要發送指定客戶端的ID 例如:1 或 2 這樣的???

第二個編輯框就是 輸入你要發送的信息了,很清楚

下面的就是顯示框,嗯!

public class MyClientSocket extends Application { private Socket socket; private DataOutputStream toServer = null; private DataInputStream fromServer = null; private String ID; private int targetID = 0; private TextArea ta; @Override public void start(Stage primaryStage) throws Exception { BorderPane paneForTextField = new BorderPane(); paneForTextField.setPadding(new Insets(5,5,5,5)); paneForTextField.setStyle('-fx-border-color: green'); paneForTextField.setLeft(new Label('Enter a Message:')); TextField tf = new TextField(); tf.setAlignment(Pos.BOTTOM_RIGHT); paneForTextField.setCenter(tf); BorderPane ID_lable = new BorderPane(); ID_lable.setPadding(new Insets(5,5,5,5)); ID_lable.setStyle('-fx-border-color: green'); ID_lable.setLeft(new Label('Enter a ID for send message:')); TextField getId = new TextField(); getId.setAlignment(Pos.BOTTOM_RIGHT); ID_lable.setCenter(getId); paneForTextField.setTop(ID_lable); BorderPane mainPane = new BorderPane(); ta = new TextArea(); mainPane.setCenter(new ScrollPane(ta)); mainPane.setTop(paneForTextField); Scene scene = new Scene(mainPane,450,200); primaryStage.setTitle('SocketClient'); primaryStage.setScene(scene); primaryStage.show(); tf.setOnAction(new EventHandler<ActionEvent>() { @Override public void handle(ActionEvent event) { targetID = Integer.parseInt(getId.getText().trim()); if (targetID > 0 || targetID!=Integer.parseInt(ID)); else return; try { String putMessage = tf.getText().trim(); toServer.writeInt(targetID); toServer.writeUTF(putMessage); toServer.flush(); ta.appendText('PUT message is :'+ putMessage +'n'); tf.setText(''); }catch (IOException ex ){ System.err.println(ex); } } }); try{ socket = new Socket('localhost',8000); fromServer = new DataInputStream(socket.getInputStream()); toServer = new DataOutputStream(socket.getOutputStream()); ID = fromServer.readUTF(); paneForTextField.setRight(new Label('Your ID is:'+ID)); new Thread(new getMessage(socket,fromServer)).start(); }catch (IOException ex){ ta.appendText(ex.toString() +'n'); } }}

一樣的要new一個Socket 去連接服務器,socket(),括號里的就是服務器的IP,和程序的端口號了,這種基于tcp協議的好像都是一個樣???

2.創建一個線程用于循環獲取信息并顯示

class getMessage implements Runnable{ private Socket socket; private DataInputStream formServer; public getMessage(Socket socket,DataInputStream formServer){ this.socket = socket; this.formServer = formServer; } @Override public void run() { try { while (true) { String Message = formServer.readUTF(); try{ Thread.sleep(100); }catch (InterruptedException e) { e.printStackTrace(); } ta.appendText('GET message from server is:' + Message + 'n'); } }catch (IOException e){ System.err.println(e); } } }

很簡單了,依舊是輸入輸出數據流,然后循環等待信息并輸出。

3.新建一個TestClient類 這個類 和ClientSocket 一模一樣 就是拿來測試的

JAVA實現SOCKET多客戶端通信的案例

四、總結

java寫socket 是真的簡單!!!^_ ^!

JAVA實現SOCKET多客戶端通信的案例

以上這篇JAVA實現SOCKET多客戶端通信的案例就是小編分享給大家的全部內容了,希望能給大家一個參考,也希望大家多多支持好吧啦網。

標簽: Java
相關文章:
主站蜘蛛池模板: 热镀锌槽钢|角钢|工字钢|圆钢|H型钢|扁钢|花纹板-天津千百顺钢铁贸易有限公司 | 桁架机器人_桁架机械手_上下料机械手_数控车床机械手-苏州清智科技装备制造有限公司 | 篮球架_乒乓球台_足球门_校园_竞技体育器材_厂家_价格-沧州浩然体育器材有限公司 | 喷码机,激光喷码打码机,鸡蛋打码机,手持打码机,自动喷码机,一物一码防伪溯源-恒欣瑞达有限公司 | 消泡剂_水处理消泡剂_切削液消泡剂_涂料消泡剂_有机硅消泡剂_广州中万新材料生产厂家 | 浙江宝泉阀门有限公司 | 镀锌角钢_槽钢_扁钢_圆钢_方矩管厂家_镀锌花纹板-海邦钢铁(天津)有限公司 | 防水试验机_防水测试设备_防水试验装置_淋雨试验箱-广州岳信试验设备有限公司 | 软文世界-软文推广-软文营销-新闻稿发布-一站式软文自助发稿平台 | 广东佛电电器有限公司|防雷开关|故障电弧断路器|智能量测断路器 广东西屋电气有限公司-广东西屋电气有限公司 | 东莞工作服_东莞工作服定制_工衣订做_东莞厂服 | 重庆波纹管|重庆钢带管|重庆塑钢管|重庆联进管道有限公司 | 动物解剖台-成蚊接触筒-标本工具箱-负压实验台-北京哲成科技有限公司 | 档案密集柜_手动密集柜_智能密集柜_内蒙古档案密集柜-盛隆柜业内蒙古密集柜直销中心 | 气动隔膜泵厂家-温州永嘉定远泵阀有限公司 | 123悬赏网_发布悬赏任务_广告任务平台 | 爱德华真空泵油/罗茨泵维修,爱发科-比其尔产品供应东莞/杭州/上海等全国各地 | 环讯传媒,永康网络公司,永康网站建设,永康小程序开发制作,永康网站制作,武义网页设计,金华地区网站SEO优化推广 - 永康市环讯电子商务有限公司 | 京港视通报道-质量走进大江南北-京港视通传媒[北京]有限公司 | 亳州网络公司 - 亳州网站制作 - 亳州网站建设 - 亳州易天科技 | 选矿设备-新型重选设备-金属矿尾矿重选-青州冠诚重工机械有限公司 | 液压油缸-液压缸厂家价格,液压站系统-山东国立液压制造有限公司 液压油缸生产厂家-山东液压站-济南捷兴液压机电设备有限公司 | 首页-恒温恒湿试验箱_恒温恒湿箱_高低温试验箱_高低温交变湿热试验箱_苏州正合 | 深圳激光打标机_激光打标机_激光焊接机_激光切割机_同体激光打标机-深圳市创想激光科技有限公司 深圳快餐店设计-餐饮设计公司-餐饮空间品牌全案设计-深圳市勤蜂装饰工程 | 山东led显示屏,山东led全彩显示屏,山东LED小间距屏,临沂全彩电子屏-山东亚泰视讯传媒有限公司 | 铝合金线槽_铝型材加工_空调挡水板厂家-江阴炜福金属制品有限公司 | CTP磁天平|小电容测量仪|阴阳极极化_双液系沸点测定仪|dsj电渗实验装置-南京桑力电子设备厂 | 儋州在线-儋州招聘找工作、找房子、找对象,儋州综合生活信息门户! | 扫地车厂家-山西洗地机-太原电动扫地车「大同朔州吕梁晋中忻州长治晋城洗地机」山西锦力环保科技有限公司 | 安徽华耐泵阀有限公司-官方网站 安德建奇火花机-阿奇夏米尔慢走丝|高维|发那科-北京杰森柏汇 | 广西资质代办_建筑资质代办_南宁资质代办理_新办、增项、升级-正明集团 | 南京PVC快速门厂家南京快速卷帘门_南京pvc快速门_世界500强企业国内供应商_南京美高门业 | 化工ERP软件_化工新材料ERP系统_化工新材料MES软件_MES系统-广东顺景软件科技有限公司 | 上海赞永| 艾乐贝拉细胞研究中心 | 国家组织工程种子细胞库华南分库 | 旋振筛|圆形摇摆筛|直线振动筛|滚筒筛|压榨机|河南天众机械设备有限公司 | 磁棒电感生产厂家-电感器厂家-电感定制-贴片功率电感供应商-棒形电感生产厂家-苏州谷景电子有限公司 | 圆窗水平仪|伊莉莎冈特elesa+ganter | 青岛空压机,青岛空压机维修/保养,青岛空压机销售/出租公司,青岛空压机厂家电话 | 紧急泄压人孔_防爆阻火器_阻火呼吸阀[河北宏泽石化] | 干粉砂浆设备_干混砂浆生产线_腻子粉加工设备_石膏抹灰砂浆生产成套设备厂家_干粉混合设备_砂子烘干机--郑州铭将机械设备有限公司 |