java课程要实现一个简单的聊天功能,在本机上的客户端一直没有办法接收到服务端发出的信息,求指点?

import java.io.BufferedReader;
import java.io.InputStreamReader;
import java.io.IOException;
import java.io.PrintWriter;
import java.net.ServerSocket;
import java.net.Socket;
import java.awt.BorderLayout;
import java.awt.Color;
import java.awt.Container;
import java.awt.EventQueue;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.event.FocusEvent;
import java.awt.event.FocusListener;
import java.io.IOException;
import java.net.Socket;
import javax.swing.JFrame;
import javax.swing.JOptionPane;
import javax.swing.JScrollPane;
import javax.swing.JTextArea;
import javax.swing.JTextField;
import javax.swing.border.BevelBorder;
import static java.lang.System.out;
import java.awt.BorderLayout;
import java.awt.Container;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;

public class MyTcp extends JFrame{
    
    private BufferedReader reader;
    private PrintWriter writer;
    private ServerSocket server;
    private Socket socket;
    private JTextArea ta=new JTextArea();
    private JTextField tf=new JTextField();
    Container cc;
    //服务端
    public MyTcp(String title) {
        super(title);
        setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        cc=this.getContentPane();
        
        final JScrollPane scrollPane=new JScrollPane();
        scrollPane.setBorder(new BevelBorder(BevelBorder.RAISED));
        getContentPane().add(scrollPane,BorderLayout.CENTER);
        scrollPane.setViewportView(ta);
        cc.add(tf,"South");
      //焦点监听器
        class JTextFieldListener implements FocusListener{
            
            private String hintText;          //提示文字
            private JTextField textField;
            
            public JTextFieldListener(JTextField textField,String hintText) {
                this.textField=textField;
                this.hintText=hintText;
                textField.setText(hintText);   //默认直接显示
                textField.setForeground(Color.GRAY);
            }

            @Override
            public void focusGained(FocusEvent e) {
                
                //获取焦点时,清空提示内容
                String temp=textField.getText();
                if(temp.equals(hintText)){
                    textField.setText("");
                    textField.setForeground(Color.BLACK);
                }
                
            }

            @Override
            public void focusLost(FocusEvent e) {
                
                //失去焦点时,没有输入内容,显示提示内容
                String temp=textField.getText();
                if(temp.equals("")) {
                    textField.setForeground(Color.GRAY);
                    textField.setText(hintText);
                }
                
            }
            
        }
        tf.addFocusListener(new JTextFieldListener(tf,"请在此输入内容"));
        tf.addActionListener(new ActionListener() {
            public void actionPerformed(ActionEvent e) {
                if(tf.getText().isEmpty()) {
                    JOptionPane.showMessageDialog(MyTcp.this, "请输入内容!");
                }else {                                    
                    	writer.println(tf.getText());
                        ta.append("服务端发送:"+tf.getText()+"\n");                    
                        ta.setSelectionEnd(ta.getText().length());
                        tf.setText("");								
                }
                
                
            }
        });
        
}
    
    
    void getServer(){
        try {
            server=new ServerSocket(8998);        //实例化Socket对象
            ta.append("服务器套接字已创建成功\n");
            
            while(true) {
            	ta.append("等待客户机的连接\n");
                socket=server.accept();           //accept()方法会返回一个和客户端Socket对象相连的Socket对象
                reader=new BufferedReader(new InputStreamReader(socket.getInputStream()));
                writer=new PrintWriter(socket.getOutputStream(),true);
                
                getClientMessage(reader,writer);
            }
        }catch(Exception e) {
            e.printStackTrace();
        }
    }
    
    //读取客户端发送过来的信息
    private void getClientMessage(BufferedReader sin,PrintWriter os) {
        try {
            while(true) {
                //获得客户端信息
                ta.append("客户机:"+reader.readLine()+"\n");
                ta.setSelectionEnd(ta.getText().length());
                tf.setText("");								

            }
        }catch(Exception e) {
            e.printStackTrace();
        }
        try {
            if(reader!=null) {
                reader.close();
            }
            if(socket!=null) {
                socket.close();
            }
        }catch(Exception e) {
            e.printStackTrace();
        }
    }

    
    public static void main(String[] args) {
        MyTcp tcp=new  MyTcp("向客户端发送数据");
        tcp.setSize(400, 400);
        tcp.setVisible(true);
        tcp.getServer();
    }

}
import java.awt.BorderLayout;
import java.awt.Color;
import java.awt.Container;
import java.awt.EventQueue;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.event.FocusEvent;
import java.awt.event.FocusListener;
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.PrintWriter;
import java.net.ServerSocket;
import java.net.Socket;
import static java.lang.System.out;
import javax.swing.JFrame;
import javax.swing.JOptionPane;
import javax.swing.JScrollPane;
import javax.swing.JTextArea;
import javax.swing.JTextField;
import javax.swing.border.BevelBorder;
//客户端

