首页>代码>基于java swing的局域网五子棋对战游戏>/chess-master/src/Chat/ChatServer.java
package Chat;

import java.awt.BorderLayout;
import java.awt.EventQueue;
import java.awt.TextArea;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.PrintWriter;
import java.net.ServerSocket;
import java.net.Socket;
import java.text.SimpleDateFormat;
import java.util.ArrayList;
import java.util.Date;
import java.util.LinkedList;

import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JOptionPane;
import javax.swing.JPanel;
import javax.swing.JTextField;

/**
 * 服务器类的构建
 * 
 * @author czx
 *
 */
public class ChatServer {

	private JFrame frame;
	private JTextField textField;
	private JTextField textField_1;
	// 为了防止连接出错,把服务器的地址和端口写死
	private String host = "0.0.0.0";
	private int port = 10010;
	private int count = 0;// 用于判断按钮情况
	// 声明服务器端套接字ServerSocket
	ServerSocket serverSocket;
	// 输入流列表集合
	ArrayList<BufferedReader> bReaders = new ArrayList<BufferedReader>();
	// 输入流列表集合
	ArrayList<PrintWriter> pWriters = new ArrayList<PrintWriter>();
	// 聊天信息链表集合
	LinkedList<String> msgList = new LinkedList<String>();

	/**
	 * Launch the application.
	 */
	@SuppressWarnings("unused")
	public static void main(String[] args) {

		ChatServer server = new ChatServer();
		EventQueue.invokeLater(new Runnable() {
			public void run() {
				try {
					ChatServer window = new ChatServer();
					window.frame.setVisible(true);
				} catch (Exception e) {
					e.printStackTrace();
				}
			}
		});
	}

	// 接收客户端Socket套接字线程
	class AcceptSocketThread extends Thread {
		public void run() {
			while (this.isAlive()) {
				try {
					// 接收一个客户端Socket对象
					Socket socket = serverSocket.accept();
					// 建立该客户端读通信管道
					if (socket != null) {
						JOptionPane.showMessageDialog(null, "已连接");
						// 获取Socket对象读输入流
						BufferedReader bReader = new BufferedReader(new InputStreamReader(socket.getInputStream()));
						// 将输入流添加到输入流列表集合中
						bReaders.add(bReader);
						// 开启一个线程接收客户端读聊天信息
						new GetMsgFromClient(bReader).start();
						// 获取Socket对象读输出流,并添加到输入流列表集合中
						pWriters.add(new PrintWriter(socket.getOutputStream()));
					}
				} catch (IOException e) {
					e.printStackTrace();
				}
			}
		}
	}

	// 接收客户端读聊天信息读线程
	class GetMsgFromClient extends Thread {
		BufferedReader bReader;

		public GetMsgFromClient(BufferedReader bReader) {
			this.bReader = bReader;
		}

		public void run() {
			while (this.isAlive()) {
				String strMsg;
				try {
					strMsg = bReader.readLine();
					if (strMsg != null) {
						// SimpleDateFormat 日期格式化类,制定日期格式
						// "年-月-日 时:分:秒",例如"2017-11-06 23:06:11"
						SimpleDateFormat dateFormat = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
						// 获取当前系统时间,并使用日期格式化类华为制定格式读字符串
						String strTime = dateFormat.format(new Date());
						// 将时间和信息添加到信息链表集合中
						msgList.addFirst("<==" + strTime + "==>\n" + strMsg);
					}
				} catch (IOException e) {
					e.printStackTrace();
				}
			}
		}

	}

	// 给所有客户发送聊天信息读线程
	class SendMsgToClient extends Thread {
		public void run() {
			while (this.isAlive()) {
				try {
					// 如果信息链表集合不空(还有聊天信息未发送)
					if (!msgList.isEmpty()) {
						// 取信息链表集合中读最后一条,并移除
						String msg = msgList.removeLast();
						// 对输出流列表集合进行遍历,循环发送信息给所有客户端
						for (int i = 0; i < pWriters.size(); i++) {
							pWriters.get(i).println(msg);
							pWriters.get(i).flush();
						}
					}
				} catch (Exception e) {
				}
			}
		}
	}

	/**
	 * Create the application.
	 */
	public ChatServer() {
		initialize();
	}
	/**
	 * Initialize the contents of the frame.
	 */
	private void initialize() {
		frame = new JFrame();
		frame.setTitle("聊天服务器");
		frame.setBounds(100, 100, 446, 251);
		frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);

		JPanel panel = new JPanel();
		frame.getContentPane().add(panel, BorderLayout.NORTH);

		JLabel lblNewLabel = new JLabel("host");
		panel.add(lblNewLabel);

		textField = new JTextField();
		textField.setEditable(false);
		textField.setText(host);
		panel.add(textField);
		textField.setColumns(7);

		JLabel lblNewLabel_1 = new JLabel("port");
		panel.add(lblNewLabel_1);

		textField_1 = new JTextField();
		textField_1.setEnabled(false);
		// 由于setText只能接收str类型的所以加了 +""
		textField_1.setText(port + "");
		panel.add(textField_1);
		textField_1.setColumns(5);
		TextArea textArea = new TextArea();
		JButton btnNewButton = new JButton("启动");
		btnNewButton.addActionListener(new ActionListener() {
			public void actionPerformed(ActionEvent e) {
				if (count == 0) {
					btnNewButton.setEnabled(false);
					try {
						// 创建服务器端套接字ServerSocket,在10010端口监听
						serverSocket = new ServerSocket(port);
					} catch (IOException e1) {
						e1.printStackTrace();
					}
					// 创建接受客户端Socket读线程实例,并启动
					new AcceptSocketThread().start();
					// 创建给 客户端发送信息读线程实例,并启动
					new SendMsgToClient().start();
					System.out.println("服务器已经启动...");
					textArea.setText("启动服务器\r\n");
				}
			}
		});
		panel.add(btnNewButton);

		JButton btnNewButton_1 = new JButton("关闭");
		btnNewButton_1.addActionListener(new ActionListener() {
			public void actionPerformed(ActionEvent e) {
				btnNewButton.setEnabled(true);
				textArea.setText("服务器已关闭");
			}
		});
		panel.add(btnNewButton_1);
		frame.getContentPane().add(textArea, BorderLayout.SOUTH);
	}
}
最近下载更多
111111鱼仔  LV1 2024年5月30日
jay_Cmj  LV4 2024年2月29日
胡雪枫  LV1 2023年12月25日
X_nangua  LV1 2023年8月28日
红花会为额外人  LV1 2023年6月12日
a318888331  LV13 2022年10月31日
cjfantasy  LV3 2022年10月5日
huevnn  LV5 2022年6月15日
陈小灏  LV18 2022年6月8日
xiaowenroot  LV1 2021年12月7日
最近浏览更多
125665555 5月9日
暂无贡献等级
yansunling  LV1 2024年11月6日
111111鱼仔  LV1 2024年5月30日
jay_Cmj  LV4 2024年2月29日
胡雪枫  LV1 2023年12月25日
lshlsh 2023年12月25日
暂无贡献等级
X_nangua  LV1 2023年8月28日
wangjialiang1  LV17 2023年8月20日
bbggxx 2023年6月16日
暂无贡献等级
红花会为额外人  LV1 2023年6月12日
顶部 客服 微信二维码 底部
>扫描二维码关注最代码为好友扫描二维码关注最代码为好友