我正在使用套接字在Java中制作聊天应用程序。我遇到了一些我从未遇到的奇怪问题。首先,服务器类: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.客户端发送到服务器的第一条消息不会显示在聊天记录中。从第二条消息开始,一切运行正常,直到其他客户端连接。
请帮助和提前致谢。这个问题一直在困扰着我很长一段时间,我无法调试它,尽管许多尝试。
有什么建议吗?
我会试试看,并让你知道。 –