Java网络编程,一对一聊天

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的使用吧。里面的获取输入的内容,和输出获取的内容,还用那个清空。

  • 37
    点赞
  • 157
    收藏
    觉得还不错? 一键收藏
  • 24
    评论
私聊优化可以通过以下几个步骤来实现: 1. 添加私聊功能:在聊天室中,每个客户端都有一个唯一的标识符,可以使用该标识符来实现私聊功能。当一个客户端想要与另一个客户端进行私聊时,它可以发送一个特定的命令或指令给服务器,服务器将该指令解析并将消息转发给目标客户端。 2. 实现私聊命令:在客户端中,可以添加一个输入框或命令行界面,允许用户输入私聊命令。例如,用户可以输入"/private username message"来发送私聊消息给指定的用户名。 3. 在服务器端处理私聊消息:服务器接收到私聊命令后,需要解析命令并将消息转发给目标客户端。服务器可以维护一个客户端列表,包含每个客户端的标识符和对应的网络连接。当接收到私聊命令时,服务器可以根据目标用户名查找对应的客户端,并将消息发送给目标客户端。 4. 在客户端接收私聊消息:目标客户端接收到私聊消息后,可以在界面上显示该消息,并标识出发送者的用户名。 通过以上步骤,可以实现一个简单的私聊功能,使得聊天室中的用户可以进行一对一的私密对话。请注意,以上只是一个简单的实现示例,实际的私聊功能可能需要更复杂的逻辑和处理。\[1\] #### 引用[.reference_title] - *1* [Java网络编程——基于UDP协议的聊天室](https://blog.csdn.net/qq_52223733/article/details/125822360)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v91^control,239^v3^insert_chatgpt"}} ] [.reference_item] [ .reference_list ]

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 24
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值