运行之后 服务端给客户端发消息 客户端接收不到服务端的消息 服务端可以接收到客户端的消息 求助!!
服务端代码:
package Chat;
import javax.swing.*;
import java.awt.*;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.io.*;
import java.net.ServerSocket;
import java.net.Socket;
//如果一个类需要有界面的显示,那么该类就需要继承自JFrame,并被称为"窗体类"。
//1.定义JFrame窗体中的组件
//2.在构造方法中初始化窗体的组件
//3.使用网络编程完成数据的传输(TCP,UDP 协议)
//4.实现发送按钮的监听点击事件
public class ServerChatMain extends JFrame implements ActionListener{
public static void main(String[] args) {
//调用构造方法
new ServerChatMain();
}
//属性
//文本域
private JTextArea jta;
//滚动条
private JScrollPane jsp;
//面板
private JPanel jp;
//文本框
private JTextField jtf;
//按钮
private JButton jb;
//输出流
private BufferedWriter bw = null;
//构造方法
public ServerChatMain(){
//初始化组件
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("聊天室服务端");
this.setSize(300,300);
this.setLocation(300,300);
this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
this.setVisible(true);
//TCP服务端开始
//给发送按钮绑定一个监听点击事件
jb.addActionListener(this);
try{
//1.创建服务端套接字
ServerSocket serverSocket= new ServerSocket(8888);
//2.等待服务端的连接
Socket socket = serverSocket.accept();
//3.获取Socket通道输入流(使用BufferedReader实现每行读取)
//InputStream in= socket.getInputStream();
BufferedReader br = new BufferedReader(new InputStreamReader(socket.getInputStream()));
//4. 获取Socket通道输出流(使用BufferedWriter实现刷新和换行)
//当用户需要点击发送按钮的时候需要写出数据
bw = new BufferedWriter(new OutputStreamWriter(socket.getOutputStream()));
//循环读取数据,并拼接到文本域中
String line = null;
while((line=br.readLine())!=null){
//将读取的数据拼接到文本域中显示
jta.append(line+System.lineSeparator());
}
//5.关闭ServerSocket通道
serverSocket.close();
}catch (IOException e){
e.printStackTrace();
}
//TCP服务端结束
}
@Override
public void actionPerformed(ActionEvent e){
//System.out.println("发送按钮被点击了");
//1.获取文本框中发送的内容
String text =jtf.getText();
//2.拼接需要发送的内容
text ="服务端对客户端说:"+text;
jta.append(text+System.lineSeparator() );
//3.发送
try {
bw.write(text);
bw.newLine();
bw.flush();
//4.清空文本框内容
jtf.setText("");
} catch (IOException e1) {
e1.printStackTrace();
}
}
}
客户端代码:
package Chat;
import javax.swing.*;
import java.awt.*;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.io.*;
import java.net.Socket;
//如果一个类需要有界面的显示,那么该类就需要继承自JFrame,并被称为"窗体类"。
//1.定义JFrame窗体中的组件
//2.在构造方法中初始化窗体的组件
public class ClientChatMain extends JFrame implements ActionListener {
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("聊天室客户端");
this.setSize(300, 300);
this.setLocation(300, 300);
this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
this.setVisible(true);
//TCP客户端开始
//给发送按钮绑定一个监听点击事件
jb.addActionListener(this);
try {
//1.创建客户端套接字(尝试连接)
Socket socket = new Socket( "192.168.1.106",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){
//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 ex) {
ex.printStackTrace();
}
}
}