`
古尔丹之颅
  • 浏览: 30991 次
  • 性别: Icon_minigender_1
社区版块
存档分类
最新评论

java小项目之简单聊天室

阅读更多

       今天很郁闷,好久没有这种感觉了!在蓝杰弄了近一天的聊天室,下午还是决定去打篮球,放松一下!打了一场酣畅淋漓的全场比赛,最终打平了,结果不是最希望看到的,但是期间的努力却是集体7个人共同努力的结果,跟在蓝杰一样,需要通力合作,无奈我还算低调,有什么问题,轻易不会问别人,这大概是在小时候留下的病根!令人欣慰的是,打完球回来之后,并没有首先洗澡,而是又把我的聊天室代码琢磨了一遍,伴随着汗臭味,一切阻碍就这么豁然开朗了,这也算是做学问吧!也许有的时候,我们需要的只是一个好心情,一个好的心态!!!!

       现在我的小小聊天室,具体分析如下:

 

      首先我们需要先写一个服务器的界面类,在这个类里面,主要有创建服务器和发送服务器消息两个按钮,而服务器的功能有能将所有客户端的消息发给每一个在线用户,也可以在服务器的界面显示每一个客户端的发送的消息。该界面类创建代码如下

package 多人聊天室;

import java.awt.FlowLayout;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;

import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JTextArea;
import javax.swing.JTextField;

public class MainServer {
		
	
		public void ShowUI(){
			JFrame jf=new JFrame();
			jf.setTitle("多人聊天室");
			jf.setSize(600,500);
			jf.setLayout(new FlowLayout());
			jf.setDefaultCloseOperation(3);
			JButton jb=new JButton("创建");
			final JTextField jte=new JTextField(4);
			JButton jb1=new JButton("发送");
			final JTextField jte1=new JTextField(30);
			final JTextArea jta=new JTextArea(20,50);
			jf.add(jb);
			jf.add(jte);
			jf.add(jb1);
			jf.add(jte1);
			jf.add(jta);
			
			ActionListener al=(new ActionListener(){
				public void actionPerformed(ActionEvent e){
					String s=e.getActionCommand();
					if(s.equals("创建")){
						String ss=jte.getText();						
						int i=Integer.parseInt(ss);
						Chatserver cs=new Chatserver(i,jta);						
						cs.start();
					}
					//将服务器消息发给每个人
					if(s.equals("发送")){
						String msg=jte1.getText();
						ChatTools.castMsg(msg);
						jta.append("服务器说:"+msg+"\r\n");
						jte1.setText("");
					}
			}
			});
			jb.addActionListener(al);
			jb1.addActionListener(al);			
			jf.setVisible(true);
		}
		public static void main(String[] args){
			MainServer ms=new MainServer();
			ms.ShowUI();
		}
		}

 

 

 

        这简单的服务器界面只有两个按钮,按钮之一便是创建按钮!创建按钮,顾名思义便是创建一个服务器,等待客户端来连接,在该监听器中我使用的是内部类,在创建按钮后的 TextFiel 中输入端口号后,当该按钮被点击时,指定端口号的服务器启动了,此时服务器在等待客户机的连接,当有客户机连接了服务器之后,我们必须启动一个线程去处理该客户机对象,否则就如同一部普通手机一般,如果此时你正在通话中,那么别人是不可能在打通你的电话的,所以我们要创建一个线程类来处理连接上服务器的客户机线程对象。代码如下:

 

 

package 多人聊天室;

import java.net.ServerSocket;
import java.net.Socket;

import javax.swing.JTextArea;

public class Chatserver extends Thread{
		private boolean running=true;
		private int port;
		private JTextArea jta;
		
		public Chatserver(int port,JTextArea jta){
			this.port=port;
			this.jta=jta;
		}
	
		public void run(){
				setUpServer(port);
		}
			//在指定端口上创建一个服务器
	public void setUpServer(int port){
		try{
			//建立绑定在指定端口上的服务器对象
			ServerSocket ss=new ServerSocket(port);
			System.out.println("服务器创建成功");
			//等待客户机连接,并设置成循环等待状态
		while(running){				
				Socket client=ss.accept();
				System.out.println("欢迎进入我的服务器");
				//启动一个线程去处理该对象
				ServerThread st=new ServerThread(client,jta);
				st.start();
				ChatTools.add(st);
			}
		}catch(Exception ef){
			ef.printStackTrace();
		}
	}
}

	

 

 

 

而每一个客户端在服务器中都会拥有一个相应的处理客户端链接的方法,所以我有创建了一个线程类,在该类中得到了服务器的Socket的输入输出流。构造了一个该类的方法,用于传值;又定义了客户机一旦进入服务器的处理方法,在该方法中我们可以读取客户机发来的消息,并将该消息,群发给每一个在线的用户,还可以群发服务器自己的消息,然后并将该方法放在线程的run方法中即可。具体代码如下:

 

package 多人聊天室;


import java.io.BufferedReader;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.io.OutputStream;
import java.net.Socket;

import javax.swing.JTextArea;

public class ServerThread extends Thread{
			private Socket client;//线程中处理的客户对象
			private OutputStream out;//输出流
			private JTextArea jta;
			//创建线程对象时要传入他要处理的连接对象
	public ServerThread(Socket client,JTextArea jta){
			this.client=client;		
			this.jta=jta;
			}
	
//			//将发送消息的代码包装到一个方法中
//	public void sendMs(String msg){
//		System.out.println("send--->"+msg);
//			try{
//				msg+="\r\n";
//				out.write(msg.getBytes());
//				//强制输出
//				out.flush();		
//			}catch(Exception ef){}
//}	
	
	public void run(){
		//在线程中 调用处理链接的方法
		processChat(this.client);
	}
	
	
	//处理客户机进入的连接对象
	public void processChat(Socket client){
		try{		
			InputStream ins=client.getInputStream();
			out=client.getOutputStream();
			//将输入流装为可以读一行字符串,也就是以\r\n结尾的字符串
			out.write( ("欢迎进入服务器\r\n").getBytes() );			
			BufferedReader brd=new BufferedReader(new InputStreamReader(ins));
			String input=brd.readLine();//一行一行读取客户机发来的消息		
			while(!"bye".equals(input)){
				System.out.println("服务器收到的是"+input);
				jta.append("客户说:"+input+"\r\n");				
				//读到一条消息就把他发给其他客户机
				ChatTools.castMsg(input);
				input=brd.readLine();//读取下一条
			}
			}catch(Exception ef){
			ef.printStackTrace();
			}
	}
}

 

 

而为了能实现消息群发的功能,并且获取当前在线的人数,我还建了一个类,在类中引用java提供的队列,当每进入一个客户机时,我们便将该客户机存入队列中,并且输出当前的在线人数,并在之后定义了一个消息群发的功能!代码如下

package 多人聊天室;

import java.util.ArrayList;
import java.util.List;


public class ChatTools {
		//保存处理线程的队列对象
	private static List<ServerThread> list=new ArrayList();
	
	private ChatTools(){
		
	}//不需要创建引类对象,构造器则私有
	//取得保存保存处理线程对象的队列
	public static List<ServerThread> getAllthread(){
		return list;
	}
		//将一个客户对应的处理线程对象加入到队列中 
	public static void add(ServerThread st){
		//通知有人上线了
		castMsg("我在线上!!目前在线人数"+(list.size()+1));
		list.add(st);
}	
		//将一个消息发送给所有人
	public static void castMsg(String str){		
		for(int i=0;i<list.size();i++){			
			ServerThread st=list.get(i);
			st.sendMs(i+"说:"+str);
		}
	}
}

 

 

 

这样一来,创建服务器并简单实现界面化的工作便完成,接下来我们还要给客户端也实现相应功能和界面化。

无可厚非,我们需要先写一个界面类。该界面能实现对服务器的连接以及将自己写的消息发送给服务器,再由服务器转发给所有在线的用户。代码如下:

 

 


package 多人聊天室客户端;

import java.awt.FlowLayout;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.io.BufferedReader;
import java.io.IOException;
import java.io.OutputStream;
import java.net.Socket;

import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JTextArea;
import javax.swing.JTextField;

import 多人聊天室.MainServer;

public class Mainchat {
	private MainchatThread mt;
	
	public void ShowUI(){
		
		JFrame jf=new JFrame();
		jf.setTitle("客户端");
		jf.setSize(500,500);
		jf.setLocation(400, 300);
		jf.setLayout(new FlowLayout());
		jf.setDefaultCloseOperation(3);
		JButton jb=new JButton("连接服务器");
						
		JButton jb1=new JButton("发送");
		final JTextField jte1=new JTextField(30);
		final JTextArea jta=new JTextArea(20,40);
		jf.add(jb);
		jf.add(jb1);
		jf.add(jte1);
		jf.add(jta);
		ActionListener al=(new ActionListener(){
			public void actionPerformed(ActionEvent e){
				String s=e.getActionCommand();
				if(s.equals("连接服务器")){
					try {		
					 mt=new MainchatThread("localhost",9090,jta);	
					 if(mt.runing()){
						 mt.start();						 
					 }
					} catch (Exception e1) {					
						e1.printStackTrace();
					}						
				}
				//将消息发给别人
				if(s.equals("发送")){
					String msg=jte1.getText();
					jta.append("我说:"+msg+"\r\n");					
					mt.sendMsg(msg);
					jte1.setText("");
				}
		}
		});
		jb.addActionListener(al);
		jb1.addActionListener(al);			
		jf.setVisible(true);
	}

	public static void main(String[] args){
		Mainchat ms=new Mainchat();								
		ms.ShowUI();
	}
	
}

 

 

另外,同样我们也需要定义一个线程,来读取从服务器获得消息,当我们的客户端连接成功后,而在该类中我还定义了读取的方法,并将其输出在界面上,具体代码如下:

 

package 多人聊天室客户端;

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.io.OutputStream;
import java.net.ServerSocket;
import java.net.Socket;
import java.net.UnknownHostException;

import javax.swing.JTextArea;


public class MainchatThread extends Thread{
	private OutputStream out;
	private BufferedReader brd;	
	private Socket socket;
	private int port;
	private String ip;
	private JTextArea jta;


	public MainchatThread(String ip,int port,JTextArea jta){
		this.jta=jta;
		this.ip=ip;
		this.port=port;
		
	}

	public boolean runing(){
		try{
		Socket socket=new Socket(this.ip,this.port);		
		System.out.println("连接成功");
		InputStream ins =socket.getInputStream();//得到输入输出流对象
		out=socket.getOutputStream();
		brd=new BufferedReader(new InputStreamReader(ins));//读取一行字符串		
		return true;
		}catch (Exception e){
			e.printStackTrace();
		}return false;
		}
	
	
	//读取服务端信息的方法
	public void readMsg(){
		try{
			String input=brd.readLine();
			while(!"bye".equals(input)){			
			System.out.println("服务器"+input);
			jta.append(input +"\r\n");	
			System.out.println("你好");
			input=brd.readLine();
			}
		}catch(Exception ef){}
}	
	//输出信息
	public void sendMsg(String msg){
		try{
			msg+="\r\n";
			this.out.write(msg.getBytes());
			this.out.flush();
		}catch(Exception ef){}
}
	
	public void run(){
		readMsg();
}
}

 

 

 

至此,简单聊天室告了一个小段落,其实还是拥有很多值得改进的地方,比如,如何将所有用户显示在服务器上,并且能实现单独对话和删除用户的功能,当然还有客户端的登陆功能,这些事情在大的框架形成之后,想必不是难事。

 

 

今天的事,从一个方面反应了,其实并不是差在哪里,只是差在心态,当然时间也是一个很重要的不分,所谓勤能补拙,更何况我们都自认不是拙人,当然别人更不是拙人,心态和勤奋确实是两个很重要的因素,记之!!!!!!

 

5
1
分享到:
评论
9 楼 ming2281 2014-10-15  
大神,那个处理Socket的异常,要怎么处理,有什么经验吗?

我在实现聊天室的时候,各种异常处理起来真是心力交瘁...但是还是未能解决
8 楼 li184132481 2013-08-02  
fisher123 写道
LZ 可以参考 MINA 框架,吸收一下思想

netty也很不错,都是同一个作者写的。
7 楼 古尔丹之颅 2013-07-30  
前辈谬赞了!!!!    这一个月的集训才发现,要学的还很多啊,路漫漫其修远!
6 楼 alvin198761 2013-07-30  
很有前途的年轻人,只是这个包的名字 。。。
5 楼 古尔丹之颅 2013-07-29  
是,通信才学几天,java也才学2个多月,过段时间弄好了再写一篇,我自己也觉得没法看 ,额额!
4 楼 wangjunfu 2013-07-29  
你这代码写的比较雷人  输入输出流都没关闭 其他的没怎么看
3 楼 古尔丹之颅 2013-07-29  
整个暑假都没有回家,在学校附近集训,一下子学了很多东西,有点乱,所以写的东西也有点乱,见谅!!!!
2 楼 freezingsky 2013-07-29  
我只能说,这代码和我大学时随手写的太像了。。。
1 楼 fisher123 2013-07-29  
LZ 可以参考 MINA 框架,吸收一下思想

相关推荐

    Java课程设计(简易聊天室)

    本项目“Java课程设计(简易聊天室)”就是一个很好的实践案例,它涵盖了网络编程、多线程以及用户交互等核心Java技术。 1. **网络编程基础**: Java提供了Socket编程接口,使得开发者可以创建客户端和服务器端的...

    Java写的简易聊天室

    总结起来,"Java写的简易聊天室"项目涵盖了以下关键知识点: 1. Java的Socket网络编程,包括 `ServerSocket` 和 `Socket` 类。 2. 客户端与服务器之间的连接建立和断开过程。 3. 使用线程处理客户端的并发连接。 4....

    聊天室基础项目资料_socket聊天室_聊天室_java项目_socket_

    【标题】"聊天室基础项目资料_socket聊天室_聊天室_java项目_socket_" 涉及的是基于Java的Socket编程技术,用于实现一个TCP/IP通信的即时聊天室。在这个项目中,开发者将学习如何利用Java的Socket类来创建客户端和...

    JAVA课程设计之简单聊天室

    ### JAVA课程设计之简单聊天室的关键知识点 #### 一、项目背景及意义 在当前互联网技术飞速发展的背景下,聊天室作为一种重要的网络社交工具,在人们的日常生活中扮演着越来越重要的角色。该课程设计项目的目的是...

    java聊天室(绝对经典)

    "java聊天室(绝对经典)"这个项目包含了三种不同风格的聊天室实现,每种都有其独特的编程思想和效果。通过学习这些示例,你可以增强自己的Java编程技能,并理解如何构建实时通信系统。 首先,我们要了解Java聊天室...

    java实现简易聊天室

    Java 实现简易聊天室 本文将对 Java 实现简易聊天室的设计和实现进行详细的分析和讲解。该聊天室程序主要由五个 Java 源文件组成,即 Server.java、Objecting.java、LogIn.java、ClientUser.java 和 Client.java。...

    java基于TCP的简单聊天室

    Java基于TCP的简单聊天室是一种使用Java编程语言构建的基础网络通信应用,主要利用TCP(传输控制协议)来实现客户端和服务器之间的实时交互。TCP是一种面向连接的、可靠的、基于字节流的传输层通信协议,它确保了...

    Java画面精美的简易聊天室

    【Java画面精美的简易聊天室】是一个利用Java技术开发的,设计精良的实时通信应用。这个项目旨在为用户提供一个简单、直观且视觉效果良好的聊天环境。通过CSDN博客作者lly1122334分享的文章,我们可以了解到这个聊天...

    Java聊天室项目——橙汁聊天室.zip

    《Java聊天室项目——橙汁聊天室》是一个基于Java实现的简单聊天室应用,它集成了群聊和私聊功能,允许用户进行实时交流,并且支持文件的上传和下载。这个项目不仅为用户提供了一个互动的沟通平台,还通过UDP协议...

    java课程设计 聊天室源代码

    Java课程设计中的聊天室源代码是一项常见的编程实践项目,它能帮助学习者深入理解网络编程、多线程以及用户界面设计等核心概念。这个聊天室程序加载后即可运行,为用户提供了一个互动交流的平台。 首先,我们要理解...

    Java课程设计聊天室

    【Java课程设计聊天室】是Java编程学习中的一个重要实践项目,旨在帮助学生深入理解C/S(客户端/服务器)模式,并熟练运用Java技术实现一个聊天室系统。该系统分为服务器端和客户端两个部分,通过TCP/IP协议进行通信...

    JAVA语言写的一个简单的聊天室

    总的来说,这个简单的Java聊天室项目是一个很好的学习Socket编程和并发处理的实际案例。通过实现这个项目,开发者可以深入理解网络通信的基本原理,以及如何在Java中创建多用户交互的应用程序。

    简单聊天室java代码

    【标题】"简单聊天室java代码"所涉及的知识点主要集中在Java编程语言和网络编程领域,尤其是构建基于Java的实时通信应用。这个项目可能是一个基本的多用户交互平台,允许用户通过网络发送和接收文本消息。 【描述】...

    Java简易聊天室.zip

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

    java 简易聊天室源码

    - **控制台界面**:这个简易聊天室可能使用Java的`System.out.println()`和`Scanner`类来实现简单的命令行界面,用户通过输入命令进行操作。 - **事件驱动**:用户输入的消息需要被捕获并触发相应的处理函数,这...

    JAVA综合实验2聊天室

    在本实验中,我们将深入探讨Java编程语言在创建一个简单的聊天室应用中的应用。这个"JAVA综合实验2聊天室"项目旨在让学生理解网络编程的基本原理,特别是如何利用Java实现客户端和服务器之间的通信,以及如何设计多...

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

    该项目是使用Java编程语言开发的一款P2P(peer-to-peer)多用户在线聊天室系统,旨在实现用户间的实时通信。P2P网络架构在这种场景下意味着每个用户都可以既是客户端也是服务器,通过直接与其他用户建立连接进行信息...

    Java 聊天室小程序

    【Java聊天室小程序】是一个基于Java Swing开发的简易桌面应用程序,它允许用户进行实时的文本聊天,具备私聊和群聊的功能。Swing是Java的标准GUI库,提供了丰富的组件和功能,适合构建这样的交互式应用。这个聊天室...

    java功能聊天室代码一个简单的聊天室

    总结,一个简单的Java聊天室项目涉及到网络编程、多线程、GUI设计等多个Java核心技术,通过`Chatroom.class`和`Chatroom.java`文件的协同工作,实现用户间的实时通信。随着技术的不断迭代,这样的聊天室可以逐步升级...

    JAVA简单WEB聊天室项目

    【JAVA简单WEB聊天室项目】是一个基础的网络应用程序,它主要使用了JAVA技术栈来实现。这个项目旨在帮助初学者理解和实践WEB项目的开发流程,同时为有经验的开发者提供一个快速搭建简单聊天室的模板。它涉及到的关键...

Global site tag (gtag.js) - Google Analytics