java UDP實(shí)現(xiàn)一個(gè)聊天工具的示例代碼
題目:
假設(shè)Tom和Jerry利用Java UDP進(jìn)行聊天,請為他們編寫程序。具體如下:
(1)、Tom和Jerry聊天的雙方都應(yīng)該具有發(fā)送端和接收端;
(2)、利用DatagramSocket與DatagramPacket;
(3)、實(shí)現(xiàn) java.lang.Runnable類,重寫 run()方法。
學(xué)過計(jì)網(wǎng)的都知道,利用三元組(ip地址,協(xié)議,端口)就可以標(biāo)識網(wǎng)絡(luò)的進(jìn)程了。
而進(jìn)行通信我們直接運(yùn)用socket就可以了,首先需要知道是socket是什么,這部分可以參考這個(gè)大佬寫的博客。
http://www.dbjr.com.cn/article/121601.htm
實(shí)現(xiàn)一個(gè)客戶端,那么需要Tom和Jerry都可以實(shí)現(xiàn)接收和發(fā)送功能,分別用兩個(gè)線程啟動。
接收線程Receive_Thread.java
package Chat_UDP; import java.io.IOException; import java.util.Date; import java.net.DatagramPacket; import java.net.DatagramSocket; import java.text.SimpleDateFormat; public class Receive_Thread extends Thread { private static final int MAX_RECEIVE_BUFFER = 1024; private DatagramSocket server; private DatagramPacket packet; byte[] buffer = new byte[MAX_RECEIVE_BUFFER]; public Receive_Thread(DatagramSocket server) { this.server = server; packet = new DatagramPacket(buffer, buffer.length); } @Override public void run() { try { while(true) { //接收數(shù)據(jù)包 server.receive(packet); String s = new String(packet.getData(),packet.getOffset(),packet.getLength(),"UTF-8"); Date day=new Date(); SimpleDateFormat df = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss"); if(packet.getPort() == 10001) System.out.println("Tom"+packet.getAddress()+" 說:"+s+"\t"+df.format(day)); else{ System.out.println("Jerry"+packet.getAddress()+" 說 :"+s+"\t"+df.format(day)); } packet.setLength(buffer.length); } } catch(IOException e) { System.out.println("IOException"); } } }
發(fā)送線程Send_Thread.java
package Chat_UDP; import java.io.IOException; import java.net.DatagramPacket; import java.net.DatagramSocket; import java.net.InetAddress; import java.net.InetSocketAddress; import java.util.Scanner; public class Send_Thread extends Thread{ //發(fā)送的socket端 private DatagramSocket sender = null; //待發(fā)送的目標(biāo)地址 private InetSocketAddress address = null; //從鍵盤輸入 Scanner scan = new Scanner(System.in); public Send_Thread(DatagramSocket sender,InetSocketAddress address) { this.sender = sender; this.address = address; } @Override public void run() { // TODO Auto-generated method stub try { while(true) { //輸入待發(fā)送的內(nèi)容 String input = scan.nextLine(); if(input.equals("exit")) break; byte[] data = null; data = input.getBytes("UTF-8"); //創(chuàng)建UDP數(shù)據(jù)報(bào) DatagramPacket pack = new DatagramPacket(data, data.length,address); sender.send(pack); } System.out.println("Exit!"); }catch(IOException e) { System.out.println("IOException"); } } }
聊天服務(wù)器
Chat_Server.java
package Chat_UDP; //楊麗冰 201831064402 import java.net.DatagramSocket; import java.net.InetSocketAddress; public class Chat_Server { private static final int DEST_PORT = 8888; private static final int SEND_PORT = 10001; private static final int RECE_PORT = 9000; private static final String IP = "127.0.0.1"; public static void main(String[] args) { try{ Send_Thread send_thread = null; Receive_Thread rece_thread = null; InetSocketAddress address = null; //創(chuàng)建待接受數(shù)據(jù)包的目的機(jī)的端口號和IP地址 address = new InetSocketAddress(IP, DEST_PORT); //創(chuàng)建發(fā)送的Socket端 DatagramSocket sendsocket = new DatagramSocket(SEND_PORT); //創(chuàng)建接受的Socket端 DatagramSocket recesocket = new DatagramSocket(RECE_PORT); //發(fā)送線程建立 send_thread = new Send_Thread(sendsocket, address); //接受線程的建立 rece_thread = new Receive_Thread(recesocket); send_thread.start(); rece_thread.start(); }catch(Exception e) { System.out.println("Exception!"); } } }
聊天客戶端 Chat_Client.java
package Chat_UDP; //楊麗冰 201831064402 import java.net.DatagramSocket; import java.net.InetSocketAddress; public class Chat_Client { //聲明端口號 private static final int DEST_PORT = 9000; private static final int SEND_PORT = 10000; private static final int RECE_PORT = 8888; private static final String IP = "127.0.0.1"; public static void main(String[] args) { try{ Send_Thread send_thread = null; Receive_Thread rece_thread = null; InetSocketAddress address = null; //創(chuàng)建待接受數(shù)據(jù)包的目的機(jī)的端口號和IP地址 address = new InetSocketAddress(IP, DEST_PORT); //創(chuàng)建發(fā)送的Socket端 DatagramSocket sendsocket = new DatagramSocket(SEND_PORT); //創(chuàng)建接受的Socket端 DatagramSocket recesocket = new DatagramSocket(RECE_PORT); //發(fā)送線程建立 send_thread = new Send_Thread(sendsocket, address); //接受線程的建立 rece_thread = new Receive_Thread(recesocket); send_thread.start(); rece_thread.start(); }catch(Exception e) { System.out.println("Exception!"); } } }
需要注意的時(shí)候運(yùn)行的時(shí)候需要同時(shí)運(yùn)行聊天服務(wù)器和客戶端,才能夠正常運(yùn)行。
最終效果如下:
到此這篇關(guān)于java UDP實(shí)現(xiàn)一個(gè)聊天工具的文章就介紹到這了,更多相關(guān)java UDP聊天工具內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
- java使用UDP實(shí)現(xiàn)多人聊天功能
- java實(shí)現(xiàn)基于UDP協(xié)議的聊天小程序操作
- Java網(wǎng)絡(luò)編程UDP實(shí)現(xiàn)消息發(fā)送及聊天
- Java網(wǎng)絡(luò)編程UDP實(shí)現(xiàn)多線程在線聊天
- java網(wǎng)絡(luò)之基于UDP的聊天程序示例解析
- Java基于UDP協(xié)議實(shí)現(xiàn)簡單的聊天室程序
- java中UDP簡單聊天程序?qū)嵗a
- 使用Java和WebSocket實(shí)現(xiàn)網(wǎng)頁聊天室實(shí)例代碼
- java聊天室的實(shí)現(xiàn)代碼
- java使用udp實(shí)現(xiàn)簡單多人聊天功能
相關(guān)文章
詳解Java中布隆過濾器(Bloom Filter)原理及其使用場景
布隆過濾器是1970年由布隆提出的,它實(shí)際上是一個(gè)很長的二進(jìn)制向量和一系列隨機(jī)映射函數(shù),它的作用是檢索一個(gè)元素是否存在我們的集合之中,本文給大家詳細(xì)的講解一下布隆過濾器,感興趣的同學(xué)可以參考閱讀2023-05-05短網(wǎng)址的原理與生成方法(Java實(shí)現(xiàn))
這篇文章主要給大家介紹了關(guān)于短網(wǎng)址的原理與生成方法,利用的是Java實(shí)現(xiàn),文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2020-10-10spring boot mybatis多數(shù)據(jù)源解決方案過程解析
這篇文章主要介紹了spring boot mybatis多數(shù)據(jù)源解決方案過程解析,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下2019-11-11如何使用CountDownLatch同步j(luò)ava多線程
這篇文章主要介紹了如何使用CountDownLatch同步j(luò)ava多線程,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下2020-08-08Java修飾符abstract與static及final的精華總結(jié)
abstract、static、final三個(gè)修飾符是經(jīng)常會使用的,對他們的概念必須非常清楚,弄混了會產(chǎn)生些完全可以避免的錯(cuò)誤,比如final和abstract不能一同出現(xiàn),static和abstract不能一同出現(xiàn),下面我們來詳細(xì)了解2022-04-04Spring Boot 2.0多數(shù)據(jù)源配置方法實(shí)例詳解
這篇文章主要介紹了Spring Boot 2.0多數(shù)據(jù)源配置方法實(shí)例詳解,非常不錯(cuò),具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2018-09-09Java的Netty進(jìn)階之Future和Promise詳解
這篇文章主要介紹了Java的Netty進(jìn)階之Future和Promise詳解,Netty 是基于 Java NIO 的異步事件驅(qū)動的網(wǎng)絡(luò)應(yīng)用框架,使用 Netty 可以快速開發(fā)網(wǎng)絡(luò)應(yīng)用,Netty 提供了高層次的抽象來簡化 TCP 和 UDP 服務(wù)器的編程,但是你仍然可以使用底層的 API,需要的朋友可以參考下2023-11-11