本文目录一览:
- 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) {
}
}
}
}
}