public class MyClient extends JFrame{
    
    private PrintWriter writer;
    private BufferedReader reader;
    private ServerSocket server;
    Socket socket;
    private JTextArea ta=new JTextArea();
    private JTextField tf=new JTextField();
    Container cc;
    
    
    public MyClient(String title) {
        super(title);
        setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        cc=this.getContentPane();
        
        final JScrollPane scrollPane=new JScrollPane();
        scrollPane.setBorder(new BevelBorder(BevelBorder.RAISED));
        getContentPane().add(scrollPane,BorderLayout.CENTER);
        scrollPane.setViewportView(ta);
        cc.add(tf,"South");
      //焦点监听器
        class JTextFieldListener implements FocusListener{
            
            private String hintText;          //提示文字
            private JTextField textField;
            
            public JTextFieldListener(JTextField textField,String hintText) {
                this.textField=textField;
                this.hintText=hintText;
                textField.setText(hintText);   //默认直接显示
                textField.setForeground(Color.GRAY);
            }

            @Override
            public void focusGained(FocusEvent e) {
                
                //获取焦点时,清空提示内容
                String temp=textField.getText();
                if(temp.equals(hintText)){
                    textField.setText("");
                    textField.setForeground(Color.BLACK);
                }
                
            }

            @Override
            public void focusLost(FocusEvent e) {
                
                //失去焦点时,没有输入内容,显示提示内容
                String temp=textField.getText();
                if(temp.equals("")) {
                    textField.setForeground(Color.GRAY);
                    textField.setText(hintText);
                }
                
            }
            
        }
        
        tf.addFocusListener(new JTextFieldListener(tf,"请在此输入内容"));
        tf.addActionListener(new ActionListener() {
            public void actionPerformed(ActionEvent e) {
                if(tf.getText().isEmpty()) {
                    JOptionPane.showMessageDialog(MyClient.this, "请输入内容!");
                }else {                                    
                    	writer.println(tf.getText());
                        ta.append("客户发送:"+tf.getText()+"\n");                    
                        ta.setSelectionEnd(ta.getText().length());
                        tf.setText("");								
                }
                
                
            }
        });
}
    
  
    
   
    
     void connect() {
        ta.append("尝试连接\n");
        try {
        	
        		socket=new Socket("127.0.0.1",8998);
                BufferedReader sin=new BufferedReader(new InputStreamReader(System.in));
                ta.append("完成连接\n");
                	 writer=new PrintWriter(socket.getOutputStream());
                     reader=new BufferedReader(new InputStreamReader(socket.getInputStream()));
                     //getServerMessage(reader,writer);去掉注释后窗口无法打开
                
                
                
            
        }catch(Exception e) {
            e.printStackTrace();
        }
    }
    
  //读取服务端发送过来的信息
    private void getServerMessage(BufferedReader sin,PrintWriter os) {
        try {
            while(true) {
                //获得客户端信息
                ta.append("服务机:"+reader.readLine()+"\n");
                ta.setSelectionEnd(ta.getText().length());
                tf.setText("");								

            }
        }catch(Exception e) {
            e.printStackTrace();
        }
    }
        
    public static void main(String[] args) {
        
        //EventQueue事件队列,封装了异步事件指派机制
        EventQueue.invokeLater(new Runnable(){
            public void run() {
                MyClient client=new MyClient("向服务器发送数据");
                client.setSize(400,400);
                client.setVisible(true);
                client.connect();
                         
            }
        });

    }

}

 

//获得客户端信息ta.append("客户机:"+reader.readLine()+"\n");ta.setSelectionEnd(ta.getText().length());

tf.setText("");

服务端这句代码,并没有把客户端发送的消息显示在对应组件上。

您好,我是有问必答小助手,您的问题已经有小伙伴解答了,您看下是否解决,可以追评进行沟通哦~

如果有您比较满意的答案 / 帮您提供解决思路的答案,可以点击【采纳】按钮,给回答的小伙伴一些鼓励哦~~

ps: 问答会员【8折】购 ,仅需→¥23.2,即可享受5次/月 有问必答服务,了解详情>>>https://t.csdnimg.cn/RW5m