界面
 package chat;
 //我的聊天工具
 import java.awt.event.*;
 import java.io.*;
 import java.net.*;
 
import javax.swing.*;
 import javax.swing.event.*;
 
public class ChatAWT extends javax.swing.JFrame {
 private JLabel jLabel1;
 private JLabel jLabel2;
 private JLabel jLabel3;
 private JButton jButton1;
 private JButton jButton2;
 private JButton jButton3;
 public JTextArea jTextArea2;
 public JTextArea jTextArea1;
 private JScrollPane jScrollPane1;
 private JScrollPane jScrollPane2;
 private Socket sk; //Socket对象
private String Text=""; //接收聊天记录public ChatAWT(Socket sk) throws Exception {
 super();
 initGUI();
 this.sk=sk; } private void initGUI() {
 try {
 setDefaultCloseOperation(WindowConstants.DISPOSE_ON_CLOSE);
 getContentPane().setLayout(null);
 getContentPane().setBackground(new java.awt.Color(83,169,255));
 {
 jLabel1 = new JLabel();
 getContentPane().add(jLabel1);
 jLabel1.setText("我的聊天室");
jLabel1.setBounds(118, 12, 106, 26);
 jLabel1.setFont(new java.awt.Font("新宋体",1,20));
 }
 {
 jScrollPane1 = new JScrollPane();
 getContentPane().add(jScrollPane1, "Center");
 jScrollPane1.setBounds(45, 44, 262, 149);
 {
 jTextArea1 = new JTextArea();
 jScrollPane1.setViewportView(jTextArea1);
 jTextArea1.setBackground(new java.awt.Color(191,251,214));
 jTextArea1.setEditable(false);
 }
 }
 {
 jScrollPane2 = new JScrollPane();
 getContentPane().add(jScrollPane2, "Center");
 jScrollPane2.setBounds(45, 215, 262, 109);
 {
 jTextArea2 = new JTextArea();
 jScrollPane2.setViewportView(jTextArea2);
 }
 }
 {
 jButton1 = new JButton();
 getContentPane().add(jButton1);
 jButton1.setText("发送");
jButton1.setBounds(245, 330, 62, 24);
 jButton1.addActionListener(new Chat_Send(this));
 }
 {
 jButton2 = new JButton();
 getContentPane().add(jButton2);
 jButton2.setText("清屏");
jButton2.setBounds(351, 169, 92, 24);
 jButton2.addActionListener(new Chat_eliminate(this));
 }
 {
 jButton3 = new JButton();
 getContentPane().add(jButton3);
 jButton3.setText("聊天记录");
jButton3.setBounds(351, 206, 92, 24);
 }
 {
 jLabel2 = new JLabel();
 getContentPane().add(jLabel2);
 jLabel2.setText("客户B");
 jLabel2.setBounds(339, 62, 112, 73);
 jLabel2.setFont(new java.awt.Font("华文行楷",1,36));
 }
 {
 jLabel3 = new JLabel();
 getContentPane().add(jLabel3);
 jLabel3.setText("客户A");
 jLabel3.setFont(new java.awt.Font("华文行楷",1,36));
 jLabel3.setBounds(339, 257, 112, 73);
 }
 pack();
 this.setSize(500, 400);
 this.setLocationRelativeTo(null);
 this.setVisible(true);
 } catch (Exception e) {
 e.printStackTrace();
 } } //发送键——执行的操作
public void send() throws Exception{
 //思路:把从输入框获得内容,放到聊天记录框,并把它写入到输出流中
String str=jTextArea2.getText()+"\n";
 //jTextArea1.append("客户端:"+str); //发送完的内容放到接收文本框
OutputStream out=sk.getOutputStream();
 PrintStream print=new PrintStream(out,true);
 print.print(str);
 jTextArea2.setText(""); //发送完之后输入框置空
} //清屏键——执行的操作
public void eliminate (){
 jTextArea1.setText("");
 } //实现接收客户端发来的数据
