先运行服务端,再运行客户端。
效果图:
客户端
import java.awt.BorderLayout;
import java.awt.Color;
import java.awt.Container;
import java.awt.FlowLayout;
import java.awt.Font;
import java.awt.GridLayout;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.io.BufferedReader;
import java.io.BufferedWriter;
import java.io.DataInputStream;
import java.io.DataOutputStream;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.OutputStream;
import java.io.OutputStreamWriter;
import java.io.PrintWriter;
import java.net.InetAddress;
import java.net.ServerSocket;
import java.net.Socket;
import java.net.UnknownHostException;
import javax.swing.BorderFactory;
import javax.swing.BoxLayout;
import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JPanel;
import javax.swing.JScrollPane;
import javax.swing.JTextArea;
import javax.swing.JTextField;
import javax.swing.border.BevelBorder;
import javax.swing.border.Border;
import javax.swing.border.LineBorder;
import javax.swing.border.TitledBorder;
import javax.swing.plaf.TextUI;
/* 基于TCP协议的Socket编程
* 双向通信
* 通过IO流传输数据
*/
//客户端
public class MyChat1 extends JFrame{
private static final long serialVersionUID = 1L;
private PrintWriter writer; //输出流
private BufferedReader br; //输入流
private ServerSocket server; //ServerSocket
Socket socket; //ServerSocket生成的Socket
private JTextArea ta = new JTextArea();
private JTextArea tf = new JTextArea();
Container cc;
public MyChat1(String title) {
super(title);
//JFrame布局与一些组件的设置
setLayout(new GridLayout(2,1));
setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
cc = this.getContentPane();
ta.setFocusable(false);
ta.setLineWrap(true);
tf.setLineWrap(true);
Font f1 = new Font("等线", 50, 20);
ta.setFont(f1);
tf.setFont(f1);
//设置聊天显示界面
final JScrollPane scrollPane1 = new JScrollPane();
scrollPane1.setBorder(new LineBorder(Color.gray,1));
getContentPane().add(scrollPane1,BorderLayout.CENTER);
scrollPane1.setViewportView(ta);
//输入界面的一些设置:p = p1 + p2
JPanel p = new JPanel();
p.setLayout(new BorderLayout());
JPanel p1 = new JPanel();
JPanel p2 = new JPanel(new BorderLayout());
p1.setBackground(Color.white);
//发送按钮
JButton btn1 = new JButton("发送");
Color btnBag = new Color(71,200,248);
btn1.setBackground(btnBag);
btn1.setFont(new Font("宋体",15,15));
btn1.setForeground(Color.white);
//清空按钮
JButton btn2 = new JButton("清空");
btn2.setBackground(Color.white);
btn2.setFont(new Font("宋体",15,15));
JLabel lab1 = new JLabel(" ");
JLabel lab2 = new JLabel(" ");
//聊天输入界面布局
p1.add(lab1);
p1.add(lab2);
p1.add(btn1);
p1.add(btn2);
p2.add(tf,BorderLayout.CENTER);
p.add(p2,BorderLayout.CENTER);
p.add(p1,BorderLayout.SOUTH);
cc.add(p,BorderLayout.SOUTH);
//绑定事件
btn1.addActionListener(new ActionListener() {
@Override
public void actionPerformed(ActionEvent arg0) {
writer.println(tf.getText());
if(!"".equals(tf.getText())) {
ta.append("我:"+tf.getText()+"\n");
}
ta.setSelectionEnd(ta.getText().length());
tf.setText("");
}
});
btn2.addActionListener(new ActionListener() {
@Override
public void actionPerformed(ActionEvent e) {
tf.setText("");
}
});
}
//等待连接 - 获取输入输出流 - 接收信息
void getServer() throws IOException {
server = new ServerSocket(8866);
System.out.println("成功创建套接字连接");
while(true) {
System.out.println("等待客户端连接");
socket = server.accept();
br = new BufferedReader(new InputStreamReader(socket.getInputStream()));
writer = new PrintWriter(socket.getOutputStream(),true);
getClientMessage();
}
}
//接收信息
void getClientMessage() throws IOException {
while(true) {
String text = br.readLine();
if(!"".equals(text)) {
ta.append("对方:"+text+"\n");
}
if("exit".equals(text)) {
break;
}
}
if(br != null) {
br.close();
}
if(socket != null) {
socket.close();
}
}
public static void main(String[] args) throws UnknownHostException, IOException {
MyChat1 clien = new MyChat1("QQ");
clien.setSize(610,630);
clien.setVisible(true);
clien.getServer();
}
}
服务端
import java.awt.BorderLayout;
import java.awt.Color;
import java.awt.Container;
import java.awt.Font;
import java.awt.GridLayout;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.PrintWriter;
import java.net.Socket;
import java.net.UnknownHostException;
import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JPanel;
import javax.swing.JScrollPane;
import javax.swing.JTextArea;
import javax.swing.border.LineBorder;
public class MyChat2 extends JFrame {
private PrintWriter writer; //输出流
private BufferedReader br; //输入流
Socket socket; //ServerSocket生成的Socket
private JTextArea ta = new JTextArea();
private JTextArea tf = new JTextArea();
Container cc;
public MyChat2(String title) {
super(title);
//JFrame布局与一些组件的设置
setLayout(new GridLayout(2,1));
setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
cc = this.getContentPane();
ta.setFocusable(false);
ta.setLineWrap(true);
tf.setLineWrap(true);
Font f1 = new Font("等线", 50, 20);
ta.setFont(f1);
tf.setFont(f1);
//设置聊天显示界面
final JScrollPane scrollPane1 = new JScrollPane();
scrollPane1.setBorder(new LineBorder(Color.gray,1));
getContentPane().add(scrollPane1,BorderLayout.CENTER);
scrollPane1.setViewportView(ta);
//输入界面的一些设置:p = p1 + p2
JPanel p = new JPanel();
p.setLayout(new BorderLayout());
JPanel p1 = new JPanel();
JPanel p2 = new JPanel(new BorderLayout());
p1.setBackground(Color.white);
//发送按钮
JButton btn1 = new JButton("发送");
Color btnBag = new Color(71,200,248);
btn1.setBackground(btnBag);
btn1.setFont(new Font("宋体",15,15));
btn1.setForeground(Color.white);
//清空按钮
JButton btn2 = new JButton("清空");
btn2.setBackground(Color.white);
btn2.setFont(new Font("宋体",15,15));
JLabel lab1 = new JLabel(" ");
JLabel lab2 = new JLabel(" ");
//聊天输入界面布局
p1.add(lab1);
p1.add(lab2);
p1.add(btn1);
p1.add(btn2);
p2.add(tf,BorderLayout.CENTER);
p.add(p2,BorderLayout.CENTER);
p.add(p1,BorderLayout.SOUTH);
cc.add(p,BorderLayout.SOUTH);
//绑定事件
btn1.addActionListener(new ActionListener() {
@Override
public void actionPerformed(ActionEvent arg0) {
writer.println(tf.getText());
if(!"".equals(tf.getText())) {
ta.append("我:"+tf.getText()+"\n");
}
ta.setSelectionEnd(ta.getText().length());
tf.setText("");
}
});
btn2.addActionListener(new ActionListener() {
@Override
public void actionPerformed(ActionEvent e) {
tf.setText("");
}
});
}
private void connect() throws UnknownHostException, IOException {
ta.append("尝试连接\n");
socket = new Socket("localhost",8866);
writer = new PrintWriter(socket.getOutputStream(),true);
ta.append("连接完成\n");
br = new BufferedReader(new InputStreamReader(socket.getInputStream()));
getClientMessage();
}
void getClientMessage() throws IOException {
while(true) {
String text = br.readLine();
if("exit".equals(text)) {
break;
}
if(!"".equals(text)) {
ta.append("对方:"+text+"\n");
}
writer.println(tf.getText());
}
if(br != null) {
br.close();
}
if(socket != null) {
socket.close();
}
}
public static void main(String[] args) throws UnknownHostException, IOException {
MyChat2 mychat2 = new MyChat2("QQ");
mychat2.setSize(600,500);
mychat2.setVisible(true);
mychat2.connect();
}
}