自学风雨路(代码学习,附上运行截图)《简易在线聊天系统》

ChatServer:

import java.net.*;
import java.util.*;
import java.io.*;

public class ChatServer {

	DataInputStream is = null;
	ServerSocket ss = null;
	List<Client> Clients = new ArrayList<Client>();
	DataOutputStream os = null;

	public static void main(String[] args) {
		new ChatServer().start();

	}
//开启Server,准备接受连接
	public void start() {

		boolean started = false;

		try {
			ss = new ServerSocket(8888);
			started = true;
			int i = 0;
			while (started) {
				Socket s = ss.accept();
				Client c = new Client(s);
				Clients.add(c);
				new Thread(c).start();
				System.out.println("第" + ++i + "个Client connected!");

			}
		} catch (BindException e) {
			System.out.println("Server is busy!");
			System.out.println("请关掉程序重新启动服务器!");
			System.exit(0);
		} catch (IOException e) {
			e.printStackTrace();
		}

	}

	class Client implements Runnable {
		private boolean connect = false;
		private Socket s;

		Client(Socket s) {
			this.s = s;
			connect = true;
			try {
				is = new DataInputStream(s.getInputStream());
				os = new DataOutputStream(s.getOutputStream());
			} catch (IOException e) {
				e.printStackTrace();
			}
		}
//发送接受到的消息到Client
		public void send(String str) {
			try {
				os.writeUTF(str);
			} catch (IOException e) {
				e.printStackTrace();
			}
		}

		public void run() {
			int i = 0;
			try {
				while (connect) {
					String str = is.readUTF();
					System.out.println(str);
					for (int j = 0; j < Clients.size(); j++) {
						Client c = Clients.get(j);//把消息发到每一个连接到服务器的Client
						c.send(str);
						// System.out.println("Nomale!");
					}
				}
			} catch (Exception e) {
				// e.printStackTrace();
				System.out.println("有" + ++i + "个Client is closed!");
			} finally {
				try {
					if (ss != null)
						ss.close();
					if (is != null)
						is.close();
					if (os != null)
						os.close();
				} catch (EOFException e) {
					System.out.println("第" + ++i + "个Client is closed!");
				} catch (IOException e1) {
					// TODO Auto-generated catch block
					e1.printStackTrace();
				}

			}

		}

	}
}

ChatClient

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

import java.net.*;

public class ChatClient {
	public static void main(String[] args) {
		new MyChatFrame("MyChatTest");
	}
}
//这里是new一个窗口出来,设置其参数
class MyChatFrame extends Frame {
	TextField Text1 = new TextField("我是输入框");
	TextArea Area1 = new TextArea("");
	Button But1 = new Button("发送");
	Socket soc = null;
	DataOutputStream os = null;
	DataInputStream is = null;
	boolean bconnect = false;
	Thread tRecv = new Thread(new Receve());

	MyChatFrame(String s) {
		int width, height;
		width = Toolkit.getDefaultToolkit().getScreenSize().width;
		height = Toolkit.getDefaultToolkit().getScreenSize().height;
		setSize(500, 500);
		this.setLocation((width - 500) / 2, (height - 500) / 2);
		setBackground(Color.white);
		setResizable(false);
		add(Text1, BorderLayout.SOUTH);
		add(Area1, BorderLayout.NORTH);
		add(But1, BorderLayout.EAST);
		Text1.addActionListener(new TextFieldListener());
		// But1.addActionListener(new ButtonListener());
		pack();
		setVisible(true);
		//设置监听,当点击红色×时能够退出
		this.addWindowListener(new WindowAdapter() {
			public void windowClosing(WindowEvent e) {
				disconnect();
				System.exit(0);
			}

		});
		connect();
		tRecv.start();
	}
//监听TextField,如果有动作就写东西到Server
	private class TextFieldListener implements ActionListener {
		public void actionPerformed(ActionEvent e) {
			String s = Text1.getText();
			// Area1.setText(s);
			Text1.setText("");
			try {
				os.writeUTF(s);
				os.flush();
				// os.close();

			} catch (IOException e1) {
				e1.printStackTrace();
			}
		}

	}
//以下是Button监听器
	/*
	 * private class ButtonListener implements ActionListener { public void
	 * actionPerformed(ActionEvent e) { String s = Text1.getText();
	 * Area1.setText(s); Text1.setText(""); try {
	 * 
	 * DataOutputStream os = new DataOutputStream( soc.getOutputStream());
	 * os.writeUTF(s); os.flush(); os.close();
	 * 
	 * } catch (IOException e1) { e1.printStackTrace(); } }
	 * 
	 * }
	 */
//连接Server
	public void connect() {
		try {
			soc = new Socket("127.0.0.1", 8888);
			os = new DataOutputStream(soc.getOutputStream());
			is = new DataInputStream(soc.getInputStream());
			System.out.println("Client OK");
			bconnect = true;
		} catch (IOException e) {
			e.printStackTrace();
		}
	}
//起线程,接受服务器发来的消息,应该是这里有问题
	private class Receve implements Runnable {

		public void run() {
			try {
				while (bconnect) {
					String str = is.readUTF();
					// System.out.println(str);
					Area1.setText(Area1.getText() + str + '\n');
				}

			} catch (SocketException e) {
				System.out.println("退出了,bye!");
			} catch (IOException e) {
				e.printStackTrace();
			}

		}

	}
//断开链接
	public void disconnect() {
		try {
			os.close();
			soc.close();
			is.close();
		} catch (IOException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}

	}

}







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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值