Java | Set 2中的多线程聊天应用程序(客户端编程)

先决条件: 在socket编程中引入线程 , 多线程聊天应用程序|集1

null

本文给出了多线程聊天应用程序的客户端程序的实现。到目前为止,套接字编程中的所有示例都假定客户机首先发送一些信息,然后服务器或其他客户机响应这些信息。 在现实世界中,情况可能并非如此。不需要向某人发送消息就可以接收消息。无论何时,客户机都应该随时收到消息,即发送和接收必须 作为单独的活动实施,而不是按顺序实施 . 有一个非常简单的解决方案,它使用线程来实现这个功能。在客户端实现中,我们将创建两个线程:

  1. 发送消息: 此线程将用于向其他客户端发送消息。工作非常简单,需要输入消息才能发送,收件人才能发送。请注意,此实现假定消息的格式为 邮件#收件人 ,其中收件人是收件人的名称。然后,它将消息写入其输出流,该输出流连接到此客户端的处理程序。处理程序将消息和收件人部分断开,并传递给特定的收件人。让我们看看这个线程是如何实现的。

    Thread sendMessage = new Thread( new Runnable() {
    @Override
    public void run() {
    while ( true ) {
    // read the message to deliver.
    String msg = sc.nextLine();
    try {
    // write on the output stream
    dos.writeUTF(msg);
    } catch (IOException e) {
    e.printStackTrace();
    }
    }
    }
    });

    
    

  2. 阅读信息: 创建接收消息的线程也采用了类似的方法。当任何客户机试图在这个客户机输入流上写入时,我们使用readUTF()方法来读取该消息。下面是这个线程的实现过程-

    Thread readMessage = new Thread( new Runnable() {
    @Override
    public void run() {
    while ( true ) {
    try {
    // read the message sent to this client
    String msg = dis.readUTF();
    System.out.println(msg);
    } catch (IOException e) {
    e.printStackTrace();
    }
    }
    }
    });

    
    

客户端编程的其余步骤与前面的示例类似。简要说明如下——

  1. 建立套接字连接
  2. 表达 在readMessage和sendMessage线程的帮助下进行通信。独立的读写线程确保了消息的同步发送和接收。

// Java implementation for multithreaded chat client
// Save file as Client.java
import java.io.*;
import java.net.*;
import java.util.Scanner;
public class Client
{
final static int ServerPort = 1234 ;
public static void main(String args[]) throws UnknownHostException, IOException
{
Scanner scn = new Scanner(System.in);
// getting localhost ip
InetAddress ip = InetAddress.getByName( "localhost" );
// establish the connection
Socket s = new Socket(ip, ServerPort);
// obtaining input and out streams
DataInputStream dis = new DataInputStream(s.getInputStream());
DataOutputStream dos = new DataOutputStream(s.getOutputStream());
// sendMessage thread
Thread sendMessage = new Thread( new Runnable()
{
@Override
public void run() {
while ( true ) {
// read the message to deliver.
String msg = scn.nextLine();
try {
// write on the output stream
dos.writeUTF(msg);
} catch (IOException e) {
e.printStackTrace();
}
}
}
});
// readMessage thread
Thread readMessage = new Thread( new Runnable()
{
@Override
public void run() {
while ( true ) {
try {
// read the message sent to this client
String msg = dis.readUTF();
System.out.println(msg);
} catch (IOException e) {
e.printStackTrace();
}
}
}
});
sendMessage.start();
readMessage.start();
}
}


输出: 从客户端0:

hello#client 1
client 1 : heya
how are you#client 1
client 1 : fine..how about you
logout

来自客户1:

client 0 : hello
heya#client 0
client 0 : how are you
fine..how about you#client 0
logout

要点:

  • 要从任何客户端发送消息,请键入消息,后跟“#”,然后键入收件人客户端的名称。请注意,此实现的名称为“客户端0”、“客户端1……”因此,必须在末尾加上客户名称。然后按回车键。
  • 消息发送后,该客户端的处理程序将接收该消息,并将其传递到指定的客户端。
  • 如果任何客户端向该客户端发送消息,readMessage线程将自动在控制台上打印消息。
  • 一旦客户端完成聊天,他就可以发送一条“注销”消息,而不需要任何收件人姓名,这样服务器就会知道该客户端已注销系统。建议在为客户端关闭终端之前发送注销消息,以避免任何错误。

如何运行上述程序?

与前面的示例类似,首先运行服务器,然后运行客户端的多个实例。尝试从每个客户端向彼此发送消息。请确保您只向有效的客户端发送消息,即发送到活动列表中可用的客户端。

改进建议

这只是关于如何使用线程和套接字编程来创建强大程序的解释部分。对于感兴趣的读者,以上实现有一些改进建议-

  • 为客户端创建用于发送和接收消息的图形用户界面。Netbeans等工具可用于快速设计接口
  • 目前,这些名称被硬编码为客户端0、客户端1。这可以改进为使用用户指定的昵称。
  • 此实现可以进一步增强,以向客户端提供当前活动用户的列表,这样他就可以知道他所有的朋友都在网上。为此,可以实现一个简单的方法,当调用该方法时,它会打印活动列表中的名称。

本文由 Rishabh Mahrsee .如果你喜欢GeekSforgek,并想贡献自己的力量,你也可以使用 贡献极客。组织 或者把你的文章寄到contribute@geeksforgeeks.org.看到你的文章出现在Geeksforgeks主页上,并帮助其他极客。

如果您发现任何不正确的地方,或者您想分享有关上述主题的更多信息,请写下评论。

© 版权声明
THE END
喜欢就支持一下吧
点赞9 分享