java Socket实现简单在线聊天(一)

出处:http://blog.csdn.net/tuzongxun

最近的项目有一个在线网页交流的需求,由于很久以前做过的demo已经忘记的差不多了,因此便重新学习一下。

我计划的大致实现步骤分这样几大步:

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

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

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

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

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

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

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

实现功能的代码如下:

客户端:

[java] view plain copy

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

服务端:

[java] view plain copy

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

java Socket实现简单在线聊天(一)的相关文章

基于Server-Sent Event的简单在线聊天室

一.Web即时通信 所谓Web即时通信,就是说我们可以通过一种机制在网页上立即通知用户一件事情的发生,是不需要用户刷新网页的.Web即时通信的用途有很多,比如实时聊天,即时推送等.如当我们在登陆浏览知乎时如果有人回答了我们的问题,知乎就会即时提醒我们,再比如现在电子商务的在线客服功能.这些能大大提高用户体验的功能都是基于Web即时通信实现的. 普通HTTP流程 客户端从服务器端请求网页 服务器作出相应的反应 服务器返回相应到客户端 而由于HTTP请求是无状态的,也就是说每次请求完成后,HTTP链

JAVA Socket基础(简单实现)

学习Socket需要了解的几个概念: Socket 指的是互联网连接中的各个终结点.互联网连接是怎么创建的,通过IP地址加端口号,进行互通. A电脑(192.168.3.125:80)>>>>B电脑(192.168.3.111:80)   那么这一个个的Ip地址+端口号就是一个Socket(套接字.) Http协议:两台互联网的通讯需要遵守统一的应用层协议,通常指Http协议.应用层协议还有FTP协议,SMPT简单邮件协议等. 底层协议:IP/TCP协议.除了http需要遵守,还需

java socket编程简单样例(客户端+服务器)

//客户端 package test; import java.io.*; import java.net.*; import java.applet.Applet; public class TalkServer{ public static void main(String args[]) { try{ ServerSocket server=null; try{ server=new ServerSocket(4700); //创建一个ServerSocket在端口4700监听客户请求 }

java Socket通信简单实例

import java.io.*; import java.net.*; public class ClientTest { public static void main(String[] args) throws Exception { Socket s = new Socket("localhost", 8888); DataOutputStream dos = new DataOutputStream(s.getOutputStream()); dos.writeUTF(&qu

使用socket实现简单的聊天功能

package net; import java.io.BufferedReader; import java.io.BufferedWriter; import java.io.IOException; import java.io.InputStream; import java.io.InputStreamReader; import java.io.OutputStream; import java.io.OutputStreamWriter; import java.net.Socke

Python Socket实现简单的聊天室

通过参考其他牛人的文章和代码,  再根据自己的理解总结得出,  说明已经加在注释中, FYI 主要参考文章: http://blog.csdn.net/dk_zhe/article/details/37820965  http://www.cnblogs.com/coser/archive/2012/01/06/2315216.html  https://docs.python.org/2.7/library/select.html?highlight=select#module-select

Java Socket发送与接收HTTP消息简单实现

在上次Java Socket现实简单的HTTP服务我 们实现了简单的HTTP服务,它可以用来模拟HTTP服务,用它可以截获HTTP请求的原始码流,让我们很清楚的了解到我们向服务发的HTTP消息的结 构,对HTTP请求消息有个清晰的认识.这一节我想写了一个客户的程序,就是用来模拟浏览器,用来向服务器发送HTTP请求,最得要的是可以用它来显示服 务器发回来的HTTP响应消息的一般结构. [java] view plaincopy import java.io.IOException; import 

Node.js+socket.io在线聊天室

Node.js+socket.io实现在线聊天室,照着这个教程做的,稍加改动即可实现. Node.js:0.10.31 Express:3.* 创建工程chat: 添加几个文件,工程结构如下 代码: package.json: { "name": "application-name", "version": "0.0.1", "private": true, "scripts": { &

使用socket实现简单聊天室

通过socket实现简单的聊天室 1.服务端代码:serverselect.py #!/usr/bin/env python #coding:utf8 import socket import select class SelectServer(object): def __init__(self,host,port,backlog): self.host = host self.prot = port self.address = (host,port) self.backlog = back