热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

java识别tcp中的换行_基于Java的Socket类Tcp网络编程实现实时聊天互动程序(三):回车实现数据到发送(详细代码完结)...

文章目录一、给文本框绑定事件由于回车的功能是针对文本框的,所有需要给文本框绑定一个事件。//给文本框绑定一个事件jtf.add

文章目录

一、给文本框绑定事件

由于回车的功能是针对文本框的,所有需要给文本框绑定一个事件。

//给文本框绑定一个事件

jtf.addKeyListener(this);

另外该KeyListener是一个接口,需要集成该接口。

public class ServerChatMain extends JFrame implements ActionListener, KeyListener

集成后需要重写三个方法:

@Override

public void keyPressed(KeyEvent e) {//按下

}

@Override

public void keyTyped(KeyEvent e) {//敲击

}

@Override

public void keyReleased(KeyEvent e) {//松开

}

二、重写keyPressed方法

这里需要将获取的e与回车比较,回车:`KeyEvent.VK_ENTER

此处的代码:

if(e.getKeyCode()==KeyEvent.VK_ENTER){

//代码过于冗余

//1.获取文本框中发送的内容

String text = jtf.getText();

//2.拼接需要发送的数据内容

text = "服务端对客户端说:"+text;

// 3.自己也需要显示

jta.append(text+System.lineSeparator());

try{

//4.发送

bw.write(text);

bw.newLine();

bw.flush();

//5.清空文本框内容

jtf.setText("");

}catch (IOException e1){

e1.printStackTrace();

}

//直接调用方法即可

sendDataTosocket();

}

但是考虑到这段代码多处使用,如果这么写有点冗余,所以这里单独写一个发送数据的方法sendDatasockrt

//定义一个方法,实现将数据发送到socket通道中

private void sendDataTosocket(){

//1.获取文本框中发送的内容

String text = jtf.getText();

//2.拼接需要发送的数据内容

text = "服务端对客户端说:"+text;

// 3.自己也需要显示

jta.append(text+System.lineSeparator());

try{

//4.发送

bw.write(text);

bw.newLine();

bw.flush();

//5.清空文本框内容

jtf.setText("");

}catch (IOException e1){

e1.printStackTrace();

}

}

三、所有代码

1.服务端代码

package Chat;

import javax.swing.*;

import java.awt.*;

import java.awt.event.ActionEvent;

import java.awt.event.ActionListener;

import java.awt.event.KeyEvent;

import java.awt.event.KeyListener;

import java.io.*;

import java.net.ServerSocket;

import java.net.Socket;

//如果一个类需要有界面的显示,该类需要继承JFram

//1.定义JFram窗体中的组件

//2.在构造方法初始化窗体的组件

//3.使用网络编程实现数据的传输(TCP,UDP协议)

//4.实现"发送"按钮的监听事件

//5.实现"回车键"发送数据

public class ServerChatMain extends JFrame implements ActionListener, KeyListener{

public static void main(String[] args) throws Exception {

//

new ServerChatMain();//调用构造方法

}

//属性

//文本域

private JTextArea jta;

//滚动条

private JScrollPane jsp;

//面板

private JPanel jp;

//文本框

private JTextField jtf;

//按钮

private JButton jb;

//行为

//输出流

private BufferedWriter bw = null;

//构造方法

public ServerChatMain() throws IOException {

//初始化组件

jta = new JTextArea();

//设置文本与不可编辑

jta.setEditable(false);

//注意:需要将文本框添加到滚动条中,实现滚动效果

jsp = new JScrollPane(jta);

//面板

jp = new JPanel();

//文本框

jtf = new JTextField(10);

//按钮

jb = new JButton("发送");

//注意:需要将文本框与按钮添加到面板中

jp.add(jtf);

jp.add(jb);

//注意:需要将滚动条与面板全部添加到窗体中

this.add(jsp, BorderLayout.CENTER);//放在中间

this.add(jp,BorderLayout.SOUTH);//放在最下面,上北下南

//注意:需要设置标题,大小,位置,关闭,是否可见

this.setTitle("QQ聊天服务端");

this.setSize(300,300);

this.setLocation(300,300);

this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);

this.setVisible(true);

/*******************Tcp服务端开始*********************/

//给发送按钮绑定一个监听点击事件

jb.addActionListener(this);//继承一个借口ActionListener

//给文本框绑定一个事件

jtf.addKeyListener(this);

try{

// 1.创建一个服务端的套接字

ServerSocket serverSocket = new ServerSocket(8888);

//

// 2.等待客户端的链接

Socket socket = serverSocket.accept();

// 3.获取socket通信的输入流

//InputStream in = socket.getInputStream();

BufferedReader br = new BufferedReader(new InputStreamReader(socket.getInputStream()));

String line = null;

// 4.获取socket通道的输出流

bw = new BufferedWriter(new OutputStreamWriter(socket.getOutputStream()));

//

//循环获取对象

while((line = br.readLine())!=null){

//将文本域的数据拼接到文本域中显示

jta.append(line+System.lineSeparator());

}

// 5.关闭serverSocket通道

serverSocket.close();

}catch (Exception e){

e.printStackTrace();

}

/*******************Tcp服务端开始*********************/

}

@Override

public void actionPerformed(ActionEvent e) {

sendDataTosocket();

}

@Override

public void keyPressed(KeyEvent e) {//按下

//判断是否是回车键

if(e.getKeyCode()==KeyEvent.VK_ENTER){

sendDataTosocket();

}

System.out.println(e);

}

//定义一个方法,实现将数据发送到socket通道中

private void sendDataTosocket(){

//1.获取文本框中发送的内容

String text = jtf.getText();

//2.拼接需要发送的数据内容

text = "服务端对客户端说:"+text;

// 3.自己也需要显示

jta.append(text+System.lineSeparator());

try{

//4.发送

bw.write(text);

bw.newLine();

bw.flush();

//5.清空文本框内容

jtf.setText("");

}catch (IOException e1){

e1.printStackTrace();

}

}

@Override

public void keyTyped(KeyEvent e) {//敲击

}

@Override

public void keyReleased(KeyEvent e) {//松开

}

}

2.客户端所有代码

package Chat;

import javax.swing.*;

import java.awt.*;

import java.awt.event.ActionEvent;

import java.awt.event.ActionListener;

import java.awt.event.KeyEvent;

import java.awt.event.KeyListener;

import java.io.BufferedReader;

import java.io.BufferedWriter;

import java.io.InputStreamReader;

import java.io.OutputStreamWriter;

import java.net.Socket;

//如果一个类需要有界面的显示,该类需要继承JFram

//1.定义JFram窗体中的组件

//2.在构造方法初始化窗体的组件

public class ClientChatMain extends JFrame implements ActionListener, KeyListener {

public static void main(String[] args) {

//

new ClientChatMain();//调用构造方法

}

//属性

//文本域

private JTextArea jta;

//滚动条

private JScrollPane jsp;

//面板

private JPanel jp;

//文本框

private JTextField jtf;

//按钮

private JButton jb;

//行为

//定义输出流

private BufferedWriter bw = null;

//构造方法

public ClientChatMain(){

//初始化组件

jta = new JTextArea();

//设置文本与不可编辑

jta.setEditable(false);

//注意:需要将文本框添加到滚动条中,实现滚动效果

jsp = new JScrollPane(jta);

//面板

jp = new JPanel();

//文本框

jtf = new JTextField(10);

//按钮

jb = new JButton("发送");

//注意:需要将文本框与按钮添加到面板中

jp.add(jtf);

jp.add(jb);

//注意:需要将滚动条与面板全部添加到窗体中

this.add(jsp, BorderLayout.CENTER);//放在中间

this.add(jp,BorderLayout.SOUTH);//放在最下面,上北下南

//注意:需要设置标题,大小,位置,关闭,是否可见

this.setTitle("QQ聊天客户端");

this.setSize(300,300);

this.setLocation(300,300);

this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);

this.setVisible(true);

/*******************Tcp服务端开始*********************/

//给发送按钮绑定一个监听事件

jb.addActionListener(this);

//给文本框绑定一个事件

jtf.addKeyListener(this);

try{

// 1.创建一个客户端的套接字(尝试链接)

Socket socket = new Socket("127.0.0.1",8888);

// 2.获取socket通信的输入流

BufferedReader br = new BufferedReader(new InputStreamReader(socket.getInputStream()));

// 3.获取socket通道的输出流

bw = new BufferedWriter(new OutputStreamWriter(socket.getOutputStream()));

//循环读取数据,并拼接到文本域中

String line = null;

while((line = br.readLine())!=null){

jta.append(line+System.lineSeparator());

}

// 4.关闭socket通道

socket.close();

}catch (Exception e){

e.printStackTrace();

}

/*******************Tcp服务端开始*********************/

}

@Override

public void actionPerformed(ActionEvent e) {

sendDatesocket();

}

@Override

public void keyPressed(KeyEvent e) {

if(e.getKeyCode() == KeyEvent.VK_ENTER){

sendDatesocket();

}

}

//定义一个方法

private void sendDatesocket(){

//1.获取文本框中需要发送的数据内容

String text = jtf.getText();

//2.拼接内容

text = "客户端对服务端说:" + text;

//3.自己显示

jta.append(text+System.lineSeparator());

try{

//4.发送

bw.write(text);

bw.newLine();

bw.flush();

//5.清空文本框内容

jtf.setText("");

}catch (Exception e2){

e2.printStackTrace();

}

}

@Override

public void keyTyped(KeyEvent e) {

}

@Override

public void keyReleased(KeyEvent e) {

}

}

四、总结

至此,关于实时聊天互动的程序全部结束,基本实现来目标功能,当然后期还可以可以再次基础之上加一点新的内容。喜欢的记得点个赞再走哦

mac版本的图案就是不错哦,哈哈哈!

b1f8c0a2b42a var cpro_id = "u6885494";

推荐阅读
  • Iamtryingtomakeaclassthatwillreadatextfileofnamesintoanarray,thenreturnthatarra ... [详细]
  • Java太阳系小游戏分析和源码详解
    本文介绍了一个基于Java的太阳系小游戏的分析和源码详解。通过对面向对象的知识的学习和实践,作者实现了太阳系各行星绕太阳转的效果。文章详细介绍了游戏的设计思路和源码结构,包括工具类、常量、图片加载、面板等。通过这个小游戏的制作,读者可以巩固和应用所学的知识,如类的继承、方法的重载与重写、多态和封装等。 ... [详细]
  • 在Android开发中,使用Picasso库可以实现对网络图片的等比例缩放。本文介绍了使用Picasso库进行图片缩放的方法,并提供了具体的代码实现。通过获取图片的宽高,计算目标宽度和高度,并创建新图实现等比例缩放。 ... [详细]
  • 向QTextEdit拖放文件的方法及实现步骤
    本文介绍了在使用QTextEdit时如何实现拖放文件的功能,包括相关的方法和实现步骤。通过重写dragEnterEvent和dropEvent函数,并结合QMimeData和QUrl等类,可以轻松实现向QTextEdit拖放文件的功能。详细的代码实现和说明可以参考本文提供的示例代码。 ... [详细]
  • 本文分享了一个关于在C#中使用异步代码的问题,作者在控制台中运行时代码正常工作,但在Windows窗体中却无法正常工作。作者尝试搜索局域网上的主机,但在窗体中计数器没有减少。文章提供了相关的代码和解决思路。 ... [详细]
  • Spring特性实现接口多类的动态调用详解
    本文详细介绍了如何使用Spring特性实现接口多类的动态调用。通过对Spring IoC容器的基础类BeanFactory和ApplicationContext的介绍,以及getBeansOfType方法的应用,解决了在实际工作中遇到的接口及多个实现类的问题。同时,文章还提到了SPI使用的不便之处,并介绍了借助ApplicationContext实现需求的方法。阅读本文,你将了解到Spring特性的实现原理和实际应用方式。 ... [详细]
  • 本文讨论了一个关于cuowu类的问题,作者在使用cuowu类时遇到了错误提示和使用AdjustmentListener的问题。文章提供了16个解决方案,并给出了两个可能导致错误的原因。 ... [详细]
  • 1,关于死锁的理解死锁,我们可以简单的理解为是两个线程同时使用同一资源,两个线程又得不到相应的资源而造成永无相互等待的情况。 2,模拟死锁背景介绍:我们创建一个朋友 ... [详细]
  • 《数据结构》学习笔记3——串匹配算法性能评估
    本文主要讨论串匹配算法的性能评估,包括模式匹配、字符种类数量、算法复杂度等内容。通过借助C++中的头文件和库,可以实现对串的匹配操作。其中蛮力算法的复杂度为O(m*n),通过随机取出长度为m的子串作为模式P,在文本T中进行匹配,统计平均复杂度。对于成功和失败的匹配分别进行测试,分析其平均复杂度。详情请参考相关学习资源。 ... [详细]
  • 本文介绍了lua语言中闭包的特性及其在模式匹配、日期处理、编译和模块化等方面的应用。lua中的闭包是严格遵循词法定界的第一类值,函数可以作为变量自由传递,也可以作为参数传递给其他函数。这些特性使得lua语言具有极大的灵活性,为程序开发带来了便利。 ... [详细]
  • android listview OnItemClickListener失效原因
    最近在做listview时发现OnItemClickListener失效的问题,经过查找发现是因为button的原因。不仅listitem中存在button会影响OnItemClickListener事件的失效,还会导致单击后listview每个item的背景改变,使得item中的所有有关焦点的事件都失效。本文给出了一个范例来说明这种情况,并提供了解决方法。 ... [详细]
  • Java容器中的compareto方法排序原理解析
    本文从源码解析Java容器中的compareto方法的排序原理,讲解了在使用数组存储数据时的限制以及存储效率的问题。同时提到了Redis的五大数据结构和list、set等知识点,回忆了作者大学时代的Java学习经历。文章以作者做的思维导图作为目录,展示了整个讲解过程。 ... [详细]
  • 本文介绍了OC学习笔记中的@property和@synthesize,包括属性的定义和合成的使用方法。通过示例代码详细讲解了@property和@synthesize的作用和用法。 ... [详细]
  • 本文主要解析了Open judge C16H问题中涉及到的Magical Balls的快速幂和逆元算法,并给出了问题的解析和解决方法。详细介绍了问题的背景和规则,并给出了相应的算法解析和实现步骤。通过本文的解析,读者可以更好地理解和解决Open judge C16H问题中的Magical Balls部分。 ... [详细]
  • [大整数乘法] java代码实现
    本文介绍了使用java代码实现大整数乘法的过程,同时也涉及到大整数加法和大整数减法的计算方法。通过分治算法来提高计算效率,并对算法的时间复杂度进行了研究。详细代码实现请参考文章链接。 ... [详细]
author-avatar
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有