先决条件: 在socket编程中引入线程 , 多线程聊天应用程序|集1
null
本文给出了多线程聊天应用程序的客户端程序的实现。到目前为止,套接字编程中的所有示例都假定客户机首先发送一些信息,然后服务器或其他客户机响应这些信息。 在现实世界中,情况可能并非如此。不需要向某人发送消息就可以接收消息。无论何时,客户机都应该随时收到消息,即发送和接收必须 作为单独的活动实施,而不是按顺序实施 . 有一个非常简单的解决方案,它使用线程来实现这个功能。在客户端实现中,我们将创建两个线程:
- 发送消息: 此线程将用于向其他客户端发送消息。工作非常简单,需要输入消息才能发送,收件人才能发送。请注意,此实现假定消息的格式为 邮件#收件人 ,其中收件人是收件人的名称。然后,它将消息写入其输出流,该输出流连接到此客户端的处理程序。处理程序将消息和收件人部分断开,并传递给特定的收件人。让我们看看这个线程是如何实现的。
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();
}
}
}
});
- 阅读信息: 创建接收消息的线程也采用了类似的方法。当任何客户机试图在这个客户机输入流上写入时,我们使用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();
}
}
}
});
客户端编程的其余步骤与前面的示例类似。简要说明如下——
- 建立套接字连接
- 表达 在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