服务器端程序:

  1. import java.io.*;
  2. import java.net.*;
  3. import java.util.*;
  4.  
  5. public class ChatServer {
  6. boolean started = false;
  7. ServerSocket ss = null;
  8. List<Client> clients = new ArrayList<Client>();
  9.  
  10. public static void main(String[] args) {
  11. new ChatServer().start();
  12. }
  13.  
  14. public void start() {
  15. try {
  16. ss = new ServerSocket(8888);
  17. started = true;
  18. System.out.println("端口已开启,占用8888端口号....");
  19. } catch (BindException e) {
  20. System.out.println("端口使用中....");
  21. System.out.println("请关掉相关程序并重新运行服务器!");
  22. System.exit(0);
  23. } catch (IOException e) {
  24. e.printStackTrace();
  25. }
  26.  
  27. try {
  28. while (started) {
  29. Socket s = ss.accept();
  30. Client c = new Client(s);
  31. System.out.println("a client connected!");
  32. new Thread(c).start();
  33. clients.add(c);
  34. }
  35. } catch (IOException e) {
  36. e.printStackTrace();
  37. } finally {
  38. try {
  39. ss.close();
  40. } catch (IOException e) {
  41. e.printStackTrace();
  42. }
  43. }
  44. }
  45.  
  46. class Client implements Runnable {
  47. private Socket s;
  48. private DataInputStream dis = null;
  49. private DataOutputStream dos = null;
  50. private boolean bConnected = false;
  51.  
  52. public Client(Socket s) {
  53. this.s = s;
  54. try {
  55. dis = new DataInputStream(s.getInputStream());
  56. dos = new DataOutputStream(s.getOutputStream());
  57. bConnected = true;
  58. } catch (IOException e) {
  59. e.printStackTrace();
  60. }
  61. }
  62.  
  63. public void send(String str) {
  64. try {
  65. dos.writeUTF(str);
  66. } catch (IOException e) {
  67. clients.remove(this);
  68. System.out.println("对方退出了!我从List里面去掉了!");
  69. }
  70. }
  71.  
  72. public void run() {
  73. try {
  74. while (bConnected) {
  75. String str = dis.readUTF();
  76. System.out.println("------------来自本地服务器:" + str);
  77. for (int i = 0; i < clients.size(); i++) {
  78. Client c = clients.get(i);
  79. c.send(str);
  80. }
  81. }
  82. } catch (EOFException e) {
  83. System.out.println("Client closed!");
  84. } catch (IOException e) {
  85. e.printStackTrace();
  86. } finally {
  87. try {
  88. if (dis != null)
  89. dis.close();
  90. if (dos != null)
  91. dos.close();
  92. if (s != null) {
  93. s.close();
  94. }
  95.  
  96. } catch (IOException e1) {
  97. e1.printStackTrace();
  98. }
  99.  
  100. }
  101. }
  102. }
  103. }

客户端程序:

  1. import java.awt.*;
  2. import java.awt.event.*;
  3. import java.io.*;
  4. import java.net.*;
  5.  
  6. /**
  7. * @author Michael Huang
  8. *
  9. */
  10. public class ChatClient extends Frame {
  11. Socket s = null;
  12. DataOutputStream dos = null;
  13. DataInputStream dis = null;
  14. private boolean bConnected = false;
  15.  
  16. TextField tfTxt = new TextField();
  17. TextArea taContent = new TextArea();
  18.  
  19. Thread tRecv = new Thread(new RecvThread());
  20.  
  21. public static void main(String[] args) {
  22. new ChatClient().launchFrame(8888);
  23. }
  24.  
  25. public void launchFrame(int port) {
  26. setLocation(400, 300);
  27. this.setSize(300, 300);
  28. add(tfTxt, BorderLayout.SOUTH);
  29. add(taContent, BorderLayout.NORTH);
  30. pack();
  31. this.addWindowListener(new WindowAdapter() {
  32.  
  33. @Override
  34. public void windowClosing(WindowEvent arg0) {
  35. disconnect();
  36. System.exit(0);
  37. }
  38.  
  39. });
  40. tfTxt.addActionListener(new TFListener());
  41. setVisible(true);
  42. connect(port);
  43.  
  44. tRecv.start();
  45. }
  46.  
  47. public void connect(int port) {
  48. try {
  49. s = new Socket("127.0.0.1", port);
  50. dos = new DataOutputStream(s.getOutputStream());
  51. dis = new DataInputStream(s.getInputStream());
  52. System.out.println("~~~~~~~~连接成功~~~~~~~~!");
  53. bConnected = true;
  54. } catch (UnknownHostException e) {
  55. e.printStackTrace();
  56. } catch (IOException e) {
  57. e.printStackTrace();
  58. }
  59.  
  60. }
  61.  
  62. public void disconnect() {
  63. try {
  64. dos.close();
  65. dis.close();
  66. s.close();
  67. } catch (IOException e) {
  68. e.printStackTrace();
  69. }
  70.  
  71. }
  72.  
  73. private class TFListener implements ActionListener {
  74.  
  75. public void actionPerformed(ActionEvent e) {
  76. String str = tfTxt.getText().trim();
  77. tfTxt.setText("");
  78.  
  79. try {
  80. dos.writeUTF(str);
  81. dos.flush();
  82. } catch (IOException e1) {
  83. e1.printStackTrace();
  84. }
  85.  
  86. }
  87.  
  88. }
  89.  
  90. private class RecvThread implements Runnable {
  91.  
  92. public void run() {
  93. try {
  94. while (bConnected) {
  95. String str = dis.readUTF();
  96. taContent.setText(taContent.getText() + str + '\n');
  97. }
  98. } catch (SocketException e) {
  99. System.out.println("退出了,bye!");
  100. } catch (EOFException e) {
  101. System.out.println("退出了,bye!");
  102. } catch (IOException e) {
  103. e.printStackTrace();
  104. }
  105.  
  106. }
  107.  
  108. }
  109. }

