gpt4 book ai didi

Java聊天服务器

转载 作者:太空宇宙 更新时间:2023-11-04 08:58:24 25 4
gpt4 key购买 nike

仅供引用,这是家庭作业。我必须构建一个 Java 聊天服务器。我已经能够构建一个与 1 个客户端通信的服务器。但我需要它来与多个用户进行通信。

用户应该输入他们想要交谈的人的名字,后跟破折号(-),然后是要发送的消息。我能够让用户登录,但无法打印用户列表或发送给其他用户的消息。这是服务器代码:

/** 
Threaded Server
*/

import java.net.ServerSocket;
import java.net.Socket;
import java.util.Scanner;
import java.io.PrintWriter;
import java.util.HashMap;
import java.util.Set;

public class ThreadedServer
{
public static void main( String[] args) throws Exception
{
HashMap<String, Socket> users = new HashMap<String, Socket>( );
ServerSocket server = new ServerSocket(5679);
System.out.println( "THE CHAT SERVER HAS STARTED! =)" );
while(true)
{
Socket client = server.accept();
ThreadedServer ser = new ThreadedServer();
ClientFromThread cft =ser.new ClientFromThread(client);
String name = cft.getUserName();
users.put( name, client );
cft.giveUsersMap( users );
//cft.giveOnlineUsers( ); //DOES NOT WORK YET!!!!
System.out.println("Threaded server connected to "
+ client.getInetAddress() + " USER: " + name );
}

}

//***************************************************************************************************

class ClientFromThread extends Thread
{
private Socket client;
private Scanner fromClient;
private PrintWriter toClient;
private String userName;
HashMap<String, Socket> users;

public ClientFromThread( Socket c ) throws Exception
{
client = c;
fromClient = new Scanner( client.getInputStream() );
toClient = new PrintWriter( client.getOutputStream(), true );
userName = getUser();
start();
}
public void giveUsersMap( HashMap<String, Socket> users )
{
this.users = users;
}

//THIS DOESNT WORK YET... IT PRINTS THE FIRST LINE BUT NOT THE LIST
public void giveOnlineUsers()
{
toClient.println("These users are currently online:");
Set<String> userList = users.keySet();
String[] userNames = null;
userList.toArray( userNames );

for( int i = 0; i< userNames.length; i++ )
{
toClient.println(userNames[i]);
}
}

public String getUserName()
{
return userName;
}

private String getUser()
{
String s = "";
while( (s.length() < 1) || (s == null) )
{
toClient.println("What is your first name? ");
s=fromClient.nextLine().trim();
}
toClient.println("Thank You! Welcome to the chat room " + s + ".");
return s.toUpperCase();
}

public void run()
{
String s = null;
String toUser;
String mesg;

while( (s=fromClient.nextLine().trim()) != null )
{
if( s.equalsIgnoreCase( "END" )) break;

for( int i=0; i<s.length(); i++)
{
if( s.charAt(i) == '-' )
{
toUser = s.substring( 0, i ).trim().toUpperCase();
mesg = s.substring( i+1 ).trim();
Socket client = users.get( toUser );
try
{
ClientToThread ctt = new ClientToThread(client);
ctt.sendMesg( mesg, toUser );
ctt.start();
}
catch(Exception e){e.printStackTrace();}
break;
}
if( (i+1) == s.length() )
{
toClient.println("Sorry the text was invalid. Please enter a user name " +
"followed by a dash (-) then your message.");
}
}
}
try
{
fromClient.close();
toClient.close();
client.close();
}
catch(Exception e){e.printStackTrace();}
}

} //end class ClientFromThread

//***************************************************************************************************

class ClientToThread extends Thread
{
private Socket client;
private PrintWriter toClient;
private String mesg;

public ClientToThread( Socket c ) throws Exception
{
client = c;
toClient = new PrintWriter( client.getOutputStream(), true );
}

public void sendMesg( String mesg, String userName )
{
this.mesg = userName + ": " + mesg;
}
public void run()
{
toClient.println(mesg);

try
{
toClient.close();
client.close();
}
catch(Exception e){e.printStackTrace();}
}

} //end class ClientToThread

//***************************************************************************************************

} //end class ThreadedServer

这是客户端代码”

import java.net.Socket;
import java.io.BufferedReader;
import java.io.InputStreamReader;
import java.io.PrintWriter;


public class ReverseClient
{
public static void main( String[] args ) throws Exception
{
String line = null;
Socket server= new Socket( "10.0.2.103", 5679);
System.out.println( "Connected to host: " + server.getInetAddress() );
BufferedReader fromServer = new BufferedReader(
new InputStreamReader(server.getInputStream()) );
PrintWriter toServer = new PrintWriter( server.getOutputStream(), true );
BufferedReader input = new BufferedReader(
new InputStreamReader(System.in) );
while( (line=input.readLine()) !=null )
{
toServer.println(line);
System.out.println( fromServer.readLine() );
}
fromServer.close();
toServer.close();
input.close();
server.close();

}
}

这是控制台输出(顶部是服务器,底部是客户端): alt text

我收到错误(如上图所示)并且消息未发送。关于如何处理这些问题有什么建议吗?

最佳答案

到目前为止,我发现这是一个问题,但我不认为这是唯一的问题..

这将有助于 NoSuchElementException在第 90 行左右更改此...

while( (s=fromClient.nextLine().trim()) != null )
{

对此...

while(fromClient.hasNext())
{
s = fromClient.nextLine().trim();

好的,刚刚在 ClientToThread.run() 中发现了另一个问题...您在发送第一条消息后将关闭客户端连接。我把它们都注释掉了,看起来效果更好了一些。

public void run()
{
toClient.println(mesg);
try {
//toClient.close();
//client.close();
}
catch (Exception e) {
e.printStackTrace();
}
}

关于Java聊天服务器,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1583832/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com