Java网络编程,一对一聊天
**这个小任务是来自于B站,他的视频名字就是“Java实现实时聊天互动程序”**
要求:就是有2个类,其中一个客户端和一个服务端。要实现从客户端发消息,不仅在客户端,而且也要在服务端也显示。实现客户端和服务端之间的简单聊天。
代码:①----->QqFu类
import javax.swing.*;
import java.awt.*;
import java.awt.event.*;
import java.io.*;
import java.net.*;
public class QqFu extends JFrame implements ActionListener{
public static void main(String[] args){
new QqFu();
}
// 说明:一个类需要页面的显示,则那个类要继承JFrame。
// 属性
// 文本域
private JTextArea jta;
// 滚动条
private JScrollPane jsp;
// 面板里面是文本框和按钮
private JPanel jp;
private JTextField jtf;
private JButton jb ;
BufferedWriter bw = null;
// 构造器
public QqFu(){
// 初始化上面的属性
jta = new JTextArea();
// 将文本域添加到滚动条中
jsp = new JScrollPane(jta);
jp = new JPanel();
jtf =new JTextField(15);
jb = new JButton("发送");
// 把按钮和文本框添加到面板中
jp.add(jtf);
jp.add(jb);
// 把滚动条和面板添加到JFrame中去
this.add(jsp,BorderLayout.CENTER); //这个设置在中间
this.add(jp,BorderLayout.SOUTH); //南
this.setTitle("qq聊天 客户端");
this.setSize(500,500);
this.setLocation(200, 200);
this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
this.setVisible(true);
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 = "客户端对服务端说:" + text;
// 3.自己显示
jta.append(text + "\n");
try{
// 4.发送
bw.write(text);
bw.newLine(); // 换行
bw.flush(); // 刷新
// 5.清空
jtf.setText("");
}catch(IOException e1){
e1.printStackTrace();
}
}
//行为
}
代码:②----->QqMain类
import javax.swing.*;
import java.awt.*;
import java.awt.event.*;
import java.io.*;
import java.net.*;
public class QqMain extends JFrame implements ActionListener{
public static void main(String[] args){
new QqMain();
}
// 说明:一个类需要页面的显示,则那个类要继承JFrame。
// 属性
// 文本域
private JTextArea jta;
// 滚动条
private JScrollPane jsp;
// 面板里面是文本框和按钮
private JPanel jp;
private JTextField jtf;
private JButton jb ;
BufferedWriter bw = null;
// 构造器
public QqMain(){
// 初始化上面的属性
jta = new JTextArea();
// 将文本域添加到滚动条中
jsp = new JScrollPane(jta);
jp = new JPanel();
jtf =new JTextField(15);
jb = new JButton("发送");
// 把按钮和文本框添加到面板中
jp.add(jtf);
jp.add(jb);
// 把滚动条和面板添加到JFrame中去
this.add(jsp,BorderLayout.CENTER); //这个设置在中间
this.add(jp,BorderLayout.SOUTH); //南
this.setTitle("qq聊天 服务端");
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) {
if((char)e.getKeyChar()==KeyEvent.VK_ENTER) {
useVoid();
}
}
});
try{
// 1.创建一个服务端的套接字
ServerSocket serverSocket = new ServerSocket(8888);
//2.等待客户端的连接
Socket socket = serverSocket.accept();
// 3.获取socket通道的输入流(输入流的读取方式为一行一行的读取方式 ----> readLine())
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();
}
public void useVoid(){
// 1.获取文本框中的内容
String text = jtf.getText();
text = "服务端对客户端说:" + text;
// 自己显示
jta.append(text + "\n");
// 2.发送
try{
// 4.发送
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){
}*/
//行为
}
效果展示:
这里面的什么通信协议我就是照着抄的,不过在这个里面还是可以学到一些东西的,对于swing的使用吧。里面的获取输入的内容,和输出获取的内容,还用那个清空。