描述一下它的功能是怎样实现的?它的各个类之间的关系?每个类分别实现的是什么功能?import java.net.*;
import java.io.*;
import java.util.*;
public class ChatServer { static int Port=6000; //端口号
static Vector Clients=new Vector(10); //存储连接客户信息
static ServerSocket SvSocket=null; //建立服务器socket
static Socket socket=null; //套接字连接 public ChatServer() {
try {
System.err.println("Server start...");
SvSocket=new ServerSocket(Port); //初始化服务器套接字
while(true){
socket=SvSocket.accept(); //等待连接
System.err.println(socket.getInetAddress()+"连接\n"); //得到客户机地址
Client client=new Client(socket); //实例化一个客户线程
Clients.addElement(client); //增加客户线程到向量中
client.start(); //启动线程
NfChatRoom(); //监视聊天室连接变化
}
}
catch(Exception ex) {
ex.printStackTrace(); //输出出错信息
}
} public static void NfChatRoom() {
StringBuffer newUser=new StringBuffer("newUser");
for(int i=0;i<Clients.size();i++){
Client c=(Client)Clients.elementAt(i);
newUser.append(":"+c.name); //客户端姓名字符串
}
SdClientMsg(newUser); //发送信息到客户端
} public static void SdClientMsg(StringBuffer message){
for(int i=0;i<Clients.size();i++){
Client client=(Client)Clients.elementAt(i); //分别得到每个客户端的连接
client.send(message); //发送信息
}
} public static void SdSlClient(StringBuffer msge,String Name){
for(int i=0;i<Clients.size();i++){
Client client=(Client)Clients.elementAt(i);
if(client.name.equals(Name)){
client.send(msge);
} }
} public void closeAll() { //关闭所有连接
while(Clients.size()>0) { //遍历整个Vector
Client client=(Client)Clients.firstElement(); //得到一个客户端
try{
client.socket.close(); //关闭端口
}
catch(IOException ex){
ex.printStackTrace(); //输出错误信息
}
Clients.removeElement(client); //移出客户端信息
}
} public static void disconnect(Client c){ //断开客户端
try{
System.err.println(c.ip+"断开连接q\n");
c.send(new StringBuffer("Quit")); //向客户发送断开连接信息
c.socket=null; //关闭端口
}
catch(Exception ex){
ex.printStackTrace();
}
Clients.removeElement(c); //移出客户端信息
} public static void main(String[] args) {
new ChatServer(); //实例化一个ChatServer类
} class Client extends Thread {
Socket socket; //连接端口
String name; //用户姓名
String ip; //客户端IP地址
BufferedReader reader ; //输入流
PrintStream ps; //输出流 public Client(Socket s){
socket=s;
try{
reader = new BufferedReader(new InputStreamReader(s.getInputStream())); //得到输入流
ps=new PrintStream(s.getOutputStream()); //得到输出流
String info=reader.readLine(); //读取接受到的信息
StringTokenizer stinfo=new StringTokenizer(info,":"); //分解字符串
String head=stinfo.nextToken(); //获取关键字
if(stinfo.hasMoreTokens())
name=stinfo.nextToken(); //获取用户名
if(stinfo.hasMoreTokens())
ip=stinfo.nextToken(); //获取IP地址
}
catch(IOException ex){
ex.printStackTrace();
}
} public void send(StringBuffer msg) {
ps.println(msg); //输出信息
ps.flush();
} public void run(){
while(true){
String line=null;
try{
line=reader.readLine(); //读取数据流
}
catch(IOException ex){
ex.printStackTrace(); //输出错误信息
ChatServer.disconnect(this); //断开连接
ChatServer.NfChatRoom(); //更新信息
return;
} if(line==null){ //客户离开
ChatServer.disconnect(this);
ChatServer.NfChatRoom();
return;
} StringTokenizer st=new StringTokenizer(line,":"); //分解字符串
String keyword=st.nextToken(); if(keyword.equals("Connect")){ //发送来的是聊天信息
StringBuffer msg=new StringBuffer("Connect:");
msg.append(name); //在信息上增加用户名
msg.append(st.nextToken("\0"));
ChatServer.SdClientMsg(msg); //发送聊天语句到各个客户端
}
else if(keyword.equals("ConnectSl")){
String SlName = st.nextToken();
String SlMsg = st.nextToken("\0");
StringBuffer msg=new StringBuffer("Connect:");
msg.append(name+" say alone to you");
msg.append(SlMsg);
ChatServer.SdSlClient(msg,SlName);
StringBuffer msg1=new StringBuffer("Connect:");
msg1.append("you say alone to "+SlName);
msg1.append(SlMsg);
ChatServer.SdSlClient(msg1,name);
}
else if(keyword.equals("Quit")){ //退出命令
ChatServer.disconnect(this); //断开连接
ChatServer.NfChatRoom(); //刷新信息
}
}
}
}
}
import java.io.*;
import java.util.*;
public class ChatServer { static int Port=6000; //端口号
static Vector Clients=new Vector(10); //存储连接客户信息
static ServerSocket SvSocket=null; //建立服务器socket
static Socket socket=null; //套接字连接 public ChatServer() {
try {
System.err.println("Server start...");
SvSocket=new ServerSocket(Port); //初始化服务器套接字
while(true){
socket=SvSocket.accept(); //等待连接
System.err.println(socket.getInetAddress()+"连接\n"); //得到客户机地址
Client client=new Client(socket); //实例化一个客户线程
Clients.addElement(client); //增加客户线程到向量中
client.start(); //启动线程
NfChatRoom(); //监视聊天室连接变化
}
}
catch(Exception ex) {
ex.printStackTrace(); //输出出错信息
}
} public static void NfChatRoom() {
StringBuffer newUser=new StringBuffer("newUser");
for(int i=0;i<Clients.size();i++){
Client c=(Client)Clients.elementAt(i);
newUser.append(":"+c.name); //客户端姓名字符串
}
SdClientMsg(newUser); //发送信息到客户端
} public static void SdClientMsg(StringBuffer message){
for(int i=0;i<Clients.size();i++){
Client client=(Client)Clients.elementAt(i); //分别得到每个客户端的连接
client.send(message); //发送信息
}
} public static void SdSlClient(StringBuffer msge,String Name){
for(int i=0;i<Clients.size();i++){
Client client=(Client)Clients.elementAt(i);
if(client.name.equals(Name)){
client.send(msge);
} }
} public void closeAll() { //关闭所有连接
while(Clients.size()>0) { //遍历整个Vector
Client client=(Client)Clients.firstElement(); //得到一个客户端
try{
client.socket.close(); //关闭端口
}
catch(IOException ex){
ex.printStackTrace(); //输出错误信息
}
Clients.removeElement(client); //移出客户端信息
}
} public static void disconnect(Client c){ //断开客户端
try{
System.err.println(c.ip+"断开连接q\n");
c.send(new StringBuffer("Quit")); //向客户发送断开连接信息
c.socket=null; //关闭端口
}
catch(Exception ex){
ex.printStackTrace();
}
Clients.removeElement(c); //移出客户端信息
} public static void main(String[] args) {
new ChatServer(); //实例化一个ChatServer类
} class Client extends Thread {
Socket socket; //连接端口
String name; //用户姓名
String ip; //客户端IP地址
BufferedReader reader ; //输入流
PrintStream ps; //输出流 public Client(Socket s){
socket=s;
try{
reader = new BufferedReader(new InputStreamReader(s.getInputStream())); //得到输入流
ps=new PrintStream(s.getOutputStream()); //得到输出流
String info=reader.readLine(); //读取接受到的信息
StringTokenizer stinfo=new StringTokenizer(info,":"); //分解字符串
String head=stinfo.nextToken(); //获取关键字
if(stinfo.hasMoreTokens())
name=stinfo.nextToken(); //获取用户名
if(stinfo.hasMoreTokens())
ip=stinfo.nextToken(); //获取IP地址
}
catch(IOException ex){
ex.printStackTrace();
}
} public void send(StringBuffer msg) {
ps.println(msg); //输出信息
ps.flush();
} public void run(){
while(true){
String line=null;
try{
line=reader.readLine(); //读取数据流
}
catch(IOException ex){
ex.printStackTrace(); //输出错误信息
ChatServer.disconnect(this); //断开连接
ChatServer.NfChatRoom(); //更新信息
return;
} if(line==null){ //客户离开
ChatServer.disconnect(this);
ChatServer.NfChatRoom();
return;
} StringTokenizer st=new StringTokenizer(line,":"); //分解字符串
String keyword=st.nextToken(); if(keyword.equals("Connect")){ //发送来的是聊天信息
StringBuffer msg=new StringBuffer("Connect:");
msg.append(name); //在信息上增加用户名
msg.append(st.nextToken("\0"));
ChatServer.SdClientMsg(msg); //发送聊天语句到各个客户端
}
else if(keyword.equals("ConnectSl")){
String SlName = st.nextToken();
String SlMsg = st.nextToken("\0");
StringBuffer msg=new StringBuffer("Connect:");
msg.append(name+" say alone to you");
msg.append(SlMsg);
ChatServer.SdSlClient(msg,SlName);
StringBuffer msg1=new StringBuffer("Connect:");
msg1.append("you say alone to "+SlName);
msg1.append(SlMsg);
ChatServer.SdSlClient(msg1,name);
}
else if(keyword.equals("Quit")){ //退出命令
ChatServer.disconnect(this); //断开连接
ChatServer.NfChatRoom(); //刷新信息
}
}
}
}
}
import java.awt.*;
import java.awt.event.*;
import java.applet.*;
import java.net.*;
import java.io.*;
import java.util.*;public class ChatClient extends Applet {
TextField UsName = new TextField(10); //姓名输入文本域
TextField ChatFl = new TextField(30); //聊天输入
TextField ObChat = new TextField(5); //聊天对象
Button ConBtn = new Button("连接"); //连接按钮
Button DconBtn = new Button("断开");
Button SendBtn = new Button("发送");
TextArea ChatArea = new TextArea(10,40); //显示聊天信息文本框
java.awt.List UserList = new java.awt.List(11); //显示在线用户信息
Socket socket=null; //连接端口
PrintStream ps=null; //输出流
Listen listen=null; //监听线程
public void init() { //Applet初始化
ChatArea.setEditable(false); //设置信息显示框为不可编辑
Panel panel1 = new Panel(); //实例化面板
Panel panel2 = new Panel();
Panel panel3 = new Panel();
ObChat.setText("对 所有人");
ChatArea.setBackground(Color.white); //设置组件背景颜色
panel1.setBackground(Color.orange);
panel2.setBackground(Color.orange);
panel3.setBackground(Color.orange);
panel1.add(new Label(" 姓名:")); //增加组件到面板上
panel1.add(UsName);
panel1.add(ConBtn);
panel1.add(DconBtn);
panel2.add(ChatArea);
panel2.add(UserList);
panel3.add(ObChat);
panel3.add(new Label("内容:"));
panel3.add(ChatFl);
panel3.add(SendBtn);
setLayout(new BorderLayout()); //设置Applet布局管理器
add(panel1, BorderLayout.NORTH); //增加面板到Applet上
add(panel2, BorderLayout.CENTER);
add(panel3, BorderLayout.SOUTH);
} public boolean action(Event evt,Object obj){ //事件处理
try{
if(evt.target==ConBtn){ //点击连接按钮
if (socket==null){
socket=new Socket(InetAddress.getLocalHost(),6000); //实例化一个套接字
ps=new PrintStream(socket.getOutputStream()); //获取输出流
StringBuffer info=new StringBuffer("Login:");
String userinfo=UsName.getText()+":"+InetAddress.getLocalHost().toString();
ps.println(info.append(userinfo)); //输出信息
ps.flush();
listen=new Listen(this,UsName.getText(),socket); //实例化监听线程
listen.start(); //启动线程
}
}
else if(evt.target==DconBtn){ //点击断开连接按钮
disconnect(); //调用断开连接方法
}
else if(evt.target==SendBtn){ //点击发送按钮
if(socket!=null){
String str = ObChat.getText().trim();
if(str.equals("对 所有人")){
StringBuffer msg=new StringBuffer("Connect:");
String msgtxt=new String(ChatFl.getText());
ps.println(msg.append(ChatFl.getText())); //发送信息
}
else{
int i,num;
num=UserList.getItemCount();
for(i=0;i<num;i++)
if(str.equals(UserList.getItem(i))){
StringBuffer msg=new StringBuffer("ConnectSl:");
String msgtxt=new String(ChatFl.getText());
msg.append(ObChat.getText()+":");
ps.println(msg.append(ChatFl.getText())); //发送信息
}
}
ps.flush();
}
}
}
catch (Exception ex){
ex.printStackTrace(); //输出错误信息
}
return true;
} public void disconnect() { //断开连接方法
if(socket!=null){
ps.println("退出"); //发送信息
ps.flush();
}
} class Listen extends Thread{ //监听服务器传送的信息
String name=null; //用户名
BufferedReader reader ; //输入流
PrintStream ps=null; //输出流
Socket socket=null; //本地套接字
ChatClient client=null; //客户端ChatClient实例 public Listen(ChatClient p,String n,Socket s) {
client=p;
name=n;
socket=s; try{
reader = new BufferedReader(new InputStreamReader(s.getInputStream())); //获取输入流
ps=new PrintStream(s.getOutputStream()); //获取输出流 }
catch(IOException ex){
client.disconnect(); //出错则断开连接
ex.printStackTrace(); //输出错误信息
}
}
public void run(){
String msg=null;
while(socket!=null){
try{
msg=reader.readLine(); //读取服务器端传来信息
}
catch(IOException ex){
client.disconnect(); //出错则断开连接
ex.printStackTrace(); //输出错误信息
}
if (msg==null) { //从服务器传来的信息为空则断开此次连接
client.listen=null;
client.socket=null;
client.UserList.removeAll();
return;
}
StringTokenizer st=new StringTokenizer(msg,":"); //分解字符串
String keyword=st.nextToken(); if(keyword.equals("newUser")) { //新用户连接信息
client.UserList.removeAll(); //移除原有用户名
while(st.hasMoreTokens()) { //取得目前所有聊天室用户名
String str=st.nextToken();
client.UserList.add(str); //增加到用户列表中
}
}
else if(keyword.equals("Connect")) { //聊天信息
String usr=st.nextToken();
client.ChatArea.append(usr); //增加聊天信息到信息显示框
client.ChatArea.append(st.nextToken("\0"));
client.ChatArea.append("\n");
}
else if(keyword.equals("Quit")) { //断天连接信息
System.out.println("Quit");
try{
client.listen=null;
client.socket.close(); //关闭端口
client.socket=null;
}
catch(IOException e){}
client.UserList.removeAll(); //移除用户列表
return;
}
}
}
}
}
像这种代码自己先调试运行起来
然后自己在根据运行后的结果进行对程序修改
这样学的应该比较快
去看看这个通信项目
系统架构设计和实现有如下特点:
A. 采用 Accept-Connect 通讯模型,能统一管理系统中使用的所有 Socket 资源;
B. 系统支持通信和协议分离的实现原则,支持自定义协议解析模块;通信负责数据收发,协议负责数据鉴别,两者配合实现通信和协议的和谐工作;
C. 灵活支持业务处理功能重定义,分级支持慢业务和快业务的不同业务处理线程;
D. 丰富灵活的配置参数,能满足高扩展性;
E. 配合业务处理和通信模型,能异步的管理所有的交互步骤;
F. 分布式服务设计和部署,实现动态(热拔插)的增加和较少业务服务器,减少乃至拒绝单点服务;
为了更好的支持JNSP(java network services platform)项目的发展,现将项目发布到 code.google.com,项目命名为 java-nsp(jnsp已经给人用了,没有办法),项目主页是:http://code.google.com/p/java-nsp/ 1. 项目采用GPL v3 (http://www.gnu.org/licenses/gpl.html)开源协议,可以参考那个地址,不过我也没有完整的看过,估计也不怎么能看懂,嘿嘿; 2. 原来发布的所有版本都作废,以后统一用这个版本为准,维护也用这个空间; 3. 现在大肆招募开发人员(无偿劳动,开源奉献),有兴趣可留言联系;