65.9K
CodeProject 正在变化。 阅读更多。
Home

iChat... 另一个服务器/客户端模型...

starIconstarIconstarIconstarIcon
emptyStarIcon
starIcon

4.56/5 (15投票s)

2008年10月18日

GPL3

6分钟阅读

viewsIcon

103958

downloadIcon

9025

出于一个小项目的目的而做的... 留意我的真实项目...

第一个文件是应用程序的客户端部分,第二个文件包含与服务器相关的所有内容,最后一个文件包含两者... (不要浪费你哪怕几 KB 的下载流量!!!)。虽然你可以通过更改协议头来将你的服务器端或客户端与我的进行接口,但我建议使用它们以获得最佳效果...

引言

又一个具有漂亮 Swing 前端的服务器/客户端模型... 虽然有很多服务器/客户端模型,但我试图设计得最简单... 你可以自由地将此源代码用于任何你想要的用途,但建议你至少要好好理解它!!!

背景

好吧,这个项目没有特别的背景... 我们有一个小型项目要用 JAVA 做。我们的主题是服务器/客户端... 所以我上网搜寻,查阅了很多关于类似主题的文章、代码等,并得出结论,代码可以更简单,UI 可以更精细... 如果你擅长阅读代码,可以直接看代码,我已插入了注释... 完全的新手可以从本文中获得一些指导。

服务器端

应用程序的服务器端包含三个文件

  • InfiniteChatServer.java
  • InfiniteChatClinetHandler.java
  • InfiniteChatClientObject.java

InfiniteChatServer.java 

在这里,文件 'InfiniteChatServer.java' 是最高层级的。它创建了一个 GUI 来接受端口号,以便在给定端口上设置服务器套接字。这由一个JTextField管理。GUI 还提供了另外三个JButtons (!),分别用于启动、停止和退出 iChat 服务器。当服务器运行时,“start”按钮被禁用,当服务器未运行时,“stop”按钮被禁用。“Exit”按钮始终启用,让用户随时可以选择退出。

每当用户单击“start”按钮时,就会调用 `start_iChatServer()` 方法。此方法检索用户输入的端口号并在该端口上设置服务器。如果发生任何错误,服务器将设置在默认端口,即端口号1664。为了确保应用程序的安全,对 GUI 进行了一些更改。服务器使用给定端口号的ServerSocket 实例进行设置。然后它创建一个名为“iChat Server v1.0”的线程,并调用该线程的start() 方法。start() 方法反过来调用类中重写的run() 方法。在run() 方法中,该线程等待并接受来自客户端的传入连接。当接受连接时,会初始化一个“InfiniteChatClientHandler”的实例。该文件还包含许多重要函数,例如检查具有给定用户名的用户是否已存在、添加用户、删除用户、向单个用户发送消息 (单播)、向所有用户发送消息 (广播) 等。已连接用户的详细信息使用一个ArrayList存储,该列表包含“InfiniteChatClientObject”类型的对象。 

因此,我们可以说“InfiniteChatServer”类是最高层级的。 

InfiniteChatClientHandler.java

此类为连接到服务器的每个客户端创建一个线程。该类的实例随每个接受的传入连接进行初始化。现在,来自此客户端的所有流量都由此实例处理。

此类构造函数的声明如下:

public InfiniteChatClientHandler(InfiniteChatServer server,Socket client);

在这里,“InfiniteChatServer server”提供了调用构造函数的服务器实例的引用,而“Socket client”提供了由类实例处理的客户端的引用。该类使用BufferedReader 从客户端套接字读取。此外,构造函数会创建它自身的线程并调用start() 方法。start() 方法调用由类重写的run() 方法。在run() 方法中,直到线程停止,都会监控和处理来自客户端的所有流量。

InfiniteChatClientObject.java

这是一个简单的类,用于封装客户端详细信息。它包装了客户端Socket的引用,以及一个用于存储用户名的String。提供的两个构造函数包括一个空操作构造函数和另一个构造函数,声明如下:

public InfiniteChatClientObject(Socket clientSocket,String clientName);

在这里,Socket clientSocket 提供了客户端Socket的引用,而String clientName 提供了客户端的用户名。提供了用于存储和检索这些客户端详细信息的方法。 

客户端

客户端是应用程序服务器端的对应部分。我不会对代码进行简要解释,因为代码本身就很清楚,包含注释,并且非常直接。客户端包含以下文件: 

  • InfiniteChatClient.java
  • InfiniteChatClientLogin.java
  • InfiniteChatClientHandle.java
  • InfiniteChatClientUI.java
  • InfiniteChatClientListRenderer.java 
  • InfiniteChatRoomUI.java
  • ImagePanel.java
  • DialogBox.java

InfiniteChatClient.java

iChat 客户端还使用 swing 轻量级组件来创建易于使用的 GUI。在 iChat 客户端中,文件 'InfiniteChatClient.java' 可以说是最高层级的。
此文件处理来自服务器的所有流量。它存储用户名、服务器名、端口号等,并跟踪进行的对话。此文件提供了向服务器发送消息、开始新对话、退出应用程序等方法... 此文件的 `main()` 方法实例化一个“InfiniteChatClientLogin”类型的对象。

InfiniteChatClientLogin.java

当应用程序启动时,此文件会显示一个登录表单。它使用JTextFields来接受用户名、服务器名和端口号。用户名可以是除了空格以外的任何内容。除此以外的唯一限制是用户名不应已被使用。Servername 是运行应用程序服务器部分的那台计算机的名称或 IP 地址,端口号是客户端应连接的服务器端口 (这与你在应用程序服务器端输入的数字相同...)。两个JButtons提供了登录或退出的选项。

当用户登录时,会创建一个“InfiniteChatClientHandle”的实例,并将其传递给调用它的“InfiniteChatClient”实例。

InfiniteChatClientHandle.java

此类仅存储有关用户的信息并定义用于存储和检索这些信息的方法。因此,它充当当前用户的句柄。

InfiniteChatClientUI.java

当用户登录时,他可以看到在线用户列表以及注销和退出的按钮。所有这些 GUI 均由此文件创建。如果用户想与另一位用户开始聊天,他只需双击该用户的姓名。这将打开一个聊天室。

InfiniteChatClientListRenderer.java

此类用于渲染在线用户列表。每个用户名前面的图标就是使用此文件显示的。

InfiniteChatRoomUI.java

此文件用于显示聊天室的 UI。聊天室有一个名为“save”的按钮,可用于保存你与另一位用户的对话。聊天室将保持不变,直到你手动关闭它,即使注销或退出应用程序后也是如此。这样做是为了确保你可以随时保存对话。 

ImagePanel.java

此类用于在聊天室中显示 iChat 应用程序的徽标。

DialogBox.java

它用于显示警告和错误消息,例如缺少字段的警告,或用户名不可用的错误等。

结论

因此,总结一下,你现在知道下载的代码是如何工作的了。你有一个 (?@#!!! 实际上是另一个) 可用的服务器-客户端模型。你可以随意使用它,并继续关注我即将推出的项目。

那么...

敬请关注... 保重...

© . All rights reserved.