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();
	}
}

🏆 运行结果

相关推荐
你怎么知道我是队长3 小时前
C语言---枚举变量
c语言·开发语言
李慕婉学姐3 小时前
【开题答辩过程】以《基于JAVA的校园即时配送系统的设计与实现》为例,不知道这个选题怎么做的,不知道这个选题怎么开题答辩的可以进来看看
java·开发语言·数据库
吃茄子的猫3 小时前
quecpython中&的具体含义和使用场景
开发语言·python
云栖梦泽3 小时前
易语言中小微企业Windows桌面端IoT监控与控制
开发语言
数据大魔方3 小时前
【期货量化实战】日内动量策略:顺势而为的短线交易法(Python源码)
开发语言·数据库·python·mysql·算法·github·程序员创富
奋进的芋圆4 小时前
Java 延时任务实现方案详解(适用于 Spring Boot 3)
java·spring boot·redis·rabbitmq
sxlishaobin5 小时前
设计模式之桥接模式
java·设计模式·桥接模式
Edward.W5 小时前
Python uv:新一代Python包管理工具,彻底改变开发体验
开发语言·python·uv
小熊officer5 小时前
Python字符串
开发语言·数据库·python
model20055 小时前
alibaba linux3 系统盘网站迁移数据盘
java·服务器·前端