本文目錄一覽:
- 1、java語音聊天室怎樣實現啊?
- 2、急求一個關於UDP的JAVA實現多人聊天源代碼
- 3、java UDP 實現 多人聊天
- 4、Java實現一個簡單的聊天室
- 5、我做java的簡易聊天室,已經可以群聊和私聊,如何把創建房間加進去,且只能同一個房間里才能群聊和私聊?
- 6、40、在Java中,如何實現組播通信?
java語音聊天室怎樣實現啊?
實現java語音聊天室的方法很簡單,要麼自己從零研發,要麼直接使用別人的成品,意思是找網上的第三方,他們自己有研發產品的。建議考慮ZEGO即構科技,他們的語聊房SDK很好用的,提供低延遲和低成本的方案供選擇,在保障語音質量的前提下,碼率最低可到8kbps,可以試試。
急求一個關於UDP的JAVA實現多人聊天源代碼
import java.io.InputStream;
import java.io.DataInputStream;
import java.io.InputStreamReader;
import java.io.OutputStream;
import java.io.DataOutputStream;
import java.io.BufferedReader;
import java.net.ServerSocket;
import java.net.Socket;
import java.io.IOException;
import java.util.Date;
class Server
{
public Server()
{
try
{
ServerSocket s=new ServerSocket(8888);
Socket ss=s.accept();
OutputStream out=ss.getOutputStream();
DataOutputStream dout=new DataOutputStream(out);
InputStream in=ss.getInputStream();
DataInputStream din=new DataInputStream(in);
System.out.print(din.readUTF()+”!”);
dout.writeUTF(“你已經連接到服務器”+”\t”+”你的地址:”+ss.getInetAddress()+”\t”
+”你的鏈接端口:”+ss.getLocalPort()+”\n”);
new ReadMessage(din).start();
new SendMessage(dout).start();
}
catch (IOException e)
{
e.printStackTrace();
}
}
public static void main(String[] args)
{
new Server();
}
}
//接受客戶端信息
class ReadMessage extends Thread
{
private DataInputStream din;
public ReadMessage(DataInputStream din)
{
this.din=din;
}
public void run()
{
String str;
try
{
while (true)
{
str=din.readUTF();
System.out.println(new Date().toLocaleString()+”客戶端說:”+str);
if (str.equals(“bye”))
{
System.out.println(“客戶端下線!”);
break;
}
}
}
catch (IOException e)
{
e.printStackTrace();
}
}
}
// 發出服務器信息
class SendMessage extends Thread
{
private DataOutputStream dout;
public SendMessage(DataOutputStream dout)
{
this.dout=dout;
}
public void run()
{
InputStreamReader inr=new InputStreamReader(System.in);
BufferedReader buf=new BufferedReader(inr);
String str;
try
{
while(true)
{
str=buf.readLine();
dout.writeUTF(str);
if (str.equals(“bye”))
{
System.out.println(“服務器退出!”);
System.exit(1);
}
}
}
catch (IOException e)
{
e.printStackTrace();
}
}
}
import java.io.InputStream;
import java.io.DataInputStream;
import java.io.InputStreamReader;
import java.io.OutputStream;
import java.io.DataOutputStream;
import java.io.BufferedReader;
import java.net.Socket;
import java.io.IOException;
import java.util.Date;
class Client
{
public Client()
{
try
{
Socket s=new Socket(“192.168.1.2”,8888);
InputStream in=s.getInputStream();
DataInputStream din=new DataInputStream(in);
OutputStream out=s.getOutputStream();
DataOutputStream dout=new DataOutputStream(out);
dout.writeUTF(“服務器你好!我是客戶端”);
System.out.println(din.readUTF());
new Thread(new SenderMessage(dout)).start();
new Thread(new ReaderMessage(din)).start();
}
catch (IOException e)
{
e.printStackTrace();
}
}
public static void main(String[] args)
{
new Client();
}
}
class ReaderMessage implements Runnable
{
private DataInputStream din;
public ReaderMessage(DataInputStream din)
{
this.din=din;
}
public void run()
{
String str;
try
{
while(true)
{
str=din.readUTF();
System.out.println(new Date().toLocaleString()+”服務器說:”+str);
if (str.equals(“bye”))
{
System.out.println(“服務器已經關閉,此程序自動退出!”);
break;
}
}
}
catch (IOException e)
{
e.printStackTrace();
}
}
}
class SenderMessage implements Runnable
{
private DataOutputStream dout;
public SenderMessage(DataOutputStream dout)
{
this.dout=dout;
}
public void run()
{
String str;
InputStreamReader inf=new InputStreamReader(System.in);
BufferedReader buf=new BufferedReader(inf);
try
{
while (true)
{
str=buf.readLine();
dout.writeUTF(str);
if (str.equals(“bye”))
{
System.out.println(“客戶端自己退出!”);
System.exit(1);
}
}
}
catch (IOException e)
{
e.printStackTrace();
}
}
}
java UDP 實現 多人聊天
UDP也可以和TCP那樣遍歷list然後發送啊
客戶端向外面開一個UDP端口接受數據報
然後服務器這邊要是有消息要發送就直接發送數據報包就可以了嘛
UDP都不用保持着連接的,比TCP還簡單些
另外也可以用組播來實現,搜索下java UDP 組播,你能找到不少實例性的代碼,也有聊天室的代碼
Java實現一個簡單的聊天室
基本原理就是弄一個全局的容器,每進來一個人,將ip等相關信息放入容器,有人發送消息時,遍歷容器,向除它而外的所有人發送該消息。並不是很難,但是要考慮的細節還是不少的
我做java的簡易聊天室,已經可以群聊和私聊,如何把創建房間加進去,且只能同一個房間里才能群聊和私聊?
我說下思路:
1、客戶端創建房間時給每個房間分配惟一的一個房間ID,房間是公開的,每個連接的客戶端都可以看到,房間屬性,比如密碼,比如黑名單,房間保存在Server內存當中,如果你使用了集群,建議存儲到分布式緩存當中(Redis是最好的選擇,其次是memcached),當創建完成後,將房間信息發送給所有客戶端。新客戶端連接進來時,客戶端要主動從服務端拉取房間信息。建議採用服務端主動通知(房間增減,服務端主動通知給所有客戶端)和客戶端定時輪詢(客戶端起個定時任務,每隔一定時間主動向服務端拉取房間列表)的方式來保證房間列表的動態更新。
2、當客戶端選擇加入房間時,如果設置有加入條件,比如密碼,那就提示客戶端輸入,如果是其他條件就判斷加入客戶端是否符合這個條件。服務端保存房間同客戶端的關聯關係(可以設計成一對多,也就是一個客戶端只能在一個房間聊天,也可以設計成多對多,一個客戶端可以同時加入多個房間聊天,主要看設計),並將這個消息通知給這個房間所有的客戶端列表“歡迎***進入房間”(消息的發送者為系統,房間ID這個房間的ID,接收人無,表示是這個房間的公開消息,消息內容即:歡迎***進入房間。)
3、把聊天內容當成消息的話,那消息應該有這樣的屬性,發送人,房間ID(如果沒有房間ID就當成系統公告消息,在所有房間顯示),接收人(如果沒有指定接收人,則是公開消息,如果有接收人,就是私聊消息,只能在同一個房間私聊,那在發消息的時候要判斷下接收客戶端的是否在這個房間列表當中)。
4、再來說消息路由設置,當客戶端發送消息時,根據房間ID,找到這個這個房間內所有的客戶端列表,如果沒有指定接收人,那消息就推送給這個房間關聯的所有客戶端,如果指定有接收人,接收人不在這個房間,直接提示“***已經離開”,如果還在就把消息推送給這個指定的客戶端。
5、房間的管理:踢人,把這個客戶端從房間同客戶端關聯關係解除,並在房間顯示消息“***被踢出房間”等等
40、在Java中,如何實現組播通信?
編輯一個java組播應用程序的過程如下
1. 創建一個用於發送和接收的MulticastSocket組播套接字對象
2. 創建一個指定緩衝區大小及組播地址和端口的DatagramPacket組播數據包對象
3. 使用組播套接字joinGroup(),將其加入到一個組播
4. 使用組播套接字的send()方法,將組播數據包對象放入其中,發送組播數據包.
或者
使用組播套接字的receive()方法,將組播數據包對象放入其中,接收組播數據包
5. 解碼組播數據包提取信息,並依據得到的信息作出響應String s = new String(dp.getData(), 0, dp.getLength());
6. 重複過程4和5,即在while循環中實現。
7. 使用組播套接字的leaveGroup()方法,離開組播組;關閉組播套接字
接收組播數據包程序:
Java代碼
public class MulticastReceived {
public static void main(String[] args) throws Exception {
InetAddress group = InetAddress.getByName(“224.0.0.4”); // 組播地址
int port = 4006; // 端口
MulticastSocket msr = null;
try {
msr = new MulticastSocket(port); // 1.創建一個用於發送和接收的MulticastSocket組播套接字對象
msr.joinGroup(group); // 3.使用組播套接字joinGroup(),將其加入到一個組播
byte[] buffer = new byte[8192];
System.out.println(“接收數據包啟動!(啟動時間:)” + new java.util.Date() + “)”);
while (true) {
DatagramPacket dp = new DatagramPacket(buffer, buffer.length); // 2.創建一個指定緩衝區大小及組播地址和端口的DatagramPacket組播數據包對象
msr.receive(dp); // 4.使用組播套接字的receive()方法,將組播數據包對象放入其中,接收組播數據包
String s = new String(dp.getData(), 0, dp.getLength()); // 5.解碼組播數據包提取信息,並依據得到的信息作出響應
System.out.println(s);
}
} catch (IOException e) {
e.printStackTrace();
} finally {
if (msr != null) {
try {
msr.leaveGroup(group); // 7.使用組播套接字的leaveGroup()方法,離開組播組
msr.close(); // 關閉組播套接字
} catch (IOException e) {
}
}
}
}
}
發送組播數據包程序:
Java代碼
public class MulticastSender {
public static void main(String[] args) throws Exception {
InetAddress group = InetAddress.getByName(“224.0.0.1”); // 組播地址
int port = 4000; // 端口
MulticastSocket mss = null;
try {
mss = new MulticastSocket(port); // 1.創建一個用於發送和接收的MulticastSocket組播套接字對象
mss.joinGroup(group); // 3.使用組播套接字joinGroup(),將其加入到一個組播
byte[] buffer = new byte[8192];
System.out.println(“接收數據包啟動!(啟動時間:)” + new java.util.Date() + “)”);
while (true) {
String message = “Hello” + new java.util.Date();
byte[] buffer2 = message.getBytes(); // 2.創建一個指定緩衝區大小及組播地址和端口的DatagramPacket組播數據包對象
DatagramPacket dp = new DatagramPacket(buffer, buffer.length, group, port);
// msr.receive(dp); //接收組播數據包
mss.send(dp); // 4.使用組播套接字的send()方法,將組播數據包對象放入其中,發送組播數據包
// String s = new String(dp.getData(), 0, dp.getLength()); //5.解碼組播數據包提取信息,並依據得到的信息作出響應
System.out.println(“發送數據包給” + group + “:” + port);
Thread.sleep(1000);
}
} catch (IOException e) {
e.printStackTrace();
} finally {
if (mss != null) {
try {
mss.leaveGroup(group); // 7.使用組播套接字的leaveGroup()方法,離開組播組
mss.close(); // 關閉組播套接字
} catch (IOException e) {
}
}
}
}
}
原創文章,作者:簡單一點,如若轉載,請註明出處:https://www.506064.com/zh-hant/n/130755.html