`
wangfeiaini
  • 浏览: 54979 次
  • 性别: Icon_minigender_1
  • 来自: 南京
社区版块
存档分类
最新评论

java简单的聊天室

阅读更多

今天在看java网络高级编程,里面的一些例子相当的不错,在这分享一个applet聊天室,不足之处请指正。

1. 服务端代码:

import java.io.DataInputStream;
import java.io.DataOutputStream;
import java.io.IOException;
import java.io.ObjectInputStream.GetField;
import java.net.ServerSocket;
import java.net.Socket;
import java.util.Vector;

public class ChatServer {
	/**m_threads是一个Vector变量,维护所有Server放的ServerThread对象
	 * 通过该变量能想所有加入聊天室的用户广播信息,撤销退出的聊天者
	 * 
	 * @param args
	 */
	public static void main(String[] args) {
		ServerSocket serverSocket = null;
		Vector m_threads = new Vector();
		System.out.println("listening^");
		try {
			//设置ServerSocket监听端口号为5555(可以自己设定),该端口号必须与客户端的端口号一致
			serverSocket = new ServerSocket(5555);
		} catch (IOException e) {
			e.printStackTrace();
			return;
		}
		int nid = 0;
		while(true){
			try {
				//监听新的联结者
				Socket s = serverSocket.accept();
				System.out.println("accepted");
				//创建信息聊天线程
				ServerThread st = new ServerThread(s, m_threads);
				//设置用户id
				st.setID(nid++);
				m_threads.addElement(st);
				new Thread(st).start();
				for(int i=0;i<m_threads.size();i++){
					ServerThread ss = (ServerThread) m_threads.elementAt(i);
					ss.write("<#>welcome"+ss.getID()+"to enter chatroom");
				}
				System.out.println("listen again");
			} catch (IOException e) {
				e.printStackTrace();
			}
		}
	}
	

	/**
	 * 监听线程,监听是否有新的信息传来
	 * @author Administrator
	 *
	 */
	static class ServerThread implements Runnable{
		
		Vector m_threads;
		Socket m_socket = null;
		DataInputStream m_in = null;
		DataOutputStream m_out = null;
		int m_id =0;//线程id
		
		//构造方法创建线程
		 public ServerThread(Socket s,Vector threads) {
			 this.m_socket = s;
			 this.m_threads = threads;
			 try {
				 //构造输入输出流对象
				m_in = new DataInputStream(m_socket.getInputStream());
				 m_out = new DataOutputStream(m_socket.getOutputStream());
			} catch (IOException e) {
				e.printStackTrace();
			}
		 }
		
		@Override
		public void run() {
			System.out.println("thread running");
			try {
				while(true){
					//线程封锁在m_in.readUTF(),直到有信息传来
					String s = m_in.readUTF();
					if(s==null) break;
					//如果传来的是leave则通知其他人该用户退出聊天室
					if(s.trim().equals("leave")){
						for (int i = 0; i < m_threads.size(); i++) {
							ServerThread serverThread = (ServerThread) m_threads.elementAt(i);
							serverThread.write("***<"+getID()+">***leave");
						}
					}else{//向所有联结者广播信息
						for (int i = 0; i < m_threads.size(); i++) {
							ServerThread serverThread = (ServerThread) m_threads.elementAt(i);
							serverThread.write("***<"+getID()+">"+s);
						}
					}
				}
			} catch (IOException e) {
				e.printStackTrace();
			}
			try {
				m_threads.remove(this);//移除退出聊天室的用户线程
				m_socket.close();//关闭socket
			} catch (IOException e) {
				e.printStackTrace();
			}
		}
		
		/**
		 * 打印消息
		 * @param msg
		 */
		public void write(String msg){
			try {
				synchronized (m_out) {
					m_out.writeUTF(msg);
				}
			} catch (IOException e) {
				e.printStackTrace();
			}
		}
		
		public int getID(){
			return m_id;
		}
		
		public void setID(int nid){
			this.m_id = nid;
		}
		
	}
	
}

 2.客户端代码:

import java.applet.Applet;
import java.awt.BorderLayout;
import java.awt.Event;
import java.awt.TextArea;
import java.awt.TextField;
import java.io.DataInputStream;
import java.io.DataOutputStream;
import java.io.IOException;
import java.net.InetAddress;
import java.net.Socket;
import java.net.URL;
import java.net.UnknownHostException;

public class ChatApplet1 extends Applet implements Runnable{

	/**
	 * 
	 */
	private static final long serialVersionUID = -1670682436342902989L;

	TextArea m_textarea;//接收消息显示窗口
	TextField m_textfield;//消息发送窗口
	DataInputStream m_in;//输入流
	DataOutputStream m_out;//输出流
	
	/**
	 * 初始化聊天室窗口
	 */
	public void init(){
		setLayout(null);
		setSize(426, 226);
		m_textarea = new TextArea(10,10);
		m_textfield = new TextField();
		m_in = null;
		m_out = null;
		try {
			//获取服务器地址
			URL url = getCodeBase();
			//获取服务器ip地址
			InetAddress address = InetAddress.getByName(url.getHost());
			Socket m_socket;
			//打印服务器ip地址 通信协议
			System.out.println("server address:"+address+" "+url.getHost()+" "+url.getProtocol());
			//创建与服务器的链接,端口与服务端口一致
			m_socket = new Socket(address,5555);
			//创建输入输出流
			m_in = new DataInputStream(m_socket.getInputStream());
			m_out = new DataOutputStream(m_socket.getOutputStream());
		} catch (UnknownHostException e) {
			e.printStackTrace();
		} catch (IOException e) {
			e.printStackTrace();
		}
		setLayout(new BorderLayout());
		add("Center",m_textarea);
		add("South",m_textfield);
		m_textarea.setEditable(false);
		new Thread(this).start();//启动线程监听
	}
	
	/**
	 * 按下enter键时发送消息
	 */
	@Override
	public boolean handleEvent(Event evt) {
		String b = m_textfield.getText();
		if((evt.target==m_textfield)&&evt.id==Event.ACTION_EVENT){
			m_textfield.setText("");
			try {
				m_out.writeUTF(b);//向服务端发送消息,编码格式UTF-8
				return true;
			} catch (IOException e) {
				e.printStackTrace();
			}
		}
		return super.handleEvent(evt);
	}
	
	/**
	 * 监听对应的服务线程,并将聊天信息展示在窗口中
	 */
	@Override
	public void run() {
		while(true){
			try {
				String s = m_in.readUTF();//读取聊天信息
				if(s!=null){
					m_textarea.append(s+"\n");
				}
			} catch (IOException e) {
				e.printStackTrace();
				m_textarea.setText(e.getMessage());
				m_textfield.setVisible(false);
			}
		}
	}

	@Override
	public void stop() {
		super.stop();
		try {
			m_out.writeUTF("leave");
		} catch (IOException e) {
			e.printStackTrace();
		}
	}
	
}

 核心注释已写上,本人文笔不好,总结的话就不扯啦。

分享到:
评论

相关推荐

    java简单聊天室源代码

    Java简单聊天室源代码是一种基于Java编程语言实现的多用户实时通信系统,它允许多个用户在同一平台上进行实时的文本交流。这个项目对于初学者来说是一个很好的实践机会,可以帮助他们理解和应用Java网络编程、多线程...

    java简单聊天室

    【Java简单聊天室】是一个基于Java编程语言实现的交互式应用程序,主要目的是提供一个基本的聊天环境,允许用户之间进行实时通信。这个项目的核心在于利用Java的网络编程能力,通过Socket编程来实现实时的数据传输。...

    JAVA简单聊天室

    这个“JAVA简单聊天室”项目基于Socket套接字技术,它允许两个或多个网络应用程序之间进行双向通信。现在,我们将深入探讨这个项目涉及到的核心知识点。 1. **Java Socket编程**: Java Socket是TCP/IP协议族的一...

    java 简单聊天室(登陆,验证,聊天)

    【Java简单聊天室】是一个基于Java编程语言实现的交互式应用程序,主要功能包括用户登录、账户验证以及多线程通信的聊天功能。这个项目旨在帮助初学者理解Java的基础概念,如面向对象编程、网络编程以及多线程技术。...

    java简单聊天室(含代码)

    【Java简单聊天室】是一个基于Java编程语言实现的简易通讯应用,主要由客户端类和服务器端类构成,旨在提供一个基础的文本聊天环境。在这个项目中,开发者通过编写这两个核心类,实现了用户之间的实时信息交流。 1....

    java 简单聊天室程序 完整代码

    【Java简单聊天室程序】是一种基于Java编程语言实现的简易通信应用,主要目的是为了提供一个基础的交流平台,便于初学者理解和实践网络编程中的多线程、Socket通信以及用户交互等核心概念。在这个完整的代码中,我们...

    java简单聊天室的例子,带传文件功能

    Java简单聊天室是一个基本的网络通信应用,它允许用户通过网络进行实时文本交流,并且具有文件传输的功能。这个例子展示了如何使用Java实现这样的系统,这对于理解网络编程和多线程的概念非常有帮助。 首先,我们要...

    JAVA聊天室

    JAVA简单聊天室

    JAVA简单聊天室程序

    【JAVA简单聊天室程序】 Java聊天室程序是一个基础但经典的项目,它可以帮助初学者理解网络编程、多线程以及客户端-服务器通信等核心概念。在这个程序中,通常会包含一个服务器端(Server)和多个客户端(Client)...

    Java简单聊天室设计 .doc

    【Java简单聊天室设计】是一个课程设计项目,旨在让学生通过实践深入理解Java语言的核心特性和面向对象编程。在这个设计中,学生将运用Java的多线程、图形用户界面(GUI)、网络通信以及文件处理等技术来创建一个...

    java简单聊天室设计

    在本项目中,我们主要探讨的是如何设计一个基于Java的简单聊天室,它采用经典的C/S(客户端/服务器)架构,允许多人同时登录并进行实时通信。以下是该项目涉及的关键技术点和实现步骤: 1. **C/S架构**: C/S架构...

    Java简易聊天室.zip

    【Java简易聊天室】是一个基于Java编程语言实现的简单网络通信应用,主要利用了TCP(Transmission Control Protocol)传输协议和多线程技术。这个项目专为NetBeans 8.2及更高版本设计,旨在提供一个基础的聊天环境,...

    java实现简单的聊天室

    在本文中,我们将深入探讨如何使用Java来实现一个简单的聊天室。这个聊天程序分为客户端(Client)和服务器端(Server),并且利用了Java的核心网络编程技术——Socket和Stream。Socket是网络通信的基础,它提供了两...

    java编程基于UDP的简单聊天室

    总的来说,基于UDP的Java简单聊天室项目涵盖了网络编程基础、图形界面设计和并发处理等多个技术点。它可以帮助开发者巩固Java编程技能,理解UDP的工作原理,以及如何在实际应用中实现网络通信。在实际开发过程中,还...

    简单的JAVA聊天室代码

    ### 知识点详解 #### 一、Java网络编程基础 ...通过以上分析,我们可以看到这个简单的Java聊天室程序涵盖了Java网络编程、图形用户界面设计等多个方面的知识点,对于初学者来说是一个非常好的学习案例。

    java实现的聊天室实例

    本实例是基于Java Socket实现的一个简单聊天室,它包含客户端(Client)和服务器端(Server)两部分,允许用户通过网络进行实时对话。下面将详细介绍这个聊天室实例的核心知识点。 首先,我们要了解Java Socket。...

Global site tag (gtag.js) - Google Analytics