GDPU Java 天码行空13

(一)实验目的

1、掌握JAVA中与网络程序开发相关的知识点;

2、理解并掌握网络编程开发思想及方法;

3、熟悉项目开发的分包方法和依据;

4、实现聊天室中客服端和服务器端的实现方法;

5、熟悉多线程程序开发方法;

6、完善界面设计。

(二)实验内容和步骤

1、完成聊天程序的服务器端和客服端的界面设计;

2、完成优化聊天程序的服务器端多线程编码;

3、完成与优化聊天程序的客服端编码。

👨‍🏫 参考视频教程

👨‍🏫 代码参考 pxj 佬

💖 ServerChatOnline.java

java 复制代码
import javax.swing.*;
import java.awt.*;
import java.awt.event.*;
import java.io.*;
import java.net.ServerSocket;
import java.net.Socket;

public class ServerChatOnline extends JFrame implements ActionListener
{
	private JTextArea jta;
	private JScrollPane jsp;
	private JPanel Jp;
	private JTextField jtf;
	private JButton jb;
	private BufferedWriter bw;

	private void create_windows()
	{
		jta = new JTextArea();
		// 编辑文本区域不可编辑
		jta.setEditable(false);
		// 将文本域丢到滑动条中
		jsp = new JScrollPane(jta);
		Jp = new JPanel();
		jtf = new JTextField(10);
		jb = new JButton("发送");

		Jp.add(jtf);
		Jp.add(jb);
		this.add(jsp, BorderLayout.CENTER);
		this.add(Jp, BorderLayout.SOUTH);
		this.setTitle("聊天室-服务器");
		this.setSize(300, 300);
		this.setLocation(300, 300);
		this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
		jta = new JTextArea();
		// 编辑文本区域不可编辑
		jta.setEditable(false);
		// 将文本域丢到滑动条中
		jsp = new JScrollPane(jta);
		Jp = new JPanel();
		jtf = new JTextField(10);
		jtf.addKeyListener(new KeyAdapter()
		{
			@Override
			public void keyPressed(KeyEvent e)
			{
				if (e.getKeyCode() == 10)
				{
					String text = jtf.getText();
					text = "s:" + text;
					jta.append(text + "\n");
					try
					{
						bw.write(text);
						bw.newLine();
						bw.flush();
						jtf.setText("");
					} catch (IOException ex)
					{
						ex.printStackTrace();
					}
				}
			}
		});
		jb = new JButton("发送");
		jb.addActionListener(this);
		Jp.add(jtf);
		Jp.add(jb);
		this.add(jsp, BorderLayout.CENTER);
		this.add(Jp, BorderLayout.SOUTH);
		this.setTitle("聊天室-服务器");
		this.setSize(300, 300);
		this.setLocation(300, 300);
		this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
		this.setVisible(true);
	}

	private void work()
	{
		try
		{
			// 创建服务端套接字
			ServerSocket serverSocket = new ServerSocket(10086);
			// 等待链接
			Socket socket = serverSocket.accept();
			// 获取socket输入流
			BufferedReader br = new BufferedReader(new InputStreamReader(socket.getInputStream()));
			// 获取socket输出流
			bw = new BufferedWriter(new OutputStreamWriter(socket.getOutputStream()));
			String line = null;
			// 循环读取数据,将其拼接到文本域中
			while ((line = br.readLine()) != null)
			{
				// 将传来的数据在文本域中显示出来
				jta.append(line + System.lineSeparator());
			}
			// 关闭socket
			serverSocket.close();
		} catch (IOException e)
		{
			e.printStackTrace();
		}
	}

	public ServerChatOnline()
	{
		create_windows();
		work();
	}

	@Override
	public void actionPerformed(ActionEvent e)
	{
		String text = jtf.getText();
		text = "s:" + text;
		jta.append(text + "\n");
		try
		{
			bw.write(text);
			bw.newLine();
			bw.flush();
			jtf.setText("");
		} catch (IOException ex)
		{
			ex.printStackTrace();
		}
	}
}

💖 ServerChatOnline.java

java 复制代码
import javax.swing.*;
import java.awt.*;
import java.awt.event.*;
import java.io.*;
import java.net.ServerSocket;
import java.net.Socket;

public class ServerChatOnline extends JFrame implements ActionListener
{
	private JTextArea jta;
	private JScrollPane jsp;
	private JPanel Jp;
	private JTextField jtf;
	private JButton jb;
	private BufferedWriter bw;

