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