运行截图:

JavaSwing实现网络聊天程序_javaswing

代码
客户端:

package Socket_Thread.heimaLiaotian;
import javax.swing.*;
import java.awt.*;
import java.awt.event.*;
import java.io.*;
import java.net.*;
//此时,该类被称为窗体类
//1,定义组件
//2,初始化组件
public class Client extends JFrame implements ActionListener{
public static void main(String[] args){
new Client();
}
// 说明:一个类需要页面的显示,则那个类要继承JFrame。
// 属性
// 文本域
private JTextArea jta;
// 滚动条
private JScrollPane jsp;
// 面板里面是文本框和按钮
private JPanel jp;
private JTextField jtf;
private JButton jb ;
//输出流
private BufferedWriter bw = null;

// 构造器
public Client(){

// 初始化上面的属性
jta = new JTextArea();

// 将文本域添加到滚动条中
jsp = new JScrollPane(jta);
jp = new JPanel();
jtf =new JTextField(15);
jb = new JButton("send");

// 把按钮和文本框添加到面板中
jp.add(jtf);
jp.add(jb);

// 把滚动条和面板添加到JFrame中去。因为这个类继承了窗体,所以我就是窗体,所以this就是窗体
this.add(jsp,BorderLayout.CENTER); //这个设置在中间
this.add(jp,BorderLayout.SOUTH); //南

this.setTitle("client");
this.setSize(500,500);
this.setLocation(200, 200);
this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
this.setVisible(true);
//这个this,去掉也可以
jb.addActionListener(this);

// 回车点击事件

jtf.addKeyListener(new KeyAdapter() {
public void keyTyped(KeyEvent e) {
if((char)e.getKeyChar()==KeyEvent.VK_ENTER) {
useVoid01();
}
}
});

try{
/*******客户端 TCP协议*********/
// 1.创建一个客户端的套接字(尝试连接)
Socket socket = new Socket("127.0.0.1",8888);

// 2.获取socket通道的输入流
BufferedReader br = new BufferedReader(new InputStreamReader(socket.getInputStream()));

// 3 字符缓冲流(字符输出流(套接字输出数据))
bw = new BufferedWriter(new OutputStreamWriter(socket.getOutputStream()));


//循环读取数据,并拼接到文本域中
String line = null;
while((line = br.readLine()) !=null){
jta.append(line + "\n");
}

// 3. 获取输出流

// 4.关闭流
socket.close();

/******************************/
}catch(Exception e){
e.printStackTrace();
}
}

//发送数据
public void actionPerformed(ActionEvent e){
useVoid01();
}

public void useVoid01(){
// 1.获取文本框中需要发送的内容
String text = jtf.getText();
// 2. 拼接内容
text = "client:" + text;

// 3.自己显示
jta.append(text + "\n");

try{
// 4.发送
bw.write(text);
bw.newLine(); // 换行
bw.flush(); // 刷新
// 5.清空
jtf.setText("");

}catch(IOException e1){
e1.printStackTrace();
}

}
//行为
}

服务器端:

package Socket_Thread.heimaLiaotian;

import javax.swing.*;
import java.awt.*;
import java.awt.event.*;
import java.io.*;
import java.net.*;

//此时,该类被称为窗体类
//1,定义组件
//2,初始化组件
//3,使用网络编程完成数据传输(tcp、udp)
//4,发送按钮的监听点击事件
//
//在这个界面上,添加修改xml文件的内容,通过输入东西到对话框,然后进行修改

//在这个上面,添加
public class Server extends JFrame implements ActionListener{

public static void main(String[] args){
new Server();
}

// 说明:一个类需要页面的显示,则那个类要继承JFrame。
// 属性
// 文本域
private JTextArea jta;
// 滚动条
private JScrollPane jsp;
// 面板里面是文本框和按钮
private JPanel jp;
private JTextField jtf;
private JButton jb;
//输出流
private BufferedWriter bw = null;

// 构造器
public Server(){

// 初始化上面的属性
jta = new JTextArea();
//设置文本域不可编辑
jta.setEditable(false);
// 将文本域添加到滚动条中
jsp = new JScrollPane(jta);
jp = new JPanel();
jtf =new JTextField(15);
jb = new JButton("send");

// 把按钮和文本框添加到面板中
jp.add(jtf);
jp.add(jb);
// 把滚动条和面板添加到JFrame中去
this.add(jsp,BorderLayout.CENTER); //这个设置在中间
this.add(jp,BorderLayout.SOUTH); //南

this.setTitle("server");
this.setSize(500,500);
this.setLocation(200, 200);
this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
this.setVisible(true);

/***********TCP协议*************/
jb.addActionListener(this); // 这是按钮点击使用, 让当前对象去监听
// 回车键的监听事件 在接口KeyListener中
//jtf.addKeyListener(this);

//给文本框绑定一个键盘绑定事件
jtf.addKeyListener(new KeyAdapter() { //键盘输入事件
public void keyTyped(KeyEvent e) {
//sout(e)观察其内容
if((char)e.getKeyChar()==KeyEvent.VK_ENTER) {
useVoid();
}
}
});

try{
// 1.创建一个服务端的套接字
ServerSocket serverSocket = new ServerSocket(8888);
//2.等待客户端的连接
Socket socket = serverSocket.accept();
// 3.获取socket通道的输入流(输入流的读取方式为一行一行的读取方式 ----> readLine())
// InputStream in = socket.getInputStream();

//字符缓冲(字符流(套接字接收数据))
BufferedReader br = new BufferedReader(new InputStreamReader(socket.getInputStream()));

// 4.获取通道的输入流(也是一行一行的写出 BufferedWriter ->newLine())

// 当用户点击“发送”按钮的时候才会,写出数据
bw = new BufferedWriter(new OutputStreamWriter(socket.getOutputStream()));
//循环读取数据,并拼接到文本域中
String line = null;
while((line = br.readLine())!=null){
// 将读取的数据拼接到文本域中显示
jta.append(line + "\n");
}
// 5.关闭socket通道
serverSocket.close();

}catch(IOException e){
e.printStackTrace();
}
/************************/
}

// 点击按钮所实现的方法,获取,发送
public void actionPerformed(ActionEvent e){
//按钮,用来获取文本内容,然后发送
useVoid();
}

//sendDataToSocket()
public void useVoid(){
// 1.获取文本框中的内容
String text = jtf.getText();

text = "server:" + text;
// 自己显示
jta.append(text + "\n");

// 2.发送
try{
// 4.发送,用bufferwrite去发,所以要将,局部变量变成成员变量
bw.write(text);
bw.newLine(); // 换行
bw.flush(); // 刷新
// 5.清空文本框
jtf.setText("");
}catch (IOException e1){
e1.printStackTrace();
}
}

/*public void KeyPressed(KeyEvent e){
//回车键
System.out.println("按钮数字");
}

public void KeyTyped(KeyEvent e){
}

public void KeyReleased(KeyEvent e){
}*/
//行为
}

参考链接:
​​​demo1教程视频​​​​demo1​


这个是输入输出流的其中一种
​​​Java DataOutputStream类​