本例开发实现了一个多用户的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网络编程、数据库操作、GUI设计、实时通信、安全性和文件共享。对于想深入学习Java网络编程和分布式系统的人来说,这是一个非常有...
基于java的开发源码-P2P--多用户在线聊天室(Java源码).zip 基于java的开发源码-P2P--多用户在线聊天室(Java源码).zip 基于java的开发源码-P2P--多用户在线聊天室(Java源码).zip 基于java的开发源码-P2P--多...
标题"“P2P--多用户在线聊天室(Java源码)”"揭示了我们讨论的主题是一个基于P2P技术构建的、支持多用户同时在线交流的聊天室系统,其核心实现是用Java编程语言编写的。这里的"P2P"指的是对等网络,它是一种分布式...
《P2P点对点聊天源码解析与技术探讨》 在信息技术日新月异的今天,P2P(Peer-to-Peer)技术以其独特的分布式特性,在网络通信领域展现出强大的生命力。P2P点对点聊天系统是P2P技术在即时通讯应用中的典型实例,它...
总结来说,C#编写P2P聊天程序涉及了网络编程、多线程、数据序列化、安全加密、用户界面设计等多个方面的知识。通过深入学习和实践,开发者不仅可以掌握P2P通信的基本原理,还能提升在C#编程环境下的综合开发能力。...
在本文中,我们将深入探讨如何使用C#编程语言来创建一个P2P(点对点)视频聊天程序。P2P技术允许用户直接通过互联网互相通信,而无需经过中心服务器,这大大降低了带宽需求和延迟,提高了通信效率。下面我们将详细...
【标题】"基于P2P UDP的局域网聊天工具源码" 描述了一款使用P2P(点对点)技术并通过UDP(用户数据报协议)进行通信的局域网聊天工具。这款源码提供了深入理解P2P网络和UDP通信在实际应用中的机会,适合开发者学习和...
标题和描述中提到的"P2P-多用户在线聊天室(Java源码)"是一个基于P2P(Peer-to-Peer)技术实现的多人在线聊天系统,其核心是使用Java编程语言编写的源代码。P2P网络是一种分布式网络架构,其中每个参与者既是客户端...
P2P--多用户在线聊天室(Java源码).rar
这个基于Java的源码项目是一个P2P(Peer-to-Peer)多用户在线聊天室,它允许多个用户通过网络进行实时通信。在Java编程领域,这样的应用通常涉及到网络编程、多线程、对象序列化以及可能的GUI设计等多个重要知识点。...
标题中的"P2P-多用户在线聊天室(Java源码)"表明这是一个基于P2P技术的、允许多个用户实时交流的在线聊天室系统,其核心编程语言是Java。P2P,即对等网络,是一种分布式网络架构,其中每个参与者既是服务的消费者也...
P2P(Peer-to-Peer)聊天源码是一种实现用户间直接通信的技术,它与传统的客户端-服务器(C/S)架构不同,P2P网络中的每个节点既是服务提供者也是服务消费者。在IM(Instant Messaging)即时通讯系统中,P2P技术被...
C# P2P(peer-to-peer)源码是用于构建聊天程序的一种编程资源,它允许开发者创建无需中心服务器,可以直接在参与者之间交换信息的应用。P2P架构在互联网上广泛应用,因为它可以有效地分发流量,降低单一服务器的...
JAVA源码P2P-多用户在线聊天室(Java源码)
【P2P聊天程序(JAVA)】是一种网络通信应用程序,它使用对等网络(P2P,Peer-to-Peer)架构来实现用户之间的实时交流。P2P技术允许网络中的每个节点既是客户端也是服务器,因此在聊天程序中,每个用户都可以发送和...
标题中的"P2P--多用户在线聊天室(Java源码)"揭示了这是一个基于P2P(Peer-to-Peer)技术实现的多人在线聊天应用程序,使用Java编程语言编写。P2P技术是一种分布式网络架构,其中每个参与者既是服务的提供者也是...
这是一款基于WinForm技术的p2p语言聊天系统,使用udp传送语音和文本等信息。在这个系统中没有服务端和客户端,相互通讯都是直接相互联系的。能够很好的实现效果。 二、菜单功能 该源码是一种人与人进行交流的工具...
该资源是一个基于Java编程语言开发的P2P(Peer-to-Peer)多用户在线聊天室的实例源码。P2P技术在通信领域中广泛应用,它允许网络中的每个节点既是客户端也是服务器,使得数据传输更加分散和高效。在这个项目中,...
【VC点对点聊天室源码】是一种基于Visual C++(简称VC)开发的P2P(Peer-to-Peer)网络通信系统,主要用于实现用户之间的实时聊天功能。在这个项目中,我们将深入探讨P2P技术在聊天应用中的实现,以及VC编程的相关...
"精选_基于Qt实现的P2P聊天程序_源码打包" 这个标题揭示了我们讨论的核心内容,即一个使用Qt框架开发的点对点(P2P)聊天应用程序。"精选"表明这是一份高质量或具有代表性的代码库,而"源码打包"意味着我们可以获得...