`
郑云飞
  • 浏览: 818553 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

自由聊天程序

阅读更多
package src;
import java.io.*;
import java.net.*;
import java.util.*;
public class ChatServer
{
	public static void main(String args[])
	{
		Hashtable<String, DataOutputStream> userList = new Hashtable<String, DataOutputStream>();
		String name;
		DataInputStream dis;
		DataOutputStream dos;
		BufferedReader br=new BufferedReader(new InputStreamReader(System.in));
		try
		{
			ServerSocket ss = new ServerSocket(8888);
			new MyServerWriter(br,userList,"系统管理员").start();//开启写的线程
			while (true)
			{
				Socket s = ss.accept();//和客户端建立连接
				dis = new DataInputStream(s.getInputStream());//封装输入流对象
				dos = new DataOutputStream(s.getOutputStream());//封装输出流对象
				name = dis.readUTF();//通过使用dis读取服务器放入"线路"里的信息。堵塞状态,除非读取到信息
				System.out.println(s.getInetAddress()+":"+name+"连接成功!");
				userList.put(name,dos);//容器接受键值对
				new MyServerReader(name, dis, userList).start();//启动写读的线程
			}
		} 
		catch (Exception e)
		{
			System.out.println("服务器正在运行,请先退出再试");
		}
	}
}
class MyServerReader extends Thread
{
	private String	name;
	private DataInputStream	 dis;
	private Hashtable<String, DataOutputStream> userList;
	public MyServerReader(String name, DataInputStream dis,Hashtable<String, DataOutputStream> userList)
	{
		this.name = name;
		this.dis = dis;
		this.userList = userList;
	}
	public void run()
	{
		String message;
		try
		{
			 sendMessage("************欢迎    "+ name + " 进入郑云飞聊天室!****************");
			 //用户成功进入聊天室后,提示用户输入消息
			 ((DataOutputStream) userList.get(name)).writeUTF("请输入消息:");//通过dos向当前线路写入信息
			while (true)
			{
				message = dis.readUTF();//通过使用dis读取服务器写入线路里的信息,堵塞状态,除非读到信息
				if(message.equals("88"))//当前用户离开
				{
					userList.remove(name);//将当前用户从容器中移除
					//打印消息
					sendMessage( "**************"+name + "******离开了郑云飞聊天室**************");
					break;
				} 
				else if(message.length()>0)//消息不为空,就群发消息
				{
					sendMessage( name+"说:"+message);
				}
			}
		} 
		catch (Exception e)
		{
			System.out.println(name+"中断了服务器");
		}
	}

	public void sendMessage(String message)
	{   
		//迭代器遍历hashtable中的values属性值,即我们存放的DataOutputStream流(用户输入的消息内容)
		Iterator<DataOutputStream> it=userList.values().iterator();
		while(it.hasNext())
		{
			try
			{
    		   it.next().writeUTF(message);
			}
			catch (IOException e)
			{
				//捕获因用户中断而写入的错误
			}
		}
	}
}
class MyServerWriter extends Thread
{
	private Hashtable<String, DataOutputStream> userList;
	private BufferedReader br;
	private String name;
	public MyServerWriter(BufferedReader br,Hashtable<String, DataOutputStream> userList, String name)
	{
		super();
		this.br = br;
		this.userList = userList;
		this.name = name;
	}
	public void run()
	{
		 String message;
		 System.out.println("发送群消息:");
		try
		{  
    		while(true)
    		{
    			 message=br.readLine();//从键盘输入要发送的群消息
    			 //服务器的控制台显示服务器名:消息内容
	    		System.out.println(name+":"+message);//输出群消息
	    		sendMessage("-----------"+name+":"+message);//群发消息到所有的用户控制台
    			if(message.equals("88"))
    			{
    				System.out.println("系统管理员断开了服务器");
    				System.exit(0);
    				break;
    			}
    		}
		}
		catch(Exception e)
		{
			System.out.println("服务器中断连接,请稍后再试");
		}
	}
	public void sendMessage(String message)//发送群消息
	{   
		Iterator<DataOutputStream> it=userList.values().iterator();
		while(it.hasNext())
		{
			try
			{
    		      it.next().writeUTF(message);
			}
			catch (IOException e)
			{
				//捕获因用户中断而写入的错误
			}
		}
	}
}

 

package src;

import java.net.*;
import java.io.*;
import java.awt.*;
import java.awt.event.*;
import java.applet.*;

public class FileClient extends Applet implements Runnable, ActionListener
{
	Button 计算;
	TextField 输入三边长度文本框, 计算结果文本框;
	Socket socket = null;
	DataInputStream in = null;
	DataOutputStream out = null;
	Thread thread;

	public void init()
	{
		setLayout(new GridLayout(2, 2));
		Panel p1 = new Panel(), p2 = new Panel();
		计算 = new Button(" 计算");
		输入三边长度文本框 = new TextField(12);
		计算结果文本框 = new TextField(12);
		p1.add(new Label("输入三角形三边的长度,用逗号或空格分隔:"));
		p1.add(输入三边长度文本框);
		p2.add(new Label("计算结果:"));
		p2.add(计算结果文本框);
		p2.add(计算);
		计算.addActionListener(this);
		add(p1);
		add(p2);
	}

	public void start()
	{
		try
		{ // 和小程序所驻留的服务器建立套接字连接:
			socket = new Socket(this.getCodeBase().getHost(), 4331);
			in = new DataInputStream(socket.getInputStream());
			out = new DataOutputStream(socket.getOutputStream());
		}
		catch (IOException e)
		{
		}
		if (thread == null)
		{
			thread = new Thread(this);
			thread.start();
		}
	}

	public void run()
	{
		String s = null;
		while (true)
		{
			try
			{
				s = in.readUTF();// 堵塞状态,除非读取到信息。

				计算结果文本框.setText(s);
			}
			catch (IOException e)
			{
				计算结果文本框.setText("与服务器已断开");
				break;
			}
		}
	}

	public void actionPerformed(ActionEvent e)
	{
		if (e.getSource() == 计算)
		{
			String s = 输入三边长度文本框.getText();
			if (s != null)
			{
				try
				{
					out.writeUTF(s);
				}
				catch (IOException e1)
				{
				}
			}
		}
	}
}

 

package src;
import java.io.*;
import java.net.*;
import java.util.*;
import java.sql.*;
public class FileServer
{
	public static void main(String args[])
	{
		ServerSocket server = null;
		Socket you = null;
		while (true)
		{
			try
			{
				server = new ServerSocket(4331);
			}
			catch (IOException e1)
			{
				System.out.println("正在监听"); // ServerSocket对象不能重复创建。
			}
			try
			{
				you = server.accept();
				System.out.println("客户的地址:" + you.getInetAddress());
			}
			catch (IOException e)
			{
				System.out.println("正在等待客户");
			}
			if (you != null)
			{
				new Server_thread(you).start(); // 为每个客户启动一个专门的线程。
			}
			else
			{
				continue;
			}
		}
	}
}

class Server_thread extends Thread
{
	Socket socket;
	Connection Con = null;
	Statement Stmt = null;
	DataOutputStream out = null;
	DataInputStream in = null;
	int n = 0;
	String s = null;

	Server_thread(Socket t)
	{
		socket = t;
		try
		{
			in = new DataInputStream(socket.getInputStream());
			out = new DataOutputStream(socket.getOutputStream());
		}
		catch (IOException e)
		{
		}
	}

	public void run()
	{
		while (true)
		{
			double a[] = new double[3];
			int i = 0;
			try
			{
				s = in.readUTF();// 堵塞状态,除非读取到信息。

				StringTokenizer fenxi = new StringTokenizer(s, " ,");
				while (fenxi.hasMoreTokens())
				{
					String temp = fenxi.nextToken();
					try
					{
						a[i] = Double.valueOf(temp).doubleValue();
						i++;
					}
					catch (NumberFormatException e)
					{
						out.writeUTF("请输入数字字符");
					}
				}
				double p = (a[0] + a[1] + a[2]) / 2.0;
				out.writeUTF(" "+ Math.sqrt(p * (p - a[0]) * (p - a[1]) * (p - a[2])));
				sleep(2);
			}
			catch (InterruptedException e)
			{
			}
			catch (IOException e)
			{
				System.out.println("客户离开");
				break;
			}
		}
	}
}

 

/**
 * @author 郑云飞
 * 
 */
package src;
import java.io.*;
import java.net.Socket;
public class TestClient
{
	public static void main(String[] args)
	{
		try
		{
			Socket s=new Socket("localhost",8888);
			System.out.println("已经和服务器建立连接");
			DataInputStream dis=new DataInputStream(s.getInputStream());
			DataOutputStream dos=new DataOutputStream(s.getOutputStream());
			BufferedReader br=new BufferedReader(new InputStreamReader(System.in));
			/**
			 * 用户昵称不能为空
			 */
			boolean flag=true;//控制是否输入的标志
			String name="";//用户昵称
			while(flag)
			{
    			flag=false;
    			System.out.println("请输入你的昵称:");
    			name = br.readLine();
    			if(name.equals(""))
    			{
    				System.out.println("昵称不能为空");
    				flag=true;
    			}
			}
			/**
			 * 启动两个读写线程
			 */
			new MyClientReader(name,dis).start();
			new MyClientWriter(name,dos).start();
		}
		catch(Exception e)
		{
			System.out.println("服务器未响应,请稍后再试");//如果服务器为启动,会报此异常
		}
	}
	
}
class MyClientReader extends Thread
{
	private DataInputStream dis;
	private String name;
	public MyClientReader(String name,DataInputStream dis)
	{
		super();
		this.dis = dis;
		this.name= name;
	}
	public void run()
	{
		String message;
		try
		{
			while(true)
			{
				message=dis.readUTF();//读取用户发送的小心
				if(message.indexOf(name)==0)//如果是本人发送的消息
				{
					//本人的控制台上显示的信息
    				System.out.println(message.substring(message.indexOf(":")+1)+"******发送成功*********");
    				System.out.println("请输入消息:");
				}
				else//让自己发送的消息发给除自己以外的所有其他人
				{
					System.out.println(message);
				}
			}
		}
		catch(Exception e)
		{
			System.out.println("服务器中断");
		}
	}
}
class MyClientWriter extends Thread
{
	private DataOutputStream dos;
	private String name;

	public MyClientWriter(String name,DataOutputStream dos)
	{
		super();
		this.dos = dos;
		this.name=name;
	}
	public void run()
	{
		BufferedReader br=new BufferedReader(new InputStreamReader(System.in));
		String message;
		try
		{
			dos.writeUTF(name);
    		while(true)
    		{
    			message=br.readLine();//接收从控制台输入的消息
    			if(message.equals(""))//处理空消息的情况
    			{
    				System.out.println("不能发送空消息");
    				System.out.println("请输入消息:");
    			}
    			dos.writeUTF(message);//输入的消息不为空,就将message写入到dos所关联的设备中
    			if(message.equals("88"))//处理自己输入"退出"的情况
    			{
    				System.out.println("自己下线,程序退出");
    				System.exit(0);
    				break;
    			}
    		}
		}
		catch(Exception e)
		{
			System.out.println("自己中断了程序");
		}
	}
	
}

 

分享到:
评论

相关推荐

    JAVA Applet自由聊天程序

    这个“JAVA Applet自由聊天程序”显然是一款基于Java Applet技术的在线聊天工具,用户可以通过浏览器直接进行实时交流。下面将详细介绍相关的知识点。 1. **Java Applet**: Java Applet是一种嵌入在HTML页面中的...

    java写的一个小聊天室程序

    这是一个基于Java语言开发的小型聊天室程序,使用了NetBeans 6.1作为集成开发环境进行可视化设计。这个项目展示了如何在Java中实现一个基本的即时通讯应用,它具有友好的用户界面和全面的注释,方便其他开发者理解和...

    基于NetBeans的J2EE网页聊天系统

    【标题】基于NetBeans的J2EE网页聊天系统 【正文】 在当今互联网技术日新月异的时代,构建一个实时的、交互式的网页聊天系统已经成为众多开发者和企业的需求。本项目"基于NetBeans的J2EE网页聊天系统"提供了一个...

    基于c/s架构的JAVA聊天程序

    在IT领域,C/S(Client/Server)架构是一种常见的分布式应用结构,主要用于构建网络应用程序,如我们这里的"基于C/S架构的JAVA聊天程序"。在这个系统中,客户端(Client)负责用户交互,而服务器端(Server)处理...

    一步一步教你用netbeans做程序

    NetBeans是一个功能强大的Java集成开发环境(IDE),本文将一步一步指导读者使用NetBeans开发一个简单的Java程序。 标题解读 “一步一步教你用NetBeans做程序”的标题表明了本文的目的,即指导读者使用NetBeans开发...

    简单的图形聊天程序喔

    【图形聊天程序】是一种在局域网环境下实现的通信应用,允许用户通过图形化界面进行实时文字、语音或视频交流,而无需连接互联网。这款"简单的图形聊天程序"旨在提供一个简便、快捷的沟通方式,使得在同一网络环境下...

    socketjava源码-socket-chat:这是使用netbeansIDE进行的简单一对一聊天应用程序的Java源代码

    在Java编程语言中,Socket是网络通信的基础,它允许两个应用程序通过网络进行数据交换,实现客户端与服务器端的通信。本项目"socket-java-source-code-chat"是一个基于NetBeans IDE的一对一聊天应用示例,旨在帮助...

    简单的局域网二人聊天程序

    【标题】"简单的局域网二人聊天程序"揭示了这是一个基于C#编程语言设计的,专为局域网内两台计算机之间实现简单聊天功能的应用程序。在IT领域,这样的程序通常利用网络套接字(Sockets)进行通信,允许用户在同一个...

    java聊天小程序

    这样,聊天消息(可能包含文本、时间戳等信息)就可以在客户端和服务端之间自由流动。 考虑到局域网内的通信,程序可能采用多线程处理,每个连接的客户端都会分配一个独立的线程来处理与该客户端的通信,以保证并发...

    网络聊天程序合集 网络聊天程序合集

    网络聊天程序合集。这是我学习网络时在网上找到的资源,对学习网络很有帮助的。由于比较多,所以分成几部分上传,每一个都是相对独立的,可以自由下载。

    C++2010编写的UDP协议聊天程序

    使用UDP协议编写聊天软件,使得客户端之间可以自由地进行键盘聊天。 程序的具体要求: 1)在DOS下运行,能提供聊天内容输入界面和收到的文字聊天内容。 2)允许客户选择不同的其他客户方进行聊天,由于在一台机器上...

    基于c/s架构的JAVA聊天程序 ,服务端和客户端都有

    【标题】中的“基于c/s架构的JAVA聊天程序”指的是使用客户端/服务器(Client-Server,简称C/S)模式设计的Java聊天应用。C/S架构是一种典型的两层或三层架构,其中客户端负责用户交互,而服务器则处理业务逻辑和...

    linux下的聊天程序

    在Linux环境下,开发聊天程序是一项涉及网络编程和操作系统交互的重要任务。这个项目提供了一个基本的框架,包括一个服务器端和一个或多个客户端,基于socket通信协议实现异步通信。下面我们将详细探讨相关知识点。 ...

    聊天小程序

    在公聊功能方面,【聊天小程序】允许用户在公共聊天室中自由发表消息,进行集体讨论。这种模式适用于团队协作、线上活动或者兴趣小组等场合,使得多人可以同时参与对话,提高信息传递的效率。公聊功能通常配备有消息...

    QQ随意聊 (让你想跟谁聊天就跟谁聊天的VBS程序)

    QQ随意聊是一款基于VBScript(Visual Basic Script)编写的程序,它的主要功能是提供一个便捷的方式,让用户能够更自由地选择与任何QQ号码进行聊天,而无需登录到完整的QQ客户端。这个程序可能通过模拟登录过程并...

    付费社群聊天小程序V1.4.5+前端

    付费社群聊天小程序V1.4.5+前端 备注:不用重新上传小程序1,修复购买会员分享分佣BUG社群小程序,通过微信群裂变,社群营销,知识付费以及社群电商可实现粉丝营销闭环,玩转社群运营。一、自建社群平台的意义?1)...

    微信小程序_HiApp聊天工具源代码

    "微信小程序_HiApp聊天工具源代码"是一个基于微信小程序开发的聊天应用程序,其核心功能包括会话列表、聊天界面、好友通讯录以及好友管理,覆盖了即时通讯的基本需求。 1. **会话列表**: 会话列表是聊天应用的...

    自由聊天室

    在本"自由聊天室"程序中,Servlet扮演了核心角色,处理用户请求并生成响应。Servlet运行在服务器端,接收HTTP请求,执行业务逻辑,并返回HTML或其他格式的数据给客户端。 1. **Servlet生命周期** Servlet有三个...

    付费社群聊天小程序V1.4.5+前端.zip

    付费社群聊天小程序V1.4.5+前端 备注:不用重新上传小程序1,修复购买会员分享分佣BUG社群小程序,通过微信群裂变,社群营销,知识付费以及社群电商可实现粉丝营销闭环,玩转社群运营。一、自建社群平台的意义?1)...

Global site tag (gtag.js) - Google Analytics