Java实现简易聊天室


Java实现简易聊天室

在学习《Java从入门到精通》这本书,网络通信,基于TCP实现的简易聊天室,我这里对书中的代码略做了修改,做个记录。

 

这里先放一下运行效果图,代码放在最后。

 

运行效果:

先启动服务器端:

 

 

启动客户端:

 

 发送数据:

 

 

 主要的功能就是上面那些,在代码中我还添加一些功能,比如说给JTextField添加了焦点监听器,以及输入框为空的检查和提示,但总的来说还是比较简单,如果要实现健壮的聊天室程序还需要再做些修改。

 

下面放下代码,比较简单,就服务器端和客户端两个代码。

 

服务器端代码:

import java.io.BufferedReader; import java.io.InputStreamReader; import java.net.ServerSocket; import java.net.Socket; import static java.lang.System.out; public class MyTcp { private BufferedReader reader; private ServerSocket server; private Socket socket; void getServer(){ try { server=new ServerSocket(8998);        //实例化Socket对象
            out.println("服务器套接字已创建成功"); while(true) { out.println("等待客户机的连接"); socket=server.accept();           //accept()方法会返回一个和客户端Socket对象相连的Socket对象
                reader=new BufferedReader(new InputStreamReader(socket.getInputStream())); getClientMessage(); } }catch(Exception e) { e.printStackTrace(); } } //读取客户端发送过来的信息
    private void getClientMessage() { try { while(true) { //获得客户端信息
                out.println("客户机:"+reader.readLine()); } }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.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.PrintWriter; 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; public class MyClient extends JFrame{ private PrintWriter writer; 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"); 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(""); } } }); } //焦点监听器
    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); } } } private void connect() { ta.append("尝试连接\n"); try { socket=new Socket("127.0.0.1",8998); writer=new PrintWriter(socket.getOutputStream(),true); ta.append("完成连接\n"); }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(); } }); } }

 

 

启动的时候要注意先启动服务器端再启动客户端,不然会报错。

 

 

 

 

 

菜鸟还需要不断学习。

 


免责声明!

本站转载的文章为个人学习借鉴使用,本站对版权不负任何法律责任。如果侵犯了您的隐私权益,请联系本站邮箱yoyou2525@163.com删除。



 
粤ICP备18138465号  © 2018-2025 CODEPRJ.COM