java UDP實(shí)現(xiàn)一個(gè)聊天工具的示例代碼
題目:
假設(shè)Tom和Jerry利用Java UDP進(jìn)行聊天,請(qǐng)為他們編寫程序。具體如下:
(1)、Tom和Jerry聊天的雙方都應(yīng)該具有發(fā)送端和接收端;
(2)、利用DatagramSocket與DatagramPacket;
(3)、實(shí)現(xiàn) java.lang.Runnable類,重寫 run()方法。

學(xué)過(guò)計(jì)網(wǎng)的都知道,利用三元組(ip地址,協(xié)議,端口)就可以標(biāo)識(shí)網(wǎng)絡(luò)的進(jìn)程了。
而進(jìn)行通信我們直接運(yùn)用socket就可以了,首先需要知道是socket是什么,這部分可以參考這個(gè)大佬寫的博客。
http://www.dhdzp.com/article/121601.htm
實(shí)現(xiàn)一個(gè)客戶端,那么需要Tom和Jerry都可以實(shí)現(xiàn)接收和發(fā)送功能,分別用兩個(gè)線程啟動(dòng)。
接收線程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()+" 說(shuō):"+s+"\t"+df.format(day));
else{
System.out.println("Jerry"+packet.getAddress()+" 說(shuō) :"+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ī)的端口號(hào)和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 {
//聲明端口號(hào)
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ī)的端口號(hào)和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)容請(qǐng)搜索腳本之家以前的文章或繼續(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)簡(jiǎn)單的聊天室程序
- java中UDP簡(jiǎn)單聊天程序?qū)嵗a
- 使用Java和WebSocket實(shí)現(xiàn)網(wǎng)頁(yè)聊天室實(shí)例代碼
- java聊天室的實(shí)現(xiàn)代碼
- java使用udp實(shí)現(xiàn)簡(jiǎn)單多人聊天功能
相關(guān)文章
SpringCloud集成Sleuth和Zipkin的思路講解
Zipkin 是 Twitter 的一個(gè)開(kāi)源項(xiàng)目,它基于 Google Dapper 實(shí)現(xiàn),它致力于收集服務(wù)的定時(shí)數(shù)據(jù),以及解決微服務(wù)架構(gòu)中的延遲問(wèn)題,包括數(shù)據(jù)的收集、存儲(chǔ)、查找和展現(xiàn),這篇文章主要介紹了SpringCloud集成Sleuth和Zipkin,需要的朋友可以參考下2022-11-11
springboot集成spring cache緩存示例代碼
本篇文章主要介紹了springboot集成spring cache示例代碼,小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧2017-05-05
ActiveMQ消息隊(duì)列技術(shù)融合Spring過(guò)程解析
這篇文章主要介紹了ActiveMQ消息隊(duì)列技術(shù)融合Spring過(guò)程解析,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下2019-11-11
MyBatis實(shí)現(xiàn)萬(wàn)能Map和模糊查詢
本文主要介紹了MyBatis實(shí)現(xiàn)萬(wàn)能Map和模糊查詢,文中通過(guò)示例代碼介紹的非常詳細(xì),需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2021-07-07
如何使用 IntelliJ IDEA 編寫 Spark 應(yīng)用程序(Sc
本教程展示了如何在IntelliJIDEA中使用Maven編寫和運(yùn)行一個(gè)簡(jiǎn)單的Spark應(yīng)用程序(例如WordCount程序),本文通過(guò)實(shí)例代碼給大家介紹的非常詳細(xì),感興趣的朋友跟隨小編一起看看吧2024-11-11
如何從Java環(huán)境中調(diào)用GoLang函數(shù)
Go,常被稱為GoLang,Go語(yǔ)言憑借其豐富的標(biāo)準(zhǔn)庫(kù),以及 goroutines和 channels等獨(dú)特特性,在開(kāi)發(fā)可擴(kuò)展且高效的程序方面展現(xiàn)了顯著優(yōu)勢(shì),許多開(kāi)發(fā)者傾向于將Go與其他編程語(yǔ)言結(jié)合使用,在本文中,我們將深入探討如何從Java環(huán)境中調(diào)用GoLang函數(shù),以實(shí)現(xiàn)兩種語(yǔ)言的無(wú)縫集成2025-01-01
java數(shù)據(jù)庫(kù)連接池新手入門一篇就夠了,太簡(jiǎn)單了!
數(shù)據(jù)庫(kù)連接池負(fù)責(zé)分配、管理和釋放數(shù)據(jù)庫(kù)連接,釋放空閑時(shí)間超過(guò)最大空閑時(shí)間的數(shù)據(jù)庫(kù)連接來(lái)避免因?yàn)闆](méi)有釋放數(shù)據(jù)庫(kù)連接而引起的數(shù)據(jù)庫(kù)連接遺漏,這項(xiàng)技術(shù)能明顯提高對(duì)數(shù)據(jù)庫(kù)操作的性能2021-06-06