	private void create_windows()
	{
		jta = new JTextArea();
		// 编辑文本区域不可编辑
		jta.setEditable(false);
		// 将文本域丢到滑动条中
		jsp = new JScrollPane(jta);
		Jp = new JPanel();
		jtf = new JTextField(10);
		jb = new JButton("发送");

		Jp.add(jtf);
		Jp.add(jb);
		this.add(jsp, BorderLayout.CENTER);
		this.add(Jp, BorderLayout.SOUTH);
		this.setTitle("聊天室-服务器");
		this.setSize(300, 300);
		this.setLocation(300, 300);
		this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
		jta = new JTextArea();
		// 编辑文本区域不可编辑
		jta.setEditable(false);
		// 将文本域丢到滑动条中
		jsp = new JScrollPane(jta);
		Jp = new JPanel();
		jtf = new JTextField(10);
		jtf.addKeyListener(new KeyAdapter()
		{
			@Override
			public void keyPressed(KeyEvent e)
			{
				if (e.getKeyCode() == 10)
				{
					String text = jtf.getText();
					text = "s:" + text;
					jta.append(text + "\n");
					try
					{
						bw.write(text);
						bw.newLine();
						bw.flush();
						jtf.setText("");
					} catch (IOException ex)
					{
						ex.printStackTrace();
					}
				}
			}
		});
		jb = new JButton("发送");
		jb.addActionListener(this);
		Jp.add(jtf);
		Jp.add(jb);
		this.add(jsp, BorderLayout.CENTER);
		this.add(Jp, BorderLayout.SOUTH);
		this.setTitle("聊天室-服务器");
		this.setSize(300, 300);
		this.setLocation(300, 300);
		this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
		this.setVisible(true);
	}

	private void work()
	{
		try
		{
			// 创建服务端套接字
			ServerSocket serverSocket = new ServerSocket(10086);
			// 等待链接
			Socket socket = serverSocket.accept();
			// 获取socket输入流
			BufferedReader br = new BufferedReader(new InputStreamReader(socket.getInputStream()));
			// 获取socket输出流
			bw = new BufferedWriter(new OutputStreamWriter(socket.getOutputStream()));
			String line = null;
			// 循环读取数据,将其拼接到文本域中
			while ((line = br.readLine()) != null)
			{
				// 将传来的数据在文本域中显示出来
				jta.append(line + System.lineSeparator());
			}
			// 关闭socket
			serverSocket.close();
		} catch (IOException e)
		{
			e.printStackTrace();
		}
	}

	public ServerChatOnline()
	{
		create_windows();
		work();
	}

	@Override
	public void actionPerformed(ActionEvent e)
	{
		String text = jtf.getText();
		text = "s:" + text;
		jta.append(text + "\n");
		try
		{
			bw.write(text);
			bw.newLine();
			bw.flush();
			jtf.setText("");
		} catch (IOException ex)
		{
			ex.printStackTrace();
		}
	}
}

💖 ChatOnlineDemo.java

java 复制代码
public class ChatOnlineDemo
{
	public static void main(String[] args)
	{
		new Thread(new Thread1()).start();
		new Thread(new Thread2()).start();
	}
}

class Thread1 implements Runnable
{
	@Override
	public synchronized void run()
	{
		ServerChatOnline S = new ServerChatOnline();
	}
}

class Thread2 implements Runnable
{
	@Override
	public synchronized void run()
	{
		ClientChatOnline C = new ClientChatOnline();
	}
}

🏆 运行结果

相关推荐
陌上花开࿈6 分钟前
调用第三方接口
java
Aileen_0v013 分钟前
【玩转OCR | 腾讯云智能结构化OCR在图像增强与发票识别中的应用实践】
android·java·人工智能·云计算·ocr·腾讯云·玩转腾讯云ocr
西猫雷婶2 小时前
python学opencv|读取图像(十九)使用cv2.rectangle()绘制矩形
开发语言·python·opencv
桂月二二2 小时前
Java与容器化:如何使用Docker和Kubernetes优化Java应用的部署
java·docker·kubernetes
liuxin334455662 小时前
学籍管理系统:实现教育管理现代化
java·开发语言·前端·数据库·安全
码农W2 小时前
QT--静态插件、动态插件
开发语言·qt
ke_wu3 小时前
结构型设计模式
开发语言·设计模式·组合模式·简单工厂模式·工厂方法模式·抽象工厂模式·装饰器模式
小马爱打代码3 小时前
设计模式详解(建造者模式)
java·设计模式·建造者模式
code04号3 小时前
python脚本:批量提取excel数据
开发语言·python·excel
小王爱吃月亮糖3 小时前
C++的23种设计模式
开发语言·c++·qt·算法·设计模式·ecmascript