我正在使用套接字在Java中制作一个聊天应用程序。我遇到了一些我以前从未遇到过的奇怪问题。首先,服务器类:
这是我的服务器类。如果我提供了不需要的代码,请原谅,但是鉴于我问题的性质,我想给你们完整的信息。
服务器类:
public class Server implements Runnable
{
private final static int port=8000;
private static Set<Socket> socs=new HashSet<>();
private static Thread t1;
private static BufferedReader br;
private static PrintWriter ps;
private static Socket socketClient;
private static String message;
private static HashSet<String> users=new HashSet<>();
private static HashMap<Socket,String> socket_id=new HashMap<>();
private static HashMap<String,String> id_name=new HashMap<>();
public Server()
{
try {
ServerSocket socket=new ServerSocket(port);
while(true)
{System.out.println("Waiting for connections...");
socketClient=socket.accept();
System.out.println("Connected to user at: "+socketClient.getInetAddress());
socs.add(socketClient);
t1=new Thread(this);
t1.start(); //to receive data
}
} catch (IOException e) {
e.printStackTrace();
}
}
//registration for the client
public void registration(String name,String id) throws IOException
{
if(users.contains(name))
{
ps=new PrintWriter(socketClient.getOutputStream());
ps.println("duplicate"+"\n");
ps.flush();
}
else
{
users.add(name);
socket_id.put(socketClient,id);
id_name.put(id,name);
}
}
public void run() {
int count=0;
try {
br=new BufferedReader(new InputStreamReader(socketClient.getInputStream()));
do
{
message=br.readLine();
if(count==0)
{
UUID id=UUID.randomUUID();
String id_client=id.toString();
registration(message.substring(0,message.indexOf(':')),id_client);
count++;
}
for(Socket s:socs)
{
ps=new PrintWriter(s.getOutputStream());
ps.println(message+"\n");
ps.flush();
}
}while(br.readLine()!=null);
}
catch(SocketException e)
{
System.out.println("A user left");
}
catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
public static void main(String args[])
{
Server server=new Server();
}
}
以下是我客户端类的发送和接收函数:
private void send_data() {
if(textField.getText().length()!=0)
{ if(textField.getText().equals("!clear")) //command to clear the chat histroy
{
textArea.setText("");
textField.setText("");
}
else
{
ps.println(this.name+": "+textField.getText()+"\n");
ps.flush();
}
}
}
public void receive_data(){
try {
br=new BufferedReader(new InputStreamReader(socket.getInputStream()));
do
{ String message=br.readLine();
if(message.length()!=0)
console(message);
}while(br.readLine()!=null);
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
//此函数检查重复的用户名。
public void check() throws IOException
{
BufferedReader b=new BufferedReader(new InputStreamReader(socket.getInputStream()));
if(b.readLine().equals("duplicate"))
{ JOptionPane.showMessageDialog(null, "Username taken");
socket.close();
b.close();
dispose();
new Login().setVisible(true);
}
}
现在,问题:
1.当第一个客户端连接时,一切正常。消息将按预期显示在控制台上。
2.当第二个用户加入时,第一个用户不能向服务器发送任何消息。最新的客户端运行流畅,但是在它之前连接的所有客户端都无法向服务器发送任何消息。或者可能服务器没有将消息转发给他们。
3.每当用户被告知用户名已被占用并被发送回登录屏幕时,所有其他客户端的聊天记录都开始显示空。
4.客户端发送到服务器的第一条消息不会显示在聊天历史记录中。从第二条消息开始,一切正常,直到其他客户端连接为止。
请帮忙,提前致谢。这个问题已经困扰我很长一段时间了,尽管我做了很多尝试,但我还是无法调试它。
有什么建议吗?
private static Socket socketClient;
问题就在这里。此数据项不应是静态的,并且根本不应位于服务器
类中。它应该位于另一个类(通常是 Runnable
)中,该类按接受的客户端实例化并用作相应线程的基础。
这同样适用于关联的流和任何其他每个客户端的状态。
实际上没有任何好的理由让这些非最终数据项成为静态的。除非你知道为什么,否则不要让事情一成不变。
我已经实现了一个通过套接字进行通信的全局聊天。客户端写入一条消息,发送到服务器,然后服务器将消息发回给所有客户端。每个客户端都由一个名为ClientThread的类表示,因此每个客户端都是一个线程。每次新客户端连接时,我都会创建一个新的ClientThread实例,并将所有这些实例存储在列表中。现在我想实现一个私人聊天,这样每个客户端就可以私下与另一个客户端交谈(或者2,3或更多的群聊)。 我还想
我需要在netty中有一个客户机/服务器通信,用于我的项目目的之一。所以我刚开始用一个handsOn来改进,我正在学习netty,我是一个初学者。 我尝试了一个简单的客户端服务器与Netty聊天。 客户端和服务器正在初始化,我可以看到服务器能够获得用于建立连接的客户端管道,但是当客户端发送消息时,它没有进入ServerAdapterHandler的messageReceived部分。下面是我的源代
我想在java上创建一个客户机/服务器应用程序,服务器的IP地址为192.168.1.100,在端口4500上等待客户机请求。 客户端从键盘上读取字符串,向服务器发送连接请求。一旦建立了连接,它就会将字符串发送到服务器。 这是我尝试的代码: 对于服务者: 对于客户端: 但这段代码有一个问题:
我正在试用一个简单的示例。我能够运行服务器应用程序和客户端应用程序来彼此通信。我现在需要了解一个教程,说明两个客户机如何通过服务器相互通信。 我怎么能这么做?有人能给我指出一个好的教程或者解释如何在Java中实现这一点吗
问题内容: 我正在使用Java和针对Java的Swing类进行聊天应用程序。 ChatServer类将是从客户端接收消息并回显所有客户端的服务器,但我仅打算为2个客户端进行聊天。 ChatClient类都是客户端。它们在“文本区域”上显示从服务器发送的内容。并将“文本字段”中的文本发送到服务器。 ChatClient类 ChatServer类 我对这个程序的过程的想法是: 启动ChatServer