2014.11.23聊天程序,网络转载,必须先点击“侦听”,再点击“连接”

本文介绍了一个简单的聊天室程序,包括服务器端和客户端的Java实现。通过Socket编程技术,实现了基本的文本消息收发功能。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

1.服务器

package com.hechao;

import java.awt.*;
import java.awt.event.*;
import javax.swing.*;
import java.io.*;
import java.net.*;
/**
 * 服务器
 * @author hechao
 *
 */
public class Server extends JFrame implements ActionListener {
	private static final long serialVersionUID = 1L;
	JPanel contentPane;
	JLabel jLabel2 = new JLabel();
	JTextField jTextField2 = new JTextField("4700");
	JButton jButton1 = new JButton();
	JLabel jLabel3 = new JLabel();
	JTextField jTextField3 = new JTextField();
	JButton jButton2 = new JButton();
	JScrollPane jScrollPane1 = new JScrollPane();
	JTextArea jTextArea1 = new JTextArea();
	ServerSocket server = null;
	Socket socket = null;
	BufferedReader instr = null;
	PrintWriter os = null;
	/**
	 * 构造器
	 */
	// Construct the frame
	public Server() {
		jbInit();

	}
	/**
	 * 我的线程
	 * @author hechao
	 *
	 */
	class MyThread extends Thread {// 该线程负责接受数据
		@SuppressWarnings("static-access")
		public void run() {
			try {
				while (true) {
					this.sleep(100);
					instr = new BufferedReader(new InputStreamReader(
							socket.getInputStream()));
					if (instr.ready()) { // 检查是否有数据
						jTextArea1.append("客户端:  " + instr.readLine() + "\n");
					}
				}
			} 
			catch (Exception ex) {
				
			}
		}
	}

	public void actionPerformed(ActionEvent e) {
		if (e.getSource() == jButton1) {
			int port = Integer.parseInt(jTextField2.getText().trim());
			listenClient(port);
		}
		if (e.getSource() == jButton2) {
			String s = this.jTextField3.getText().trim();
			sendData(s);
		}
	}

	private void listenClient(int port) {// 侦听
		try {
			if (jButton1.getText().trim().equals("侦听")) {
				server = new ServerSocket(port);
				jButton1.setText("正在侦听...");
				socket = server.accept();// 等待,一直到客户端连接才望下执行
				sendData("已经成功连接。。。");
				jButton1.setText("正在聊天...");
				jTextArea1.append("客户端已经连接到服务器\n");
				MyThread t = new MyThread();
				t.start();
			}

		} 
		catch (Exception ex) {
			
		}
	}
	/**
	 * 发消息
	 * @param s 消息内容
	 */
	private void sendData(String s) {// 发送数据
		try {
			os = new PrintWriter(socket.getOutputStream());
			os.println(s);
			os.flush();
			if (!s.equals("已经成功连接。。。"))
				this.jTextArea1.append("Server:" + s + "\n");
		} 
		catch (Exception ex) {
			
		}
	}
	/**
	 * 窗口初始化
	 */
	// Component initialization
	private void jbInit() {
		contentPane = (JPanel) this.getContentPane();
		contentPane.setLayout(null);
		this.setSize(new Dimension(540, 340));
		this.setTitle("服务器");
		jLabel2.setBounds(new Rectangle(22, 27, 72, 28));
		jLabel2.setText("端口号");
		jLabel2.setFont(new java.awt.Font("宋体", 0, 14));
		jTextField2.setBounds(new Rectangle(113, 27, 315, 24));

		jButton1.setBounds(new Rectangle(440, 28, 73, 25));
		jButton1.setFont(new java.awt.Font("Dialog", 0, 14));
		jButton1.setBorder(BorderFactory.createEtchedBorder());
		jButton1.setActionCommand("jButton1");
		jButton1.setText("侦听");
		jLabel3.setBounds(new Rectangle(23, 57, 87, 28));
		jLabel3.setText("请输入信息");
		jLabel3.setFont(new java.awt.Font("宋体", 0, 14));
		jTextField3.setBounds(new Rectangle(114, 60, 314, 24));
		jTextField3.setText("");
		jButton2.setText("发送");
		jButton2.setActionCommand("jButton1");
		jButton2.setBorder(BorderFactory.createEtchedBorder());
		jButton2.setFont(new java.awt.Font("Dialog", 0, 14));
		jButton2.setBounds(new Rectangle(440, 58, 73, 25));
		jScrollPane1.setBounds(new Rectangle(23, 92, 493, 189));

		contentPane.add(jTextField2, null);
		contentPane.add(jButton1, null);
		contentPane.add(jLabel3, null);
		contentPane.add(jTextField3, null);
		contentPane.add(jButton2, null);
		contentPane.add(jScrollPane1, null);
		contentPane.add(jLabel2, null);
		jScrollPane1.getViewport().add(jTextArea1, null);
		jButton1.addActionListener(this);
		jButton2.addActionListener(this);
		this.addWindowListener(new WindowAdapter() {
			public void windowClosing(WindowEvent e) {
				try {
					socket.close();
					instr.close();
					System.exit(0);
				} 
				catch (Exception ex) {
					
				}

			}
		});
	}

	public static void main(String arg[]) {
		JFrame.setDefaultLookAndFeelDecorated(true);
		Server frm = new Server();
		frm.setVisible(true);

	}
}


2.客户端

