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

文章目录

一、给文本框绑定事件

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

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

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

image.png


版权声明:本文为weixin_29585933原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接和本声明。