用JAVA编程C/S聊天程序

看了一些socket的文章,正好可以用JAVA来尝试,想写一个GUI的点对点聊天程序。
于是赶了两天,断断续续,其中出现一些小波折,毕竟写程序还是需要耐心。
刚写好的GUI界面,因为流传输的问题,而且界面也不是很满意,于是索性将两个写好的类删掉了。重新来写,感觉好了许多。
程序其实是C/S模型的,分为服务端和客户端,现在将代码贴上来,分享一下创作经历。

  1. //服务端程序
  2. import java.io.*;
  3. import java.net.*;
  4. import java.awt.*;
  5. import java.awt.event.*;
  6. import javax.swing.*;
  7. public class Server extends JFrame implements ActionListener {
  8. ServerSocket server;
  9. Socket socket;
  10. BufferedReader in;
  11. PrintWriter out;
  12. JTextField sendText = new JTextField();;
  13. JTextArea recieveText = new JTextArea(520);
  14. JScrollPane scrollpane = new JScrollPane(recieveText);
  15. JLabel label1 = new JLabel("发送内容:");
  16. JLabel label2 = new JLabel("接收内容:");
  17. JButton btnSend = new JButton("发送");
  18. JButton btnClean = new JButton("清除内容");
  19. public Server() {
  20.   // TODO Auto-generated constructor stub
  21.   super("服务端");
  22.   Container c = getContentPane();
  23.   c.setLayout(new GridLayout(6155));
  24.   c.add(label1);
  25.   c.add(sendText);
  26.   c.add(label2);
  27.   c.add(scrollpane);
  28.   c.add(btnSend);
  29.   c.add(btnClean);
  30.   btnSend.addActionListener(this);
  31.   btnClean.addActionListener(this);
  32.   setSize(400400);
  33.   setDefaultCloseOperation(Server.EXIT_ON_CLOSE);
  34.   setVisible(true);
  35.   try {
  36.    socket = new Socket();// 创建套接字
  37.    server = new ServerSocket(5005);// 创建服务器端套接字,指定端口为5005
  38.    socket = server.accept();// 让套接字侦听来自客户端的请求
  39.    in = new BufferedReader(new InputStreamReader(socket
  40.      .getInputStream()));// 封装来自套接字的输入流,使其变成字符流
  41.    out = new PrintWriter(socket.getOutputStream());// 生成格式化的套接字输出流的对象
  42.    while (true) {
  43.     String s = in.readLine();// 读取套接字输入流的字符
  44.     recieveText.append("客户机:" + s + "/n/r");
  45.    }// 在文本框中追加服务器端发来的数据
  46.   } catch (IOException e) {
  47.    // TODO Auto-generated catch block
  48.    e.printStackTrace();
  49.   }
  50. }
  51. /**
  52.   * @param args
  53.   */
  54. public static void main(String[] args) {
  55.   // TODO Auto-generated method stub
  56.   new Server();
  57. }
  58. public void actionPerformed(ActionEvent e) {
  59.   // TODO Auto-generated method stub
  60.   if (e.getSource() == btnClean) {
  61.    sendText.setText("");
  62.    recieveText.setText("");// 清空文本框的内容
  63.   } else if (e.getSource() == btnSend) {
  64.    out.println(sendText.getText());// 向套接字输出流输入来自发送文本框的数据
  65.    out.flush();// 刷新该缓冲流
  66.   }
  67. }
  68. }
  69. //客户端程序
  70. import java.io.*;
  71. import java.net.InetAddress;
  72. import java.net.ServerSocket;
  73. import java.net.Socket;
  74. import java.awt.*;
  75. import java.awt.event.*;
  76. import javax.swing.*;
  77. public class Client extends JFrame implements ActionListener {
  78. Socket socket;
  79. BufferedReader in;
  80. PrintWriter out;
  81. JTextField sendText = new JTextField();;
  82. JTextArea recieveText = new JTextArea(520);
  83. JScrollPane scrollpane = new JScrollPane(recieveText);
  84. JLabel label1 = new JLabel("发送内容:");
  85. JLabel label2 = new JLabel("接收内容:");
  86. JButton btnSend = new JButton("发送");
  87. JButton btnClean = new JButton("清除内容");
  88. public Client() {
  89.   // TODO Auto-generated constructor stub
  90.   super("客户端");
  91.   Container c = getContentPane();
  92.   c.setLayout(new GridLayout(6155));
  93.   c.add(label1);
  94.   c.add(sendText);
  95.   c.add(label2);
  96.   c.add(scrollpane);
  97.   c.add(btnSend);
  98.   c.add(btnClean);
  99.   btnSend.addActionListener(this);
  100.   btnClean.addActionListener(this);
  101.   setSize(400400);
  102.   setDefaultCloseOperation(Server.EXIT_ON_CLOSE);
  103.   setVisible(true);
  104.   try {
  105.    socket = new Socket(InetAddress.getLocalHost(), 5005);// 创建套接字,指定地址和端口
  106.    in = new BufferedReader(new InputStreamReader(socket
  107.      .getInputStream()));// 封装来自套接字的输入流,使其变成字符流
  108.    out = new PrintWriter(socket.getOutputStream());// 生成格式化的套接字输出流的对象
  109.    while (true) {
  110.     String s = in.readLine();// 读取套接字输入流的字符
  111.     recieveText.append("服务器:" + s + "/n/r");// 在文本框中追加服务器端发来的数据
  112.    }
  113.   } catch (IOException e) {
  114.    e.printStackTrace();
  115.   }
  116. }
  117. /**
  118.   * @param args
  119.   */
  120. public static void main(String[] args) {
  121.   // TODO Auto-generated method stub
  122.   new Client();
  123. }
  124. public void actionPerformed(ActionEvent e) {
  125.   // TODO Auto-generated method stub
  126.   if (e.getSource() == btnClean) {
  127.    sendText.setText("");// 清空文本框的内容
  128.    recieveText.setText("");
  129.   } else if (e.getSource() == btnSend) {
  130.    out.println(sendText.getText());// 向套接字输出流输入来自发送文本框的数据
  131.    out.flush();// 刷新该流的缓冲
  132.   }
  133. }
  134. }
  • 1
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值