<strong>package com.hechao;

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

import javax.swing.*;

import java.io.*;
import java.net.*;
/**
 * 客户端
 * @author hechao
 *
 */
public class Client extends JFrame implements ActionListener {
	private static final long serialVersionUID = 1L;
	JPanel contentPane;
	JLabel jLabel1 = new JLabel();
	JTextField jTextField1 = new JTextField("127.0.0.1");
	JLabel jLabel2 = new JLabel();
	JTextField jTextField2 = new JTextField("4700");
	JButton jButton1 = new JButton();
	JLabel jLabel3 = new JLabel();
	JTextField jTextField3 = new JTextField();
	JButton jButton2 = new JButton();
	JScrollPane jScrollPane1 = new JScrollPane();
	JTextArea jTextArea1 = new JTextArea();
	BufferedReader instr = null;
	Socket socket = null;
	PrintWriter os = null;
	/**
	 * 构造器
	 */
	public Client() {
		jbInit();
	}
	/**
	 * 我的线程
	 * @author hechao
	 *
	 */
	class MyThread extends Thread {
		@SuppressWarnings("static-access")
		public void run() {
			try {
				os = new PrintWriter(socket.getOutputStream());
				instr = new BufferedReader(new InputStreamReader(
						socket.getInputStream()));
				while (true) {
					this.sleep(100);
					if (instr.ready()) {
						jTextArea1.append("服务器: " + instr.readLine() + "\n");
					}
				}
			} catch (Exception ex) {
			}

		}
	}

	public void actionPerformed(ActionEvent e) {
		if (e.getSource() == jButton1) {
			String ip = jTextField3.getText().trim();
			int port = Integer.parseInt(jTextField2.getText().trim());
			connectServer(ip, port);
		}
		if (e.getSource() == jButton2) {
			String s = this.jTextField3.getText().trim();
			sendData(s);
		}
	}
	/**
	 * 创建链接
	 * @param ip 	IP
	 * @param port	端口
	 */
	private void connectServer(String ip, int port) {// 连接

		try {
			if (jButton1.getText().trim().equals("连接")) {
				jButton1.setText("连接服务器...");
				socket = new Socket(ip, port);
				jButton1.setText("正在聊天");

				MyThread t = new MyThread();
				t.start();
			}
		} 
		catch (Exception ex) {
			
		}
	}
	/**
	 * 发送消息
	 * @param s 消息内容
	 */
	private void sendData(String s) {// 发送数据
		try {
			os = new PrintWriter(socket.getOutputStream());
			os.println(s);
			os.flush();
			this.jTextArea1.append("Server:" + s + "\n");

		} catch (Exception ex) {
		}
	}
	/**
	 * 初始化控件
	 */
	private void jbInit() {
		contentPane = (JPanel) this.getContentPane();
		jLabel1.setFont(new java.awt.Font("宋体", 0, 14));
		jLabel1.setText("服务器名称");
		jLabel1.setBounds(new Rectangle(20, 22, 87, 28));
		contentPane.setLayout(null);
		this.setSize(new Dimension(540, 340));
		this.setTitle("客户端");

		jTextField1.setBounds(new Rectangle(114, 26, 108, 24));
		jLabel2.setBounds(new Rectangle(250, 25, 72, 28));
		jLabel2.setText("端口号");
		jLabel2.setFont(new java.awt.Font("宋体", 0, 14));
		jTextField2.setBounds(new Rectangle(320, 27, 108, 24));

		jButton1.setBounds(new Rectangle(440, 28, 73, 25));
		jButton1.setFont(new java.awt.Font("Dialog", 0, 14));
		jButton1.setBorder(BorderFactory.createEtchedBorder());
		jButton1.setActionCommand("jButton1");
		jButton1.setText("连接");
		jLabel3.setBounds(new Rectangle(23, 57, 87, 28));
		jLabel3.setText("请输入信息");
		jLabel3.setFont(new java.awt.Font("宋体", 0, 14));
		jTextField3.setBounds(new Rectangle(114, 60, 314, 24));

		jButton2.setText("发送");
		jButton2.setActionCommand("jButton1");
		jButton2.setBorder(BorderFactory.createEtchedBorder());
		jButton2.setFont(new java.awt.Font("Dialog", 0, 14));
		jButton2.setBounds(new Rectangle(440, 58, 73, 25));
		jScrollPane1.setBounds(new Rectangle(23, 92, 493, 189));

		contentPane.add(jLabel1, null);
		contentPane.add(jTextField1, null);
		contentPane.add(jLabel2, null);
		contentPane.add(jTextField2, null);
		contentPane.add(jButton1, null);
		contentPane.add(jLabel3, null);
		contentPane.add(jTextField3, null);
		contentPane.add(jButton2, null);
		contentPane.add(jScrollPane1, null);
		jScrollPane1.getViewport().add(jTextArea1, null);
		jButton1.addActionListener(this);
		jButton2.addActionListener(this);
		this.addWindowListener(new WindowAdapter() {
			public void windowClosing(WindowEvent e) {
				try {
					socket.close();
					instr.close();
					os.close();
					System.exit(0);
				} catch (Exception ex) {
				}

			}
		});
	}

	public static void main(String arg[]) {
		JFrame.setDefaultLookAndFeelDecorated(true);
		Client frm = new Client();
		frm.setVisible(true);
	}
}</strong>


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值