本文目錄一覽:
Java聊天室程序奇怪錯誤
最簡單的方法就是:你不是Eclipse,打斷點調試,跟蹤程序。
看到你的描述,以下是我的猜測。你可以通過打斷點跟蹤驗證。
1.情況是否是這樣,3個用戶A,B,C依次登錄,都登錄後,他們的用戶列表為:
A用戶列表為A;B用戶列表為A,B;C用戶列表為A,B,C。
2.如果是1的情況,則要確保當有用戶登錄時,服務端的是否把用戶列表都循環發給每個在線用戶了。
3.如果已經循環發給每個用戶,還要確保循環的多次發送用戶列表,會不會都發給同一用戶了。
維護用戶列表:我的思路是這樣的,當有用戶登錄時。服務端拿到所有客戶的Socket,然後for循環,往每個客戶的Socket中發條信息(XX已登錄到聊天室,這樣確保是否每個用戶都能收到),並發送用戶列表給每個用戶。當有用戶退出時,也這樣處理。
還不行你就把程序發給我吧。youngao007@163.com
JAVA 聊天室怎麼實現“同樣的內容短時間內不可發送多次”
可以在客戶端和服務端同時進行判斷。
服務端判斷方法是緩存上一次的消息內容和說話時間。下次接受到客戶端說話時,進行內容對比和時間對比。這樣的話可以阻止掉類似這樣的客戶端消息:A,A,A,A
考慮到服務端壓力,這裡只緩存了上次的一個消息,沒有緩存多個。如果客戶端發送這樣的消息就無能為力了:A,B,A,B,A。當然,消息發送時間間隔限制仍然可以緩解這樣的無腦客戶端的壓力
在客戶端用同樣的方法。由於客戶端可以知道用戶的更多信息。進而可以給客戶更多的限制
java 聊天室 源代碼
【ClientSocketDemo.java 客戶端Java源代碼】
import java.net.*;
import java.io.*;
public class ClientSocketDemo
{
//聲明客戶端Socket對象socket
Socket socket = null;
//聲明客戶器端數據輸入輸出流
DataInputStream in;
DataOutputStream out;
//聲明字符串數組對象response,用於存儲從服務器接收到的信息
String response[];
//執行過程中,沒有參數時的構造方法,本地服務器在本地,取默認端口10745
public ClientSocketDemo()
{
try
{
//創建客戶端socket,服務器地址取本地,端口號為10745
socket = new Socket(“localhost”,10745);
//創建客戶端數據輸入輸出流,用於對服務器端發送或接收數據
in = new DataInputStream(socket.getInputStream());
out = new DataOutputStream(socket.getOutputStream());
//獲取客戶端地址及端口號
String ip = String.valueOf(socket.getLocalAddress());
String port = String.valueOf(socket.getLocalPort());
//向服務器發送數據
out.writeUTF(“Hello Server.This connection is from client.”);
out.writeUTF(ip);
out.writeUTF(port);
//從服務器接收數據
response = new String[3];
for (int i = 0; i response.length; i++)
{
response[i] = in.readUTF();
System.out.println(response[i]);
}
}
catch(UnknownHostException e){e.printStackTrace();}
catch(IOException e){e.printStackTrace();}
}
//執行過程中,有一個參數時的構造方法,參數指定服務器地址,取默認端口10745
public ClientSocketDemo(String hostname)
{
try
{
//創建客戶端socket,hostname參數指定服務器地址,端口號為10745
socket = new Socket(hostname,10745);
in = new DataInputStream(socket.getInputStream());
out = new DataOutputStream(socket.getOutputStream());
String ip = String.valueOf(socket.getLocalAddress());
String port = String.valueOf(socket.getLocalPort());
out.writeUTF(“Hello Server.This connection is from client.”);
out.writeUTF(ip);
out.writeUTF(port);
response = new String[3];
for (int i = 0; i response.length; i++)
{
response[i] = in.readUTF();
System.out.println(response[i]);
}
}
catch(UnknownHostException e){e.printStackTrace();}
catch(IOException e){e.printStackTrace();}
}
//執行過程中,有兩個個參數時的構造方法,第一個參數hostname指定服務器地址
//第一個參數serverPort指定服務器端口號
public ClientSocketDemo(String hostname,String serverPort)
{
try
{
socket = new Socket(hostname,Integer.parseInt(serverPort));
in = new DataInputStream(socket.getInputStream());
out = new DataOutputStream(socket.getOutputStream());
String ip = String.valueOf(socket.getLocalAddress());
String port = String.valueOf(socket.getLocalPort());
out.writeUTF(“Hello Server.This connection is from client.”);
out.writeUTF(ip);
out.writeUTF(port);
response = new String[3];
for (int i = 0; i response.length; i++)
{
response[i] = in.readUTF();
System.out.println(response[i]);
}
}
catch(UnknownHostException e){e.printStackTrace();}
catch(IOException e){e.printStackTrace();}
}
public static void main(String[] args)
{
String comd[] = args;
if(comd.length == 0)
{
System.out.println(“Use localhost(127.0.0.1) and default port”);
ClientSocketDemo demo = new ClientSocketDemo();
}
else if(comd.length == 1)
{
System.out.println(“Use default port”);
ClientSocketDemo demo = new ClientSocketDemo(args[0]);
}
else if(comd.length == 2)
{
System.out.println(“Hostname and port are named by user”);
ClientSocketDemo demo = new ClientSocketDemo(args[0],args[1]);
}
else System.out.println(“ERROR”);
}
}
////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
【ServerSocketDemo.java 服務器端Java源代碼】
import java.net.*;
import java.io.*;
public class ServerSocketDemo
{
//聲明ServerSocket類對象
ServerSocket serverSocket;
//聲明並初始化服務器端監聽端口號常量
public static final int PORT = 10745;
//聲明服務器端數據輸入輸出流
DataInputStream in;
DataOutputStream out;
//聲明InetAddress類對象ip,用於獲取服務器地址及端口號等信息
InetAddress ip = null;
//聲明字符串數組對象request,用於存儲從客戶端發送來的信息
String request[];
public ServerSocketDemo()
{
request = new String[3]; //初始化字符串數組
try
{
//獲取本地服務器地址信息
ip = InetAddress.getLocalHost();
//以PORT為服務端口號,創建serverSocket對象以監聽該端口上的連接
serverSocket = new ServerSocket(PORT);
//創建Socket類的對象socket,用於保存連接到服務器的客戶端socket對象
Socket socket = serverSocket.accept();
System.out.println(“This is server:”+String.valueOf(ip)+PORT);
//創建服務器端數據輸入輸出流,用於對客戶端接收或發送數據
in = new DataInputStream(socket.getInputStream());
out = new DataOutputStream(socket.getOutputStream());
//接收客戶端發送來的數據信息,並顯示
request[0] = in.readUTF();
request[1] = in.readUTF();
request[2] = in.readUTF();
System.out.println(“Received messages form client is:”);
System.out.println(request[0]);
System.out.println(request[1]);
System.out.println(request[2]);
//向客戶端發送數據
out.writeUTF(“Hello client!”);
out.writeUTF(“Your ip is:”+request[1]);
out.writeUTF(“Your port is:”+request[2]);
}
catch(IOException e){e.printStackTrace();}
}
public static void main(String[] args)
{
ServerSocketDemo demo = new ServerSocketDemo();
}
}
java語音聊天室怎樣實現啊?
實現java語音聊天室的方法很簡單,要麼自己從零研發,要麼直接使用別人的成品,意思是找網上的第三方,他們自己有研發產品的。建議考慮ZEGO即構科技,他們的語聊房SDK很好用的,提供低延遲和低成本的方案供選擇,在保障語音質量的前提下,碼率最低可到8kbps,可以試試。
原創文章,作者:小藍,如若轉載,請註明出處:https://www.506064.com/zh-hant/n/279087.html