Java网络编程并实现一对一聊天室功能
Java網(wǎng)絡(luò)編程
目錄
- Java網(wǎng)絡(luò)編程
- 1、計算機網(wǎng)絡(luò)
- 2、網(wǎng)路通信的要素
- TCP/IP模型:
- 3、IP
- IP地址的分類
- 4、端口
- 5、通信協(xié)議
- TCP 和 UDP 對比
- 6、TCP
- 1、基礎(chǔ)通信
- 2、文件上傳
- 7、UDP
- 1、基礎(chǔ)通信
- 2、多線程一對一聊天室
1、計算機網(wǎng)絡(luò)
計算機網(wǎng)絡(luò):計算機網(wǎng)絡(luò)是指將地理位置不同的具有獨立功能的多臺計算機及其外部設(shè)備,通過通信線路連接起來,在網(wǎng)絡(luò)操作,網(wǎng)絡(luò)管理軟件及網(wǎng)絡(luò)通信協(xié)議的管理和協(xié)調(diào)下,實現(xiàn)資源共享和信息傳遞的計算機系統(tǒng)。
2、網(wǎng)路通信的要素
通信雙方地址: IP:端口號
規(guī)則:網(wǎng)絡(luò)通信的協(xié)議
TCP/IP模型:
網(wǎng)絡(luò)編程中的兩個主要的問題
-
如何準確的定位到網(wǎng)絡(luò)上的一臺主機?ip:端口號 定位到這個計算機上的某個資源
-
找到了主機,如何傳輸數(shù)據(jù)呢?
網(wǎng)絡(luò)編程中的要素
- IP 和 端口號
- 網(wǎng)絡(luò)通信協(xié)議:UDP 和 TCP
萬物皆對象 – Java
3、IP
IP地址:InetAddress.java
- 唯一定位一臺網(wǎng)絡(luò)上的計算機
- 127.0.0.1 :代表本機地址,也叫 localhost
IP地址的分類
-
IPV4 / IPV6
-
IPV4: 例:127.0.0.1 ,由四個字節(jié)組成,每個字節(jié)大小為0~255;全球共42億個IPV4地址,30億在北美,4億在亞洲,2011年就用盡了
-
IPV6:XXXX:XXXX:XXXX:XXXX:XXXX:XXXX:XXXX:XXXX
它是128位的,用":"分成8段,每個X是一個16進制數(shù)(16 = 2^4);
-
-
公網(wǎng)(互聯(lián)網(wǎng)) / 私網(wǎng)(局域網(wǎng))
- 局域網(wǎng):192.168.1.1
- ABCD類地址(需要了解)
4、端口
表示計算機上的一個程序的進程:
- 不同的進程有不同的端口號
- 被規(guī)定范圍是 0~65535 ,TCP / UDP 不同,各65535個端口號
端口分類:
-
公有端口 0~1023
- HTTP:80
- HTTPS:443
- FTP:21
- Telent:23
-
程序可注冊端口:1024~49151,分配給用戶或程序
- Tomcat:8080
- MySQL:3306
- Oracle:1521
-
動態(tài)、私有:49151~65535
-
Java中獲取相關(guān)地址信息
//查詢本地地址 InetAddress local0 = InetAddress.getByName("127.0.0.1"); InetAddress local1 = InetAddress.getByName("localhost"); InetAddress local2 = InetAddress.getLocalHost(); //查詢網(wǎng)絡(luò)地址 InetAddress address = InetAddress.getByName("www.baidu.com"); //常用方法 System.out.println(address.getHostAddress());//獲得ip System.out.println(address.getHostName()); //獲得域名
Windows端口相關(guān)常用命令:
netstat -ano #查看所有端口號 netstat -ano|findstr "8080" #查看8080端口號 tasklist|findstr "8080" #查看指定端口的進程 taskkill /f /t /im "進程id或者進程名稱" #殺掉進程5、通信協(xié)議
- TCP:用戶傳輸協(xié)議
- UDP:用戶數(shù)據(jù)報協(xié)議
TCP 和 UDP 對比
-
TCP,類似于打電話
-
需要連接,穩(wěn)定
-
三次握手,四次揮手
-
-
客戶端、服務(wù)端
-
傳輸完成,釋放連接,效率低
-
UDP,類似于發(fā)短信
- 不連接,不穩(wěn)定
- 客戶端、服務(wù)端:沒有明確的界限
- 不管對方需不需要接收,都發(fā)送
- DDOS:洪水攻擊
6、TCP
1、基礎(chǔ)通信
客戶端核心代碼
//1.要知道服務(wù)器的地址 InetAddress inetAddress = InetAddress.getByName("127.0.0.1"); int port = 9999; //2.創(chuàng)建一個socket連接 Socket socket = new Socket(inetAddress, port); //3.發(fā)送消息 IO流 OutputStream os = socket.getOutputStream(); os.write("您好,我是客戶端".getBytes(StandardCharsets.UTF_8)); //4.關(guān)閉資源 os.close(); socket。close();服務(wù)端核心代碼
//1.要想讓客戶端連接,得有一個地址 ServerSocket serverSocket = new ServerSocket(9999); while (true){//循環(huán)接受客戶端發(fā)送的消息//2.等待客戶端連接過來Socket socket = serverSocket.accept();//3.讀取客戶端發(fā)送的數(shù)據(jù)InputStream inputStream = socket.getInputStream();ByteArrayOutputStream baos = new ByteArrayOutputStream();byte[] buffer = new byte[1024];int len;while ((len = inputStream.read(buffer)) != -1){baos.write(buffer,0,len);}System.out.println(baos.toString()); } //4.關(guān)閉資源 baos.close(); inputStream.close(); socket.close(); serverSocket.close();2、文件上傳
7、UDP
1、基礎(chǔ)通信
發(fā)送方代碼
//1.建立一個socket DatagramSocket socket = new DatagramSocket(); //2.建個包,包里面是要發(fā)送的數(shù)據(jù) String msg = "您好,我是udp客戶端"; InetAddress serverAddress = InetAddress.getByName("localhost"); int port = 9000; DatagramPacket packet = new DatagramPacket(msg.getBytes(StandardCharsets.UTF_8), 0, msg.getBytes(StandardCharsets.UTF_8).length, serverAddress, port); //3.發(fā)送數(shù)據(jù) socket.send(packet); //4.關(guān)閉資源 socket.close();接受方代碼
//1.開放端口 DatagramSocket socket = new DatagramSocket(9000); //2.接受數(shù)據(jù)包 byte[] buffer = new byte[1024]; DatagramPacket packet = new DatagramPacket(buffer, 0, buffer.length); socket.receive(packet);//阻塞接受 System.out.println(packet.getAddress().getHostAddress());//發(fā)送方地址 System.out.println(new String(packet.getData(),0,packet.getLength()));//數(shù)據(jù) //3.關(guān)閉資源 socket.close();2、多線程一對一聊天室
發(fā)送方代碼
/*** 基于UDP的聊天室 -- 發(fā)送方*/ public class Sender implements Runnable {DatagramSocket socket = null;BufferedReader reader = null;private int sendPort;private int receivePort;private String receiveAddress;public Sender(int sendPort, String receiveAddress, int receivePort) {this.sendPort = sendPort;this.receivePort = receivePort;this.receiveAddress = receiveAddress;try {this.socket = new DatagramSocket(sendPort);this.reader = new BufferedReader(new InputStreamReader(System.in));} catch (SocketException e) {e.printStackTrace();}}@Overridepublic void run() {try {while (true){//2.準備要發(fā)送的數(shù)據(jù),從控制臺獲取String line = reader.readLine();byte[] sendData = line.getBytes(StandardCharsets.UTF_8);//要發(fā)送的數(shù)據(jù)byte[] buffer = new byte[1024];DatagramPacket packet = new DatagramPacket(sendData,0, sendData.length,new InetSocketAddress(this.receiveAddress, this.receivePort));//3.發(fā)送數(shù)據(jù)socket.send(packet);if (line.equals("bye")){break;}}}catch (Exception e){e.printStackTrace();}//4.關(guān)閉資源socket.close();} }接受方代碼
/*** 基于UDP的聊天室 -- 接受方*/ public class Receiver implements Runnable {private int receivePort;DatagramSocket socket = null;public Receiver(int receivePort) {this.receivePort = receivePort;try {this.socket = new DatagramSocket(this.receivePort);} catch (SocketException e) {e.printStackTrace();}}@Overridepublic void run() {try {while (true){//循環(huán)接受數(shù)據(jù)//2.獲取對方發(fā)送的數(shù)據(jù)byte[] buffer = new byte[1024];DatagramPacket packet = new DatagramPacket(buffer, 0, buffer.length);socket.receive(packet);//打印數(shù)據(jù)內(nèi)容String receivedData = new String(packet.getData(),0,packet.getLength()); System.out.println(packet.getAddress().getHostAddress()+":"+packet.getPort()+":"+receivedData);//當(dāng)對方輸入bye時,斷開連接if (receivedData.equals("bye")){break;}}}catch (Exception e){e.printStackTrace();}//4.關(guān)閉資源socket.close();} }測試
//用戶1 public class Test01 {public static void main(String[] args) {new Thread(new Receiver(9102)).start();new Thread(new Sender(9002,"localhost",9101)).start();} } //用戶2 public class Test02 {public static void main(String[] args) {new Thread(new Receiver(9101)).start();new Thread(new Sender(9001,"localhost",9102)).start();} }總結(jié)
以上是生活随笔為你收集整理的Java网络编程并实现一对一聊天室功能的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 【华为OD机试真题 JAVA】跳格子游戏
- 下一篇: 水星路由器wan口ip显示0_路由器WA