public void receive(){ try {
 //读取客户端发来的数据
InputStream in=sk.getInputStream();
 //把字节流读到缓冲字符流中(new InputStreamReader(in)把字节流转化成字符流)
BufferedReader reader=new BufferedReader(new InputStreamReader(in));
 String str="";
 while((str=reader.readLine())!=null){
 //把读到的信息放到聊天记录框中
jTextArea1.append("服务端:");
System.out.println("服务端:");
 }
 } catch (IOException e) {
 e.printStackTrace();
 }
 }
 }
 
//发送键——实现监听
 class Chat_Send implements ActionListener{
 private ChatAWT chat;
 public Chat_Send(ChatAWT chat) {
 super();
 this.chat = chat;
 }
 public void actionPerformed(ActionEvent e) {
 try {
 chat.send();
 } catch (Exception e1) {
 e1.printStackTrace();
 }
 }
 }
 
//清屏键——实现监听
 class Chat_eliminate implements ActionListener{
 private ChatAWT chat;
 public Chat_eliminate(ChatAWT chat) {
 super();
 this.chat = chat;
 }
 public void actionPerformed(ActionEvent e) {
 chat.eliminate();
 }
 }
 
客户端
 package chat;
 
import java.io.*;
 import java.net.*;
 
public class Chat {
 public static void main(String[] args) throws Exception {
 Socket sk = new Socket("127.0.0.1", 20139);
 ChatAWT chat = new ChatAWT(sk);
 ChatThread t = new ChatThread(chat, sk);
 t.start();
 }
 }
 
客户端线程
 package chat;
 
import java.io.*;
 import java.net.Socket;
 
public class ChatThread extends Thread {
 private ChatAWT chat;
 private Socket sk; //构建有参构造(目的:和界面)
public ChatThread(ChatAWT chat, Socket sk) {
 super();
 this.chat = chat;
 this.sk = sk;
 } public void run() {
 super.run();
 try {
 while(true){
 System.out.println("线程启动了");
 //读取客户端发来的数据
InputStream in=sk.getInputStream(); System.out.println(sk.getInetAddress());
 //把字节流读到缓冲字符流中(new InputStreamReader(in)把字节流转化成字符流)
BufferedReader reader=new BufferedReader(new InputStreamReader(in));
 chat.jTextArea1.append("服务端:"+reader.readLine());
 System.out.println("服务端:");
 } } catch (IOException e) {
 e.printStackTrace();
 }
 } }
 服务端
 package chat;
 
import java.io.*;
 import java.net.*;
 import java.util.HashSet;
 import java.util.Scanner;
 import java.util.Set;
 //服务端
 public class Server {
 public static void main(String[] args) throws Exception {
 System.out.println("服务器已启动");
 //创建serversocket对象
ServerSocket ss=new ServerSocket(20139); //进行监听,获得相应的客户端socket对象、
Socket sk=ss.accept(); //读取客户端发来输出流数据
InputStream in=sk.getInputStream();
 OutputStream out=sk.getOutputStream();
 //把字节流读到缓冲字符流中(new InputStreamReader(in)把字节流转化成字符流)
BufferedReader reader=new BufferedReader(new InputStreamReader(in));
 String msg="";
 while((msg=reader.readLine())!=null){
 System.out.println("客户端:"+msg); //把得到的信息又返回给客户端
PrintStream print=new PrintStream(out,true); //会自动刷新和写如换行符'\n'
 print.print("我发出去了((()))");
System.out.println("我发出去了");
 }
 }
 }
 
服务端线程
 package chat;
 
import java.io.BufferedReader;
 import java.io.IOException;
 import java.io.InputStream;
 import java.io.InputStreamReader;
 import java.io.OutputStream;
 import java.io.PrintStream;
 import java.net.Socket;
 import java.util.Scanner;
 
public class ServerThread extends Thread {
 private Socket sk; //有参构造(目的:和主线程产生关系)
public ServerThread(Socket sk) {
 super();
 this.sk = sk;
 } 
}socket图形