Server
import javax.swing.*;
import javax.swing.border.Border;
import java.awt.*;
import java.awt.event.*;
import java.io.*;
import java.net.*;
public class Sserver {
public static void main(String[] args) {
new SUI();//新建服务器界面
}
}
class SUI extends Jframe {
private static final long serialVersionUID = 1L;
JTextField Fport;//端口地址输入口
Jtextarea Fsay;//对话输入框
Jtextarea Aoutput;//对话输出框
JButton Bstart;//start键
JButton Bsay;//say键
JPanel top_jp = new JPanel();//上面板
JPanel down_jp = new JPanel();//下面板
ServerSocket sSoc;//服务器套接字
Socket soc;//accept()返回的套接字
Border pad = BorderFactory.createEmptyBorder(5, 10, 5, 10); //间距框
void init() {
setBounds(440, 200, 600, 480);//设置大小
setDefaultCloseOperation(EXIT_ON_CLOSE);
setTitle("Sserver");
Fport = new JTextField(16);
Fsay = new Jtextarea();
Aoutput = new Jtextarea();
Bstart = new JButton("Start");
Bsay = new JButton("Say");
//连接区设置
top_jp.setLayout(new FlowLayout(FlowLayout.LEFT)); //顶部设为流式布局,左对齐
top_jp.setBorder(BorderFactory.createCompoundBorder(pad, BorderFactory.createTitledBorder("服务器设置")));
top_jp.add(new JLabel("Port:"));
top_jp.add(Fport);
top_jp.add(Bstart);
//消息区设置
Aoutput.setOpaque(true); //设置背景色打开
Aoutput.setBackground(Color.WHITE); //设置背景色
Aoutput.setEditable(false);
Aoutput.setBorder(BorderFactory.createCompoundBorder(pad, BorderFactory.createTitledBorder("消息框"))); //添加复合边框
Aoutput.setLineWrap(true); //自动换行打开
JScrollPane scroll1 = new JScrollPane(Aoutput); //滚动条
scroll1.setVerticalScrollBarPolicy(JScrollPane.VERTICAL_SCROLLBAR_AS_NEEDED); //分别设置水平和垂直滚动栏自己主动出现
//待发送区设置
down_jp.setLayout(new BorderLayout()); //发送区设为卡片布局,中间是输入框,下面是发送按钮
down_jp.setBorder(BorderFactory.createCompoundBorder(pad, BorderFactory.createTitledBorder("输入框")));
Fsay.setLineWrap(true); //自动换行打开
JScrollPane scroll2 = new JScrollPane(Fsay); //滚动条
scroll2.setVerticalScrollBarPolicy(JScrollPane.VERTICAL_SCROLLBAR_AS_NEEDED); //分别设置水平和垂直滚动栏自己主动出现
down_jp.add(scroll2, BorderLayout.CENTER); //把带滚动条的textarea加进去
JPanel send_jp = new JPanel();
send_jp.setLayout(new FlowLayout(FlowLayout.RIGHT));
Bsay.setPreferredSize(new Dimension(70, 18));
send_jp.setPreferredSize(new Dimension(0, 26));
send_jp.add(Bsay);
down_jp.add(send_jp, BorderLayout.SOUTH);
//设置布局
add(top_jp, BorderLayout.NORTH);
add(scroll1, BorderLayout.CENTER);
add(down_jp, BorderLayout.SOUTH);
top_jp.setPreferredSize(new Dimension(0, 80));
down_jp.setPreferredSize(new Dimension(0, 120));
setVisible(true);
}
SUI() {
init();
//为start键添加监听器
Bstart.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent e) {
Aoutput.append("Server starting...n");
//信息输入线程
new Thread(new Runnable() {
public void run() {
try {
sSoc = new ServerSocket(Integer.parseInt(Fport.getText()));
soc = sSoc.accept();
Aoutput.append("Client connected...n");
while (true) {
BufferedReader br = new BufferedReader(new InputStreamReader(soc.getInputStream()));
String s;
while ((s = br.readLine()) != null) {
Aoutput.append("Client said: " + s + "nn");
}
}
} catch (IOException exc) {
exc.printStackTrace();
}
}
}).start();
}
});
//为say键添加监听器
Bsay.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent e) {
//信息输出至客户端
try {
Aoutput.append("I said: " + Fsay.getText() + "nn");
PrintWriter pw = new PrintWriter(soc.getOutputStream());
pw.println(Fsay.getText());
pw.flush();
Fsay.setText("");
} catch (IOException exc) {
exc.printStackTrace();
}
}
});
}
}
Client
import javax.swing.*;
import javax.swing.border.Border;
import java.awt.*;
import java.awt.event.*;
import java.io.*;
import java.net.*;
public class Sclient {
public static void main(String[] args) {
new CUI();//新建客户端界面
}
}
class CUI extends Jframe {
private static final long serialVersionUID = 1L;
JTextField Fip;//IP地址输入口
JTextField Fport;//端口地址输入口
Jtextarea Fsay;//对话输入框
Jtextarea Aoutput;//对话输入框
JButton Bconnect;//connect键
JButton Bsay;//say键
JPanel top_jp = new JPanel();//上面板
JPanel down_jp = new JPanel();//下面板
Border pad = BorderFactory.createEmptyBorder(5, 10, 5, 10);
Socket soc;//客户端套接字
//设置基本信息的初始化函数
void init() {
setBounds(440, 200, 600, 480); //设置大小
setDefaultCloseOperation(EXIT_ON_CLOSE);
setTitle("Sclient");
Fip = new JTextField(12);
Fport = new JTextField(12);
Fsay = new Jtextarea();
Aoutput = new Jtextarea();
Bconnect = new JButton("Connect");
Bsay = new JButton("Say");
//连接区设置
top_jp.setLayout(new FlowLayout(FlowLayout.LEFT)); //顶部设为流式布局,左对齐
top_jp.setBorder(BorderFactory.createCompoundBorder(pad, BorderFactory.createTitledBorder("服务器设置")));
top_jp.add(new JLabel("Server IP:"));
top_jp.add(Fip);
top_jp.add(new JLabel("Server Port:"));
top_jp.add(Fport);
top_jp.add(Bconnect);
//消息区设置
Aoutput.setOpaque(true); //设置背景色打开
Aoutput.setBackground(Color.WHITE); //设置背景色
Aoutput.setEditable(false);
Aoutput.setBorder(BorderFactory.createCompoundBorder(pad, BorderFactory.createTitledBorder("消息框"))); //添加复合边框
Aoutput.setLineWrap(true); //自动换行打开
JScrollPane scroll1 = new JScrollPane(Aoutput); //滚动条
scroll1.setVerticalScrollBarPolicy(JScrollPane.VERTICAL_SCROLLBAR_AS_NEEDED); //分别设置水平和垂直滚动栏自己主动出现
//待发送区设置
down_jp.setLayout(new BorderLayout()); //发送区设为卡片布局,中间是输入框,下面是发送按钮
down_jp.setBorder(BorderFactory.createCompoundBorder(pad, BorderFactory.createTitledBorder("输入框")));
Fsay.setLineWrap(true); //自动换行打开
JScrollPane scroll2 = new JScrollPane(Fsay); //滚动条
scroll2.setVerticalScrollBarPolicy(JScrollPane.VERTICAL_SCROLLBAR_AS_NEEDED); //分别设置水平和垂直滚动栏自己主动出现
down_jp.add(scroll2, BorderLayout.CENTER); //把带滚动条的textarea加进去
JPanel send_jp = new JPanel();
send_jp.setLayout(new FlowLayout(FlowLayout.RIGHT));
Bsay.setPreferredSize(new Dimension(70, 18));
send_jp.setPreferredSize(new Dimension(0, 26));
send_jp.add(Bsay);
down_jp.add(send_jp, BorderLayout.SOUTH);
//设置布局
add(top_jp, BorderLayout.NORTH);
add(scroll1, BorderLayout.CENTER);
add(down_jp, BorderLayout.SOUTH);
top_jp.setPreferredSize(new Dimension(0, 80));
down_jp.setPreferredSize(new Dimension(0, 120));
setVisible(true);
}
//构造函数
CUI() {
init();
//为connect键添加监听器
Bconnect.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent e) {
Aoutput.append("Connect to server...nn");
//信息输入线程
new Thread(new Runnable() {
public void run() {
try {
soc = new Socket(Fip.getText(), Integer.parseInt(Fport.getText()));
while (true) {
BufferedReader br = new BufferedReader(new InputStreamReader(soc.getInputStream()));
String s;
while ((s = br.readLine()) != null) {
Aoutput.append("Server said: " + s + "nn");
}
}
} catch (IOException exc) {
exc.printStackTrace();
}
}
}).start();
}
});
//为say键添加监听器
Bsay.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent e) {
try {
//将要发送的信息上传至客户端
Aoutput.append("I said: " + Fsay.getText() + "nn");
PrintWriter pw = new PrintWriter(soc.getOutputStream());
pw.println(Fsay.getText());
pw.flush();
Fsay.setText(""); //清空输入框
} catch (IOException exc) {
exc.printStackTrace();
}
}
});
}
}