Java socket长连接代码实现的更多相关文章

  1. java socket 长连接 短连接

    长连接 是一旦一个客户端登陆上服务器,其与服务器之间的连接就不关闭,不管他们之间进行了多少次交易,直到客户端退出登陆或网络出现故障.这种技术在联机交易系统实现有利于提高效率. 短连接是客户端每发一个请 ...

  2. Java Socket长连接示例代码

    SocketListenerPusher.java代码如下: import java.io.IOException; import java.net.InetSocketAddress; import ...

  3. java Socket 长连接 心跳包 客户端 信息收发 demo

    今天写了个socket的测试小程序,代码如下 import java.io.IOException; import java.io.InputStream; import java.io.Output ...

  4. 网络编程懒人入门(八):手把手教你写基于TCP的Socket长连接

    本文原作者:“水晶虾饺”,原文由“玉刚说”写作平台提供写作赞助,原文版权归“玉刚说”微信公众号所有,即时通讯网收录时有改动. 1.引言 好多小白初次接触即时通讯(比如:IM或者消息推送应用)时,总是不 ...

  5. android端 socket长连接 架构

    看过包建强的<App研发录>之后对其中的基础Activity类封装感到惊讶,一直想找一种方式去解决关于app中使用socket长连接问题,如何实现简易的封装来达到主活动中涉及socket相 ...

  6. 【Socket】关于socket长连接的心跳包

    TCP的socket本身就是长连接的,那么为什么还要心跳包呢? 在smack里有个30s发送一个空消息的线程,同样关于心跳包(keepalive) 据网络搜索到的资料解释如下 内网机器如果不主动向外发 ...

  7. 基于心跳的socket长连接

    http://coach.iteye.com/blog/2024444 基于心跳的socket长连接 博客分类: http socket 案例: 心跳: socket模拟网页的报文连接某个网站,创建t ...

  8. 基于netty框架的socket长连接负载均衡解决方案

    socket通讯的单机瓶颈 物联网的项目socket使用方式有两种: 短连接的socket请求 维持socket长连接的请求 对于socket短链接来说就好比是http请求,请求服务器,服务器返回数据 ...

  9. Socket 长连接 短连接 心跳 JAVA SOCKET编程

    简单解释就是: 短连接:建立连接,发送数据包.关闭连接 长连接:建立连接.发送数据包,发送心跳包,发送数据包,发送心跳包.发送心跳包. ..... 所以又频繁的数据收发的话.短连接会频繁创建TCP连接 ...

随机推荐

  1. API查看Web App发布版本+编译时间+环境变量

    项目环境: JDK7+Maven3.04 项目架构:SpringMVC 方法一:API访问Maven生成的MANIFEST.MF 1. 在pom.xml中添加jar包支持 <dependency ...

  2. JSP基础语法

    JSP页面元素构成: 指令: page指令: ISO-8859-1 是纯英文的字符集,UTF-8 是中文字符集,将pageEncoding =ISO-8859-1 改为 contentType=utf ...

  3. js回顾2

    1:事件流:一个事件发生时按一个方向传播 eg:a标签->html 冒泡:从里到外(一般的选择)-----IE只有冒泡 捕获:从外到里-----网景只有捕获(已经不存在了) 2.事件处理的两种种 ...

  4. php 字符串转数组

    $str = "你好吗"; function str($str) {     $length = mb_strlen($str);     for ($i=0; $i<$le ...

  5. JS 跑马灯

    利用jquery 来实现图片切换.文字转换移动的工具. MSClass 连接 http://www.popub.net/script/MSClass.html Mark 用

  6. python2.7安装scikit-learn遇到的问题及解决方法

    安装完matplotlib后,在运行scikit-learn相关的库的时候又遇到缺包的问题,本来以为缺什么包就装什么包,但是由于种种原因,使我走上了弯路: 第一个坑:学校校园网限制.我用scikit- ...

  7. 更新centos curl

    centos curl 默认使用nss,而不是openssl 升级curl让curl支持openssl rpm -Uvh http://www.city-fan.org/ftp/contrib/yum ...

  8. python 类、对象、方法、属性

    在python中,一个对象的特征也称为属性(attribute).它所具有的行为也称为方法(method) 结论:对象=属性+方法 在python中,把具有相同属性和方法的对象归为一个类(class) ...

  9. InnoDB 存储引擎的锁机制

    测试环境隔离级别:REPEATABLE-READ 行级别的 - Share and Exclusive Locks 共享锁 S:允许持有S锁的事务对行进行读操作 排他锁 X: 允许持有X锁的事务对行进 ...

  10. jQuery lazyload 懒加载

    Lazy Load 是一个用 JavaScript 编写的 jQuery 插件. 它可以延迟加载长页面中的图片. 在浏览器可视区域外的图片不会被载入, 直到用户将页面滚动到它们所在的位置. 这与图片预 ...