Java——網絡編程(實現基于命令行的多人聊天室)

2019獨角獸企業重金招聘Python工程師標準>>> hot3.png

目錄:

1.ISO和TCP/IP分層模型

2.IP協議

3.TCP/UDP協議

4.基于TCP的網絡編程

5.基于UDP的網絡編程

6.基于TCP的多線程的聊天室的實現

?

1.ISO和TCP/IP分層模型

160207_2aYN_3786691.png

OSI分層模型(Open System Interconnection)為“開放系統互連參考模型”。為國際標準化組織ISO提出。

TCP/IP分層模型更和實際應用相貼近。

對應關系如上圖。其中TCP/IP體系中,網絡層對應IP(Internet Protocol),傳輸層對應TCP(Transmiss Control Protocl)。

分層思想:只有相鄰的兩層才能夠進行信息的交互。如:應用層需要傳輸信息時,會將信息交給傳輸層,傳輸層會將信息進行包裝,并傳遞給網絡層;網絡層會將信息再次包裝,在傳遞給物理+數據鏈路層。而別的計算機需要解析信息時,也需要反向層層解析,才能獲得應用所需的信息。

?

2.ip協議

負責提供獨一無二的ip地址。

傳送信息時除了需要ip地址,也需要端口號。ip地址相當于選擇連接互聯網上的某臺計算機,而端口號相當于選擇連接一臺計算機上的某個應用。

端口號可以從0-65535,通常分三類:①公認端口:0-1023,http默認80端口;②注冊端口:1024-49151,通常應用程序應該使用這個范圍內的端口;③動態/私有端口:49152-65535,應用程序不會主動會用這些端口,一般是動態分配的。

端口號又分tcp和udp:比如tcp888和udp888是不一樣的。

?

?

3.TCP/UDP協議:

tcp可靠但是慢(因為有確認):如銀行登錄。

udp不可靠但是快:如發qq語音,如果丟包也就是語音茲拉幾聲;cf網絡問題導致閃現;

如果網絡在不太擠的話,udp也比較可靠,如果擠則肯能被路由器丟失,這就是丟包。

?

Socket:

一般網絡編程也稱為socket編程。

關于網絡編程的類一般都在java.net:其下有兩個類一個socket(client),一個serversocket(server)分別用來實現雙向鏈接的client端和server端

這都是對tcp而言,因為對于udp而言沒有嚴格意義上的server和client。

建立連接時所需的尋址信息為遠程計算機的ip地址端口號(Port number),ip地址相當于尋找計算機,而端口號尋找同一計算機上的不同應用程序。

?

4.基于TCP的網絡編程:

ServerSocket是堵塞式的(accept方法是阻塞式的),因為有時有Client訪問有時沒有,所以SercerSocket不間斷運行,等待Client連接。

Client和Server交流通過“流”。

readUTF也是阻塞式的。會導致其他client在阻塞期間連接不上。

代碼如下:

//TCPSevrver.javaimport java.io.DataInputStream;
import java.io.InputStream;
import java.net.*;public class TCPserver {public static void main(String[] args) throws Exception {ServerSocket ss=new ServerSocket(6666);	while(true) {//為了滿足服務器不間斷的條件Socket s=ss.accept();//在server也建立一個socket,用來接收client來的申請DataInputStream dis=new DataInputStream(s.getInputStream());//從輸入流里獲取數據System.out.println(dis.readUTF());//打印數據dis.close();//關閉輸入流s.close();//關閉Client的連接}}
}
//TCPClient.javaimport java.io.DataOutputStream;
import java.io.OutputStream;
import java.net.*;public class TCPclient {public static void main(String[] args) throws Exception {Socket s=new Socket("127.0.0.1", 6666);//創建連接Server的Socket,根據ip和端口OutputStream os=s.getOutputStream();DataOutputStream dos=new DataOutputStream(os);//輸出流dos.writeUTF("hello server");dos.flush();dos.close();//關閉輸出流s.close();//關閉Client的連接}
}

?

5.基于UDP的網絡編程

?

6.基于TCP的多線程的聊天室的實現

思想就是將Service和Client的交互都放入新的線程中。從而使數據交互不會堵塞。

實現共4個.java文件:

MyServer.java——服務器主體

ServerThread.java——服務器為處理單個Client創建的線程

MyClient.java——客戶端主體

ClientThread.java——Client中實現等待服務器發送聊天內容的線程

直接貼代碼:

package TalkRoom;import java.io.IOException;
import java.net.*;
import java.util.*;public class MyServer {//定義保存所有socket,并將其包裝成線程安全的public static List<Socket> list=Collections.synchronizedList(new ArrayList<>());public static void main(String[] args)throws IOException {// TODO Auto-generated method stubServerSocket ss=new ServerSocket(8888);//如果沒有人連接,就一直堵塞while(true) {Socket s=ss.accept();	//將連接的client保存在s中list.add(s);//將新的s添加進s的list中//每當一個client連接到server,server總會開啟一個新的線程與client進行服務new Thread(new ServerThread(s)).start();}}}
package TalkRoom;import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.PrintStream;
import java.net.Socket;public class ServerThread implements Runnable {private Socket s;BufferedReader br;public ServerThread(Socket s) throws IOException {// TODO Auto-generated constructor stubthis.s=s;//初始化該socket對應的輸入流br=new BufferedReader(new InputStreamReader(s.getInputStream()));}@Overridepublic void run() {// TODO Auto-generated method stubtry {String content=null;//采用循環不斷從socket中讀取客戶端發送來的數據while((content=readFromClient())!=null) {//遍歷list中的每一個socket//將讀到的content像每一個socket發送一次for(Socket s:MyServer.list) {PrintStream ps=new PrintStream(s.getOutputStream());ps.println(content);}}} catch (IOException e) {// TODO: handle exceptione.printStackTrace();}}private String readFromClient() {// TODO Auto-generated method stubtry {return br.readLine();} catch (IOException e) {// TODO: handle exception//捕獲到異常說明該socket已關閉,則從list中刪除該socketMyServer.list.remove(s);}return null;}}
package TalkRoom;import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.PrintStream;
import java.net.Socket;
import java.net.UnknownHostException;public class MyClient {public static void main(String[] args) throws UnknownHostException, IOException {// TODO Auto-generated method stubSocket s=new Socket("127.0.0.1", 8888);//客戶端啟動ClientThread線程不斷地從server讀取數據new Thread(new ClientThread(s)).start();//獲取該socket對應的輸出流PrintStream ps=new PrintStream(s.getOutputStream());String line=null;//不斷地讀取鍵盤輸入的信息BufferedReader br=new BufferedReader(new InputStreamReader(System.in));while((line=br.readLine())!=null) {//將用戶鍵盤輸入的內容不斷地輸入到socket的輸出流中ps.println(line);}}}
package TalkRoom;import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.net.Socket;public class ClientThread implements Runnable {private Socket s;BufferedReader br;public ClientThread(Socket s) throws IOException {// TODO Auto-generated constructor stubthis.s=s;br=new BufferedReader(new InputStreamReader(s.getInputStream()));}@Overridepublic void run() {// TODO Auto-generated method stubtry {String context=null;while((context=br.readLine())!=null) {System.out.println(context);}} catch (IOException e) {// TODO: handle exceptione.printStackTrace();}}}

初步實現了一個多人聊天室的功能,雖然沒有圖形界面,但是也能更進一步了解多線程以及Server、Client交互的實現。

轉載于:https://my.oschina.net/u/3786691/blog/1673176

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/452227.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/452227.shtml
英文地址,請注明出處:http://en.pswp.cn/news/452227.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

學成在線--12.Spring整合RibbitMQ

文章目錄一.搭建SpringBoot環境二.配置1.配置application.yml2.定義RabbitConfig類三.生產端四.消費端一.搭建SpringBoot環境 我們選擇基于Spring-Rabbit去操作RabbitMQ 使用spring-boot-starter-amqp會自動添加spring-rabbit依賴&#xff0c;如下&#xff1a; <dependenc…

一網打盡中文編碼轉換---6種編碼30個方向的轉換

一網打盡中文編碼轉換——6種編碼30個方向的轉換 1.問題提出 在學編程序時&#xff0c;曾經有人問過“你可以編一個記事本程序嗎?”當時很不屑一顧&#xff0c;但是隨著學習MFC的深入&#xff0c;了解到記事本程序也并非易事&#xff0c;難點就是四種編碼之間的轉換。 對于編…

安裝Ubunutu音頻視頻庫

sudo apt-get install ubuntu-restricted-extras轉載于:https://www.cnblogs.com/or2-/p/9216235.html

十萬服務器秒級管控 騰訊云如何將AIOps用于日常管理?

AIOps&#xff0c;是指基于算法的 IT運維&#xff08;Algorithmic IT Operations&#xff09;&#xff0c;由 Gartner定義的新類別&#xff0c;源自業界之前所說的 ITOA&#xff08;IT Operations and Analytics&#xff09;。我們已經到達了這樣的一個時代&#xff0c;數據科學…

ssm(springMVC + spring+MyBatis) 小例

前些天發現了一個巨牛的人工智能學習網站&#xff0c;通俗易懂&#xff0c;風趣幽默&#xff0c;忍不住分享一下給大家。點擊跳轉到教程。 整體環境參見本人另一文&#xff1a;http://blog.csdn.net/jiangyu1013/article/details/51983360 此工程訪問入口為index.jsp頁面. 工…

多值依賴

在關系模式中&#xff0c;函數依賴不能表示屬性值之間的一對多聯系&#xff0c;這些屬性之間有些雖然沒有直接關系&#xff0c;但存在間接的關系&#xff0c;把沒有直接聯系、但有間接的聯系稱為多值依賴的數據依賴。例如&#xff0c;教師和學生之間沒有直接聯系&#xff0c;但…

js控制語句練習(回顧)

1、一個小球從100米空中落下&#xff0c;每次反彈一半高度&#xff0c;小球總共經過多少米&#xff0c;請問第10次反彈的高度是多少&#xff1f; //定義初始下落過程高度 var sum1 0; //定義初始上升高度 var sum2 0; //高度變化 var hight 100; for(var i0;i<10;i){ // …

學成在線--13.RabbitMQ工作模式

文章目錄一.Work queues二.Publish/subscribe1.工作模式2.代碼1&#xff09;生產者2&#xff09;消費者3.測試4.思考三.Routing1.工作模式2.代碼1&#xff09;生產者2&#xff09;消費者3.測試4.思考四.Topics1.工作模式2.代碼1&#xff09;生產者2&#xff09;消費者3.測試4.思…

《C++字符串完全指南——第一部分:win32 字符編碼》

《C字符串完全指南--第一部分:win32 字符編碼》 原作者:Michael Dun 譯 者:Dingqiao Wang 引言 毫無疑問&#xff0c;你肯定見過像TCHAR, std::string, BSTR等等這類字符串類型.也包括一些以_tcs開頭的奇怪的宏。也許你正盯著屏幕"哇哇"的發愁&#xff0c;然…

Spring、Spring MVC、MyBatis整合文件配置詳解

前些天發現了一個巨牛的人工智能學習網站&#xff0c;通俗易懂&#xff0c;風趣幽默&#xff0c;忍不住分享一下給大家。點擊跳轉到教程。 web.xml的配置 web.xml應該是整個項目最重要的配置文件了&#xff0c;不過servlet3.0中已經支持注解配置方式了。在servlet3.0以前每…

19.C++-(=)賦值操作符、初步編寫智能指針

()賦值操作符 編譯器為每個類默認重載了()賦值操作符默認的()賦值操作符僅完成淺拷貝默認的賦值操作符和默認的拷貝構造函數有相同的存在意義()賦值操作符注意事項 首先要判斷兩個操作數是否相等 返回值一定是 return *this; 返回類型是Type&型,避免連續使用后,出現bug 比如…

windows mysqldump 不成功 1049 1064 報錯

1064 路徑不對&#xff0c;需要cd選到mysql bin目錄下 1049 在cmd里面不需要分號 以下是正確的 E:\phpStudy\PHPTutorial\MySQL\bin>mysqldump -uroot -proot db >db.sql 轉載于:https://www.cnblogs.com/JANCHAN/p/9227388.html

學成在線--14.使用RabbitMQ完成頁面發布

文章目錄一.技術方案二.頁面發布——消費方1.需求分析2.創建Cms Client工程1&#xff09;創建maven工程2&#xff09;配置文件3&#xff09;啟動類3.RabbitmqConfig配置類4.定義消息格式5.PageDao1&#xff09;使用CmsPageRepository 查詢頁面信息2&#xff09;使用CmsSiteRepo…

對象模型中類與類間的關系

類與類之間通常有關聯、聚集、泛化(繼承)、依賴和細化4種關系 1.關聯 關聯表示兩個類的對象之間存在某種語義上的聯系。 (1) 普通關聯 只要在類與類之間存在連接關系就可以用普通關聯表示。普通關聯的圖示符號是連接兩個類之間的直線&#xff0c;如下圖所示。關聯…

記憶講師石偉華微信公眾號2017所有文章匯總(待更新)

17-10-24-不勝光榮的記憶 17-10-26-每日一個超長英文單詞&#xff08;2&#xff09; 17-10-27-每日一個超長英文單詞&#xff08;3&#xff09; 17-10-28-每日一個超長英文單詞&#xff08;4&#xff09; 轉載于:https://www.cnblogs.com/bakblog/p/9228096.html

Log4J日志配置詳解

前些天發現了一個巨牛的人工智能學習網站&#xff0c;通俗易懂&#xff0c;風趣幽默&#xff0c;忍不住分享一下給大家。點擊跳轉到教程。 一、Log4j簡介 Log4j有三個主要的組件&#xff1a;Loggers(記錄器)&#xff0c;Appenders (輸出源)和Layouts(布局)。這里可簡單理解為日…

中文編碼雜談

編碼問題的例子 在windows自帶的notepad&#xff08;記事本&#xff09;程序中輸入“聯通”兩個字&#xff0c;保存后再次打開&#xff0c;會發現“聯通”不見了&#xff0c;代之以“”的亂碼。這是windows平臺上典型的中文編碼問題。即文件保存的時候是按照ANSI編碼&#xff…

Java NIO (十四)NIO 和 IO 的區別和適用場景分析

在研究Java NIO和IO API時&#xff0c;很快就會想到一個問題&#xff1a; 什么時候應該使用IO&#xff0c;什么時候應該使用NIO&#xff1f; 在本文中&#xff0c;我將嘗試闡明Java NIO和IO之間的區別&#xff0c;它們的用例以及它們如何影響代碼的設計。 ###Java NIO和IO之間的…

面向對象三種模型之間的關系

功能模型指明了系統應該“做什么”&#xff1b;動態模型明確規定了什么時候(即在何種狀態下接受了什么事件的觸發)做&#xff1b;對象模型則定義了做事情的實體。在面向對象方法學中&#xff0c;對象模型是最基本最重要的&#xff0c;它為其他兩種模型奠定了基礎&#xff0c;人…

android node

pkg install nodejs-current轉載于:https://www.cnblogs.com/insight0912/p/9231342.html