服务器端:
package com.itcast;
import javax.swing.*;
import java.awt.*;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.event.KeyEvent;
import java.awt.event.KeyListener;
import java.io.*;
import java.net.ServerSocket;
import java.net.Socket;
import java.util.Properties;
//说明:如果一个类,需要有界面的显示,那么该类就需要继承自JFrame,此时,该类就可以被称为一个"窗体类"
//1.定义JFrame窗体中的组件
//2.在构造方法中初始化窗体的组件
//3.使用网络编程完成数据的传输(TCP,UDP,协议)
//4.实现“发送"按钮的监听点击事件
//5.实现“回车"发送数据
public class ServiceChatMain extends JFrame implements ActionListener , KeyListener {
public static void main(String[] args) {
//调用构造方法
new ServiceChatMain();
}
//属性
//文本框
private JTextArea jta;
//滚动条
private JScrollPane jsp;
//面板
private JPanel jp;
//文本框
private JTextField jtf;
//按钮
private JButton jb;
//输出流
private BufferedWriter bw = null;
//服务器的端口号
/*private static int serverPort;
//使用static静态代码块读取外部配置文件
//特点1:在类加载的时候,自动执行
//特点2:一个类只会被加载一次,因此静态代码块在程序中仅会被执行一次
static {
Properties pro = new Properties();
try {
//加载
pro.load(new FileReader("chat.properties"));
serverPort = Integer.parseInt(pro.getProperty("serverPort"));
}catch (IOException e){
e.printStackTrace();
}
}
*/
//构造方法
public ServiceChatMain(){
//初始化组件
jta = new JTextArea();
//设置文本域默认不可编辑
jta.setEditable(false);
//注释:需要将文本框添加到滚动条中,实现滚动效果
jsp = new JScrollPane(jta);
//面板
jp = new JPanel();
jtf = new JTextField(10);
jb = new JButton("发送");
//注释:需要将文本框与按钮添加到面板中
jp.add(jtf);
jp.