本例开发实现了一个多用户的P2P在线聊天程序,C/S结构,客户端可发送消息,然后其他的用户接收到该消息并将其显示在界面中,服务器对信息进行有关处理并向适当的用户发送,同时在服务器端还将显示所有的在线用户,网络管理员即服务器端管理员可选中某用户并将其踢出该聊天室。
本篇为第四篇,如果您是第一次进来请从第一篇开始,此程序不用修改完全可用,第一篇地址:http://java161.iteye.com/blog/616113
4、编写客户端Applet类(Applet1.java)
创建一个Applet类,在给Applet的design视图中加入一个文本框textField、textArea1、label1、button1,并利用paneLayout对空间进行适当的布局。
在Applet中,需要提供用户登录、发送信息和显示信息三个区域,在本次开发中,将登录和发送信息合成一个文本框,即当用户第一次进入或该用户被网络管理员踢出时该文本框为输入登录信息框,当用户登录后该文本框为发送信息框,同时利用一个按钮来控制这个过程,该按钮的响应事件为action():
void action()
{
String str=textField1.getText();
if(str.equals("")) return;
try
{
if(!login)
{
userName=str;
simpleClient=new SimpleClient(this,hostname,4321);
simpleClient.sendString("login:%:"+str);
simpleClient.start();
login=true;
label1.setText("消息:");
button1.setLabel("发言");
textField1.setText("");
}
else
{
simpleClient.sendString(userName+":%:"+str);
}
}
catch(Exception ee)
{
ee.printStackTrace();
}
}
其中SimpleClient是一个用户实例,该实例中包含有和服务器建立连接Socket的输出流对象,并实例化了发送信息方法sendString()。最后得到SimpleClient类如源码包中SimpleClient.java 所示。
用户进行登录时,需要实例化一个用户线程,用来建立和服务器端指定端口的Socket连接,若成功则向该端口发送如下的用户登录信息,即该用户的登陆名称:
Socket serverSock=new Socket(hostName,portNumber);
simpleClient.sendString("login:%:"+str);
其中hostName为服务器名称或IP地址,postName为指定端口,str为用户所输入的登录名称,“:%:”为分隔符,simpleClient为该用户实例化线程,线程中包含有和服务器的Socket连接的输出流:
protected DataOutputStream outStream;
outStream =new DataOutputStream(serverSock.getOutputStream());
登录完成后,将控制按钮文字改变为“发言”,同时将登录标志为true。
程序清单:
Applet1.java
package Client;
import java.awt.*;
import java.awt.event.*;
import java.applet.*;
import java.net.*;
import com.borland.jbcl.layout.*;
import com.borland.jbcl.control.*;
/**
* <p>Title: </p>
*
* <p>Description: </p>
*
* <p>Copyright: Copyright (c) 2010</p>
*
* <p>Company: </p>
*
* @author www.jianfei5u.com
* @version 1.0
*/
public class Applet1 extends Applet {
boolean isStandalone=false;
Button button1=new Button() ;
Label label1=new Label() ;
TextField textField1=new TextField();
GroupBox groupBox1=new GroupBox();
TextArea textArea1=new TextArea();
PaneLayout paneLayout1=new PaneLayout();
PaneLayout paneLayout2=new PaneLayout();
boolean login=false;
SimpleClient simpleClient=null;
static String userName="";
String hostname="202.117.115.228";
//Construct the Applet
public Applet1() {
}
//Initialize the Applet
public void init()
{
try
{
URL url=this.getCodeBase();
String te=url.toString();
String temp=url.getHost();
if(!(temp.equals("")))
hostname=temp; //得到服务器的ip地址
else hostname="202.117.115.228";
jbInit();
}
catch(Exception e)
{
e.printStackTrace();
}
}
//Component initialization
private void jbInit() throws Exception
{
this.setSize(new Dimension(444,263));
button1.setLabel("登陆");
label1.setAlignment(2);
label1.setText("用户名");
textField1.addActionListener(new Applet1_textField1_actionAdapter(this));
groupBox1.setLayout(paneLayout1);
groupBox1.setLabel("信息");
button1.addActionListener(new Applet1_button1_actionAdapter(this));
this.setLayout(paneLayout2);
this.add(groupBox1,new PaneConstraints("groupBox1","groupBox1",
PaneConstraints.ROOT,0.5f));
groupBox1.add(textArea1,new PaneConstraints("textArea1","textArea1",
PaneConstraints.ROOT,1.0f));
this.add(label1,new PaneConstraints("label1","groupBox1",
PaneConstraints.BOTTOM,0.09505701f));
this.add(textField1,new PaneConstraints("textField1","label1",
PaneConstraints.RIGHT,0.83229816f));
this.add(button1,new PaneConstraints("button1","textField1",
PaneConstraints.RIGHT,0.30223882f));
}
//Get Applet information
public String getAppletInfo()
{
return "Applet Information";
}
//Get parameter information
public String[][] getParameterInfo()
{
return null;
}
public void destroy()
{
try
{
simpleClient.sendString("quit");
simpleClient.stop();
}
catch(Exception e)
{}
}
void action()
{
String str=textField1.getText();
if(str.equals("")) return;
try
{
if(!login)
{
userName=str;
simpleClient=new SimpleClient(this,hostname,4321);
simpleClient.sendString("login:%:"+str);
simpleClient.start();
login=true;
label1.setText("消息:");
button1.setLabel("发言");
textField1.setText("");
}
else
{
simpleClient.sendString(userName+":%:"+str);
}
}
catch(Exception ee)
{
ee.printStackTrace();
}
}
void button1_actionPerformed(ActionEvent e)
{
action();
}
void textField1_actionPerformed(ActionEvent e)
{
action();
}
}
class Applet1_button1_actionAdapter implements java.awt.event.ActionListener
{
Applet1 adaptee;
Applet1_button1_actionAdapter(Applet1 adaptee)
{
this.adaptee=adaptee;
}
public void actionPerformed(ActionEvent e)
{
adaptee.button1_actionPerformed(e);
}
}
class Applet1_textField1_actionAdapter implements java.awt.event.ActionListener
{
Applet1 adaptee;
Applet1_textField1_actionAdapter(Applet1 adaptee)
{
this.adaptee=adaptee;
}
public void actionPerformed(ActionEvent e)
{
adaptee.textField1_actionPerformed(e);
}
}
SimpleClient.java
package Client;
import java.awt.*;
import java.awt.event.*;
import java.io.*;
import java.net.*;
import java.sql.*;
import java.util.*;
import com.borland.jbcl.layout.*;
import com.borland.jbcl.control.*;
/**
* <p>Title: </p>
*
* <p>Description: </p>
*
* <p>Copyright: Copyright (c) 2010</p>
*
* <p>Company: </p>
*
* @author www.jianfei5u.com
* @version 1.0
*/
public class SimpleClient extends Object implements Runnable
{
protected Socket serverSock;
protected DataOutputStream outStream;
protected Thread clientThread;
protected UserThread reader;
public SimpleClient(Applet1 applet,String hostName,
int portNumber)throws IOException
{
Socket serverSock=new Socket(hostName,portNumber);
outStream =new DataOutputStream(serverSock.getOutputStream());
reader=new UserThread(applet,serverSock);
reader.start();
}
public void start()
{
run();
}
public void stop()
{
clientThread.stop();
clientThread=null;
}
public synchronized void sendString(String str)throws IOException
{
outStream.writeUTF(str);
}
public void run()
{
try
{
sendString("");
}
catch(Exception oops)
{
oops.printStackTrace();
disconnect();
stop();
}
}
public void disconnect()
{
try
{
reader.closeConnection();
}
catch(Exception badclose)
{}
}
}
未完待续。。。下篇 编写客户端用户监听线程
地址: http://java161.iteye.com/blog/616663
分享到:
相关推荐
Java Applet是一种在客户端浏览器上运行的Java小程序,它扩展了网页的交互性,使得用户可以直接在浏览器中执行一些动态功能,如游戏、计算器或者像聊天应用这样的实时交互程序。本篇将深入探讨如何使用Java和Applet...
总的来说,这个Java Applet程序源码集是一个宝贵的学习资源,它涵盖了Applet的基本操作、参数传递、Swing组件的应用以及生命周期管理等多个关键知识点。通过深入研究这些源码,开发者可以增强对Java Applet技术的...
总的来说,这个基于UDP和TCP/IP技术的聊天程序源码涵盖了网络编程的基础,包括协议的理解、多线程的运用、以及Java Applet的实践。对于初学者,这是一个很好的起点,可以帮助他们理解网络通信的底层机制,并提升编程...
《基于Java的Applet钢琴模拟程序源码解析》 在计算机编程领域,Java语言以其跨平台、面向对象的特性,广泛应用于各种应用开发,其中包括Web应用程序。本篇将深入探讨一个基于Java的特殊应用——Applet钢琴模拟程序...
Java编写的applet计算器小程序,大学时写的
这个“JAVA Applet自由聊天程序”显然是一款基于Java Applet技术的在线聊天工具,用户可以通过浏览器直接进行实时交流。下面将详细介绍相关的知识点。 1. **Java Applet**: Java Applet是一种嵌入在HTML页面中的...
一个Java聊天程序服务端和客户端程序,C/S结构,ChatServer 类实现了一个聊天室服务器端, 此类有一个构造器, 在构造器中使用newServerSocket()建立一个Socket 连接。RunServer()方法中运行聊天服务,通过Socket 类...
java applet小程序编写,有助于初学者学习
基于java的开发源码-Applet钢琴模拟程序源码.zip 基于java的开发源码-Applet钢琴模拟程序源码.zip 基于java的开发源码-Applet钢琴模拟程序源码.zip 基于java的开发源码-Applet钢琴模拟程序源码.zip 基于java的开发...
基于java的开发源码-约瑟夫环演示Applet源码.zip 基于java的开发源码-约瑟夫环演示Applet源码.zip 基于java的开发源码-约瑟夫环演示Applet源码.zip 基于java的开发源码-约瑟夫环演示Applet源码.zip 基于java的开发...
在这个“j2ee用java applet实现聊天程序”的项目中,我们将探讨如何利用Java Applet构建一个简单的多用户聊天系统,该系统基于J2EE(Java 2 Enterprise Edition)平台,并使用Socket通信进行客户端与服务器之间的...
2. **服务器端**:处理客户端发送的消息,存储聊天记录,并将消息转发给其他在线用户。这部分通常使用Socket编程实现,创建服务器监听特定端口,等待客户端连接。 3. **客户端**:即Java Applet本身,负责发送用户...
源代码包含了多个类,其中可能包括表示音符、音调、节奏等音乐元素的类,以及处理用户输入、绘制图形界面和播放音频的类。开发者通过监听键盘事件来模拟钢琴键的按下和抬起,从而生成相应的音符。同时,程序可能还...
Java Applet是Java技术在早期Web开发中的一种应用,它允许开发者创建能在用户浏览器中运行的小型程序,通常用于创建动态、交互式的网页元素。这个"用java编写的applet小动画"很可能是这样一个示例,展示了如何利用...
根据提供的文件信息,我们可以深入探讨一下“Java源码聊天系统(Java+Applet)”这一主题涉及的关键知识点。 ### Java源码聊天系统简介 #### 1. Java编程语言概述 Java 是一种广泛使用的面向对象的编程语言,由 ...
【标题】"JSP源码 聊天系统(java+applet)" 提供的是一个基于Java和Applet技术实现的在线聊天系统的源代码。这个系统是利用Java Server Pages(JSP)技术在服务器端处理数据,与客户端通过Applet进行交互,实现了用户...
在压缩包中的"applet"文件可能包含了多个示例程序,通过查看和运行这些Applet,你可以看到它们如何定义和使用Applet类,如何创建图形界面,以及如何处理用户的输入事件。这些实践将有助于你巩固理论知识,并提升实际...
综上所述,一个基于JSP Applet的聊天室系统融合了服务器端的强大处理能力与客户端的实时交互功能,通过JSP和Applet的协同工作,为用户提供了一个高效、实时的在线沟通环境。在实际开发中,还需要考虑到安全性、性能...
Java编写的山寨QQ,多人聊天+用户在线,程序分服务端和客户端,典型C/S结构, 当用户发送第一次请求的时候,验证用户登录,创建一个该qq号和服务器端保持通讯连接得线程,启动该通讯线程,通讯完毕,关闭Scoket...