自由聊天程序

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("自己中断了程序");
		}
	}
	
}

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值