基于Java Socket实现一个简易在线聊天功能(一)

时间:2021-07-20 21:43:16

最近做了一个项目,其中有一个在线网页交流的需求,好久没写代码了,手都生疏了,于是先写demo练练手,分享到服务器之家平台,以此做个记录,方便自己和大家使用。

先给大家说下实现步骤分这样几大步:

1、使用awt组件和socket实现简单的单客户端向服务端持续发送消息;

2、结合线程,实现多客户端连接服务端发送消息;

3、实现服务端转发客户端消息至所有客户端,同时在客户端显示;

4、把awt组件生成的窗口界面改成前端jsp或者html展示的界面,java socket实现的客户端改为前端技术实现。

这里首先实现第一步的简单功能,难点在于:

1、没有用过awt组件,没有用过java相关的监听事件;

2、长时间没有使用socket进行客户端和服务端的交互,并且没有真正进行过cs结构的开发。

实现功能的代码如下:

客户端:

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
package chat.chat;
import java.awt.BorderLayout;
import java.awt.Frame;
import java.awt.TextArea;
import java.awt.TextField;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.event.WindowAdapter;
import java.awt.event.WindowEvent;
import java.io.DataOutputStream;
import java.io.IOException;
import java.net.Socket;
import java.net.UnknownHostException;
/**
 * 在线聊天客户端 1、生成图形窗口界面轮廓 2、为轮廓添加关闭事件 3、在轮廓中加入输入区域和内容展示区域 4、为输入区域添加回车事件
 * 5、建立服务端连接并发送数据
 *
 * @author tuzongxun123
 *
 */
public class ChatClient extends Frame {
  // 用户输入区域
  private TextField tfTxt = new TextField();
  // 内容展示区域
  private TextArea tarea = new TextArea();
  private Socket socket = null;
  // 数据输出流
  private DataOutputStream dataOutputStream = null;
  public static void main(String[] args) {
    new ChatClient().launcFrame();
  }
  /**
   * 建立一个简单的图形化窗口
   *
   * @author:tuzongxun
   * @Title: launcFrame
   * @param
   * @return void
   * @date May 18, 2016 9:57:00 AM
   * @throws
   */
  public void launcFrame() {
    setLocation(300, 200);
    this.setSize(200, 400);
    add(tfTxt, BorderLayout.SOUTH);
    add(tarea, BorderLayout.NORTH);
    pack();
    // 监听图形界面窗口的关闭事件
    this.addWindowListener(new WindowAdapter() {
      @Override
      public void windowClosing(WindowEvent e) {
        System.exit(0);
        disConnect();
      }
    });
    tfTxt.addActionListener(new TFLister());
    setVisible(true);
    connect();
  }
  /**
   * 连接服务器
   *
   * @author:tuzongxun
   * @Title: connect
   * @param
   * @return void
   * @date May 18, 2016 9:56:49 AM
   * @throws
   */
  public void connect() {
    try {
      // 新建服务端连接
      socket = new Socket("127.0.0.1", 8888);
      // 获取客户端输出流
      dataOutputStream = new DataOutputStream(socket.getOutputStream());
      System.out.println("连上服务端");
    } catch (UnknownHostException e) {
      e.printStackTrace();
    } catch (IOException e) {
      e.printStackTrace();
    }
  }
  /**
   * 关闭客户端资源
   *
   * @author:tuzongxun
   * @Title: disConnect
   * @param
   * @return void
   * @date May 18, 2016 9:57:46 AM
   * @throws
   */
  public void disConnect() {
    try {
      dataOutputStream.close();
      socket.close();
    } catch (IOException e) {
      e.printStackTrace();
    }
  }
  /**
   * 向服务端发送消息
   *
   * @author:tuzongxun
   * @Title: sendMessage
   * @param @param text
   * @return void
   * @date May 18, 2016 9:57:56 AM
   * @throws
   */
  private void sendMessage(String text) {
    try {
      dataOutputStream.writeUTF(text);
      dataOutputStream.flush();
    } catch (IOException e1) {
      e1.printStackTrace();
    }
  }
  /**
   * 图形窗口输入区域监听回车事件
   *
   * @author tuzongxun123
   *
   */
  private class TFLister implements ActionListener {
    @Override
    public void actionPerformed(ActionEvent e) {
      String text = tfTxt.getText().trim();
      tarea.setText(text);
      tfTxt.setText("");
      // 回车后发送数据到服务器
      sendMessage(text);
    }
  }
}

服务端:

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
package chat.chat;
import java.io.DataInputStream;
import java.io.EOFException;
import java.io.IOException;
import java.net.BindException;
import java.net.ServerSocket;
import java.net.Socket;
/**
 * java使用socket和awt组件简单实现在线聊天功能服务端 可以实现一个客户端连接后不断向服务端发送消息
 * 但不支持多个客户端同时连接,原因在于代码中获得客户端连接后会一直循环监听客户端输入,造成阻塞
 * 以至于服务端无法二次监听另外的客户端,如要实现,需要使用异步或者多线程
 *
 * @author tuzongxun123
 *
 */
public class ChatServer {
  public static void main(String[] args) {
    // 是否成功启动服务端
    boolean isStart = false;
    // 服务端socket
    ServerSocket ss = null;
    // 客户端socket
    Socket socket = null;
    // 服务端读取客户端数据输入流
    DataInputStream dataInputStream = null;
    try {
      // 启动服务器
      ss = new ServerSocket(8888);
    } catch (BindException e) {
      System.out.println("端口已在使用中");
      // 关闭程序
      System.exit(0);
    } catch (Exception e) {
      e.printStackTrace();
    }
    try {
      isStart = true;
      while (isStart) {
        boolean isConnect = false;
        // 启动监听
        socket = ss.accept();
        System.out.println("one client connect");
        isConnect = true;
        while (isConnect) {
          // 获取客户端输入流
          dataInputStream = new DataInputStream(
              socket.getInputStream());
          // 读取客户端传递的数据
          String message = dataInputStream.readUTF();
          System.out.println("客户端说:" + message);
        }
      }
    } catch (EOFException e) {
      System.out.println("client closed!");
    } catch (Exception e) {
      e.printStackTrace();
    } finally {
      // 关闭相关资源
      try {
        dataInputStream.close();
        socket.close();
      } catch (IOException e) {
        e.printStackTrace();
      }
    }
  }
}

以上所述是小编给大家介绍的Java Socket实现一个简易在线聊天功能(一)的相关知识,希望对大家有所帮助,如果大家有任何疑问请给我留言,小编会及时回复大家的。在此也非常感谢大家对服务器之家网站的支持!