`

多用户的P2P在线聊天程序,完全源码 连载三 编写监听用户信息类

阅读更多

本例开发实现了一个多用户的P2P在线聊天程序,C/S结构,客户端可发送消息,然后其他的用户接收到该消息并将其显示在界面中,服务器对信息进行有关处理并向适当的用户发送,同时在服务器端还将显示所有的在线用户,网络管理员即服务器端管理员可选中某用户并将其踢出该聊天室。

本篇为第二篇,如果您是第一次进来请从第一篇开始,此程序不用修改完全可用,第一篇地址:http://java161.iteye.com/blog/616113

 


3 编写监听用户信息类(UserThread.java)

  在监听用户信息类中,首先需要实例化一个Socket输入流来读取从客户端发送过来的信息,然后根据该信息进行相应的处理:

   protected DataInputStream inStream;

   inStream=new DataInputStream(connSock.getInputStream());

   其中connSock为Socket连接的实例。

  

同时该类还应该得到该用户所在的IP地址及该用户的登陆用户名等信息,从而使网络管理员可以很方便地对聊天室中的该用户进行管理。得到客户端IP的程序如下所示:

   String userIP="";

   InetAddress inet=connSock.getInetAddress();

   userIP=inet.getHostAddress();

 

  然后该类可以从输入流中读取有关数据:

  String str=inStream.readUTF();

  得到客户的输入数据后则可以对该数据进行分析,在本次开发中利用“:%:”作为分隔符,对得到的字符串进行分析:

   StringTokenizer st=new StringTokenizer(str,":%:");

   String key=st.nextToken();

   if(key.equals("login"))

   {

      userName=st.nextToken();

      server.list1.addItem(userIP+"---"+userName);

   }

   else if(key.equals("quit"))

        {

           server.list1.remove(userIP+"---"+userName);

           server.removeServerConn(userIP,userName);

           stop();

        }

       else

          server.tellEveryone(str);

   对上面的程序进行分析,用户监听线程得到从客户端传送过来的数据,然后利用StringTokenizer类进行分析得到数据的主关键字key为“login”表示该客户为新登陆用户,则继续得到该信息中所包含的用户登录名,同时将该用户的IP地址和其用户名同时显示到主窗口中,其中Server为主窗口对象的实例句柄,list1为主窗口中的一个列表框,它用来记录当前所有的客户用户名和IP地址。

   若 key 为“quit”表示客户端用户退出的通知,则需要在主界面中将该用户删除,同时将该用户的实例从矢量表中删除,调用主窗口类中的removeServerConn()方法实现。该方法实现如下所示:

   void removeServerConn(String ip,String userName)

    {

        for(int i=0;i<=users.size();i++)

        {

            ServerConn conn=(ServerConn)users.elementAt(i);

           String ip1=conn.reader.userIP;

           String userName1=conn.reader.userName;

           if(ip.equals(ip1)&&userName.equals(userName1))

           users.removeElement(conn);

        }

    }

   users为在主窗体对象中定义的一个矢量表,用来存放一共有多少个客户实例,它存储的是ServerConn对象。

   若key是客户端所发送过来的信息,需要将其发送给该聊天室中的其他所有成员,则需要调用主函数中的tellEveryone()函数:

  void tellEveryone(String str)

    {

        for(int i=0;i<=users.size();i++)

        {

            ServerConn conn=(ServerConn)users.elementAt(i);

            conn.sendString(str);

        }

}

tellEveryone()函数将逐项得到当前聊天室中所有的客户实例,然后分别向它们发送指定的信息。

在这用到了一个很重要的类:StringTokenizer 类。

StringTokenizer 类可以将指定的字符串分解成为标识,它依靠一系列的分隔符来识别标识。它的构造函数有以下三种:

l         public StringTokenizer(Sring str);

l         public StringTokenizer(Sring str,String delim);

l         public StringTokenizer(Sring str,String delim,boolean returnTokens);

其中参数:

l         Sring str—————————需要分解的字符串;

l         String delim———————指定的分隔符字符串;

l         boolean returnTokens——指定返回时是否包含指定的分隔符, returnTokens为true,返回字符串时将包含该分隔符,

returnTokens为false,返回字符串时将忽略该分隔符。

下面列出StringTokenizer 类包含的所有方法:

?         countTokens()—————————返回还有多少可用的标识

?         hasMoreElements()———————测试在使用nextToken()前是否还有标识

?         hasMoreTokens()————————同hasMoreElements()

?         nextElement()—————————返回字符串中下一个标识

?         nextToken()——————————同nextElement()

?         nextToken(String newDelim)—返回字符串的下一个标识,但重新指定分隔符

 

程序清单

 

package Server;

import java.awt.*;
import java.util.*;
import java.net.*;
import java.io.*;
import java.lang.*;

/**
 * <p>Title: </p>
 *
 * <p>Description: </p>
 *
 * <p>Copyright: Copyright (c) 2010</p>
 *
 * <p>Company: </p>
 *
 * @author www.jianfei5u.com
 * @version 1.0
 */
public class UserThread extends Thread {
 protected Socket connectionSocket;
 protected DataInputStream inStream;
 SimpleServer server;
 String userIP = "";
 String userName = "";

 public UserThread(SimpleServer server, Socket connSock) throws IOException {
  InetAddress inet = connSock.getInetAddress();
  userIP = inet.getHostAddress();
  connectionSocket = connSock;
  this.server = server;
  inStream = new DataInputStream(connSock.getInputStream());
 }

 protected void closeConnection() {
  try {
   connectionSocket.close();
  } catch (Exception oops) {
  }
  stop();
 }

 public void run() {
  while (true) {
   try {
    String str = inStream.readUTF();
    StringTokenizer st = new StringTokenizer(str, ":%:");
    String key = st.nextToken();
    if (key.equals("login")) {
     userName = st.nextToken();
     server.list1.addItem(userIP + "---" + userName);
    } else if (key.equals("quit")) {
     server.list1.remove(userIP + "---" + userName);
     server.removeServerConn(userIP, userName);
     stop();
    } else
     server.tellEveryone(str);
   } catch (Exception oops) {
   }//end of try
  }//end of while
 }//end of public
}//end of class

 

未完待续。。。下篇

http://java161.iteye.com/blog/616657

Client端  编写客户端Applet

分享到:

相关推荐

    基于Java的P2P多用户在线聊天室项目源码

    综上所述,基于Java的P2P多用户在线聊天室项目源码涵盖了许多高级Java技术,包括P2P网络编程、数据库操作、GUI设计、实时通信、安全性和文件共享。对于想深入学习Java网络编程和分布式系统的人来说,这是一个非常有...

    基于java的开发源码-P2P-多用户在线聊天室(Java源码).zip

    基于java的开发源码-P2P--多用户在线聊天室(Java源码).zip 基于java的开发源码-P2P--多用户在线聊天室(Java源码).zip 基于java的开发源码-P2P--多用户在线聊天室(Java源码).zip 基于java的开发源码-P2P--多...

    P2P--多用户在线聊天室(Java源码)

    标题"“P2P--多用户在线聊天室(Java源码)”"揭示了我们讨论的主题是一个基于P2P技术构建的、支持多用户同时在线交流的聊天室系统,其核心实现是用Java编程语言编写的。这里的"P2P"指的是对等网络,它是一种分布式...

    P2P点对点聊天 源码

    《P2P点对点聊天源码解析与技术探讨》 在信息技术日新月异的今天,P2P(Peer-to-Peer)技术以其独特的分布式特性,在网络通信领域展现出强大的生命力。P2P点对点聊天系统是P2P技术在即时通讯应用中的典型实例,它...

    c#编写的P2P聊天程序

    总结来说,C#编写P2P聊天程序涉及了网络编程、多线程、数据序列化、安全加密、用户界面设计等多个方面的知识。通过深入学习和实践,开发者不仅可以掌握P2P通信的基本原理,还能提升在C#编程环境下的综合开发能力。...

    C#编写P2P视频聊天程序

    在本文中,我们将深入探讨如何使用C#编程语言来创建一个P2P(点对点)视频聊天程序。P2P技术允许用户直接通过互联网互相通信,而无需经过中心服务器,这大大降低了带宽需求和延迟,提高了通信效率。下面我们将详细...

    基于P2P UDP的局域网聊天工具源码

    【标题】"基于P2P UDP的局域网聊天工具源码" 描述了一款使用P2P(点对点)技术并通过UDP(用户数据报协议)进行通信的局域网聊天工具。这款源码提供了深入理解P2P网络和UDP通信在实际应用中的机会,适合开发者学习和...

    P2P-多用户在线聊天室(Java源码).zip

    标题和描述中提到的"P2P-多用户在线聊天室(Java源码)"是一个基于P2P(Peer-to-Peer)技术实现的多人在线聊天系统,其核心是使用Java编程语言编写的源代码。P2P网络是一种分布式网络架构,其中每个参与者既是客户端...

    P2P--多用户在线聊天室(Java源码).rar

    P2P--多用户在线聊天室(Java源码).rar

    基于Java的源码-P2P-多用户在线聊天室(Java源码).zip

    这个基于Java的源码项目是一个P2P(Peer-to-Peer)多用户在线聊天室,它允许多个用户通过网络进行实时通信。在Java编程领域,这样的应用通常涉及到网络编程、多线程、对象序列化以及可能的GUI设计等多个重要知识点。...

    P2P-多用户在线聊天室(Java源码).rar

    标题中的"P2P-多用户在线聊天室(Java源码)"表明这是一个基于P2P技术的、允许多个用户实时交流的在线聊天室系统,其核心编程语言是Java。P2P,即对等网络,是一种分布式网络架构,其中每个参与者既是服务的消费者也...

    P2P聊天源码 IM

    P2P(Peer-to-Peer)聊天源码是一种实现用户间直接通信的技术,它与传统的客户端-服务器(C/S)架构不同,P2P网络中的每个节点既是服务提供者也是服务消费者。在IM(Instant Messaging)即时通讯系统中,P2P技术被...

    C#p2p源码,聊天程序百分百可用的源码

    C# P2P(peer-to-peer)源码是用于构建聊天程序的一种编程资源,它允许开发者创建无需中心服务器,可以直接在参与者之间交换信息的应用。P2P架构在互联网上广泛应用,因为它可以有效地分发流量,降低单一服务器的...

    JAVA源码P2P-多用户在线聊天室(Java源码)

    JAVA源码P2P-多用户在线聊天室(Java源码)

    P2P聊天程序(JAVA)

    【P2P聊天程序(JAVA)】是一种网络通信应用程序,它使用对等网络(P2P,Peer-to-Peer)架构来实现用户之间的实时交流。P2P技术允许网络中的每个节点既是客户端也是服务器,因此在聊天程序中,每个用户都可以发送和...

    P2P--多用户在线聊天室(Java源码).7z

    标题中的"P2P--多用户在线聊天室(Java源码)"揭示了这是一个基于P2P(Peer-to-Peer)技术实现的多人在线聊天应用程序,使用Java编程语言编写。P2P技术是一种分布式网络架构,其中每个参与者既是服务的提供者也是...

    WINFORM P2P语言聊天系统源码

    这是一款基于WinForm技术的p2p语言聊天系统,使用udp传送语音和文本等信息。在这个系统中没有服务端和客户端,相互通讯都是直接相互联系的。能够很好的实现效果。 二、菜单功能 该源码是一种人与人进行交流的工具...

    基于Java的实例开发源码-P2P-多用户在线聊天室(Java源码).zip

    该资源是一个基于Java编程语言开发的P2P(Peer-to-Peer)多用户在线聊天室的实例源码。P2P技术在通信领域中广泛应用,它允许网络中的每个节点既是客户端也是服务器,使得数据传输更加分散和高效。在这个项目中,...

    VC p2p聊天室源码

    【VC点对点聊天室源码】是一种基于Visual C++(简称VC)开发的P2P(Peer-to-Peer)网络通信系统,主要用于实现用户之间的实时聊天功能。在这个项目中,我们将深入探讨P2P技术在聊天应用中的实现,以及VC编程的相关...

    精选_基于Qt实现的P2P聊天程序_源码打包

    "精选_基于Qt实现的P2P聊天程序_源码打包" 这个标题揭示了我们讨论的核心内容,即一个使用Qt框架开发的点对点(P2P)聊天应用程序。"精选"表明这是一份高质量或具有代表性的代码库,而"源码打包"意味着我们可以获得...

Global site tag (gtag.js) - Google Analytics