Java socket长连接代码实现
服务器端程序:
- import java.io.*;
- import java.net.*;
- import java.util.*;
- public class ChatServer {
- boolean started = false;
- ServerSocket ss = null;
- List<Client> clients = new ArrayList<Client>();
- public static void main(String[] args) {
- new ChatServer().start();
- }
- public void start() {
- try {
- ss = new ServerSocket(8888);
- started = true;
- System.out.println("端口已开启,占用8888端口号....");
- } catch (BindException e) {
- System.out.println("端口使用中....");
- System.out.println("请关掉相关程序并重新运行服务器!");
- System.exit(0);
- } catch (IOException e) {
- e.printStackTrace();
- }
- try {
- while (started) {
- Socket s = ss.accept();
- Client c = new Client(s);
- System.out.println("a client connected!");
- new Thread(c).start();
- clients.add(c);
- }
- } catch (IOException e) {
- e.printStackTrace();
- } finally {
- try {
- ss.close();
- } catch (IOException e) {
- e.printStackTrace();
- }
- }
- }
- class Client implements Runnable {
- private Socket s;
- private DataInputStream dis = null;
- private DataOutputStream dos = null;
- private boolean bConnected = false;
- public Client(Socket s) {
- this.s = s;
- try {
- dis = new DataInputStream(s.getInputStream());
- dos = new DataOutputStream(s.getOutputStream());
- bConnected = true;
- } catch (IOException e) {
- e.printStackTrace();
- }
- }
- public void send(String str) {
- try {
- dos.writeUTF(str);
- } catch (IOException e) {
- clients.remove(this);
- System.out.println("对方退出了!我从List里面去掉了!");
- }
- }
- public void run() {
- try {
- while (bConnected) {
- String str = dis.readUTF();
- System.out.println("------------来自本地服务器:" + str);
- for (int i = 0; i < clients.size(); i++) {
- Client c = clients.get(i);
- c.send(str);
- }
- }
- } catch (EOFException e) {
- System.out.println("Client closed!");
- } catch (IOException e) {
- e.printStackTrace();
- } finally {
- try {
- if (dis != null)
- dis.close();
- if (dos != null)
- dos.close();
- if (s != null) {
- s.close();
- }
- } catch (IOException e1) {
- e1.printStackTrace();
- }
- }
- }
- }
- }
客户端程序:
- import java.awt.*;
- import java.awt.event.*;
- import java.io.*;
- import java.net.*;
- /**
- * @author Michael Huang
- *
- */
- public class ChatClient extends Frame {
- Socket s = null;
- DataOutputStream dos = null;
- DataInputStream dis = null;
- private boolean bConnected = false;
- TextField tfTxt = new TextField();
- TextArea taContent = new TextArea();
- Thread tRecv = new Thread(new RecvThread());
- public static void main(String[] args) {
- new ChatClient().launchFrame(8888);
- }
- public void launchFrame(int port) {
- setLocation(400, 300);
- this.setSize(300, 300);
- add(tfTxt, BorderLayout.SOUTH);
- add(taContent, BorderLayout.NORTH);
- pack();
- this.addWindowListener(new WindowAdapter() {
- @Override
- public void windowClosing(WindowEvent arg0) {
- disconnect();
- System.exit(0);
- }
- });
- tfTxt.addActionListener(new TFListener());
- setVisible(true);
- connect(port);
- tRecv.start();
- }
- public void connect(int port) {
- try {
- s = new Socket("127.0.0.1", port);
- dos = new DataOutputStream(s.getOutputStream());
- dis = new DataInputStream(s.getInputStream());
- System.out.println("~~~~~~~~连接成功~~~~~~~~!");
- bConnected = true;
- } catch (UnknownHostException e) {
- e.printStackTrace();
- } catch (IOException e) {
- e.printStackTrace();
- }
- }
- public void disconnect() {
- try {
- dos.close();
- dis.close();
- s.close();
- } catch (IOException e) {
- e.printStackTrace();
- }
- }
- private class TFListener implements ActionListener {
- public void actionPerformed(ActionEvent e) {
- String str = tfTxt.getText().trim();
- tfTxt.setText("");
- try {
- dos.writeUTF(str);
- dos.flush();
- } catch (IOException e1) {
- e1.printStackTrace();
- }
- }
- }
- private class RecvThread implements Runnable {
- public void run() {
- try {
- while (bConnected) {
- String str = dis.readUTF();
- taContent.setText(taContent.getText() + str + '\n');
- }
- } catch (SocketException e) {
- System.out.println("退出了,bye!");
- } catch (EOFException e) {
- System.out.println("退出了,bye!");
- } catch (IOException e) {
- e.printStackTrace();
- }
- }
- }
- }
Java socket长连接代码实现的更多相关文章
- java socket 长连接 短连接
长连接 是一旦一个客户端登陆上服务器,其与服务器之间的连接就不关闭,不管他们之间进行了多少次交易,直到客户端退出登陆或网络出现故障.这种技术在联机交易系统实现有利于提高效率. 短连接是客户端每发一个请 ...
- Java Socket长连接示例代码
SocketListenerPusher.java代码如下: import java.io.IOException; import java.net.InetSocketAddress; import ...
- java Socket 长连接 心跳包 客户端 信息收发 demo
今天写了个socket的测试小程序,代码如下 import java.io.IOException; import java.io.InputStream; import java.io.Output ...
- 网络编程懒人入门(八):手把手教你写基于TCP的Socket长连接
本文原作者:“水晶虾饺”,原文由“玉刚说”写作平台提供写作赞助,原文版权归“玉刚说”微信公众号所有,即时通讯网收录时有改动. 1.引言 好多小白初次接触即时通讯(比如:IM或者消息推送应用)时,总是不 ...
- android端 socket长连接 架构
看过包建强的<App研发录>之后对其中的基础Activity类封装感到惊讶,一直想找一种方式去解决关于app中使用socket长连接问题,如何实现简易的封装来达到主活动中涉及socket相 ...
- 【Socket】关于socket长连接的心跳包
TCP的socket本身就是长连接的,那么为什么还要心跳包呢? 在smack里有个30s发送一个空消息的线程,同样关于心跳包(keepalive) 据网络搜索到的资料解释如下 内网机器如果不主动向外发 ...
- 基于心跳的socket长连接
http://coach.iteye.com/blog/2024444 基于心跳的socket长连接 博客分类: http socket 案例: 心跳: socket模拟网页的报文连接某个网站,创建t ...
- 基于netty框架的socket长连接负载均衡解决方案
socket通讯的单机瓶颈 物联网的项目socket使用方式有两种: 短连接的socket请求 维持socket长连接的请求 对于socket短链接来说就好比是http请求,请求服务器,服务器返回数据 ...
- Socket 长连接 短连接 心跳 JAVA SOCKET编程
简单解释就是: 短连接:建立连接,发送数据包.关闭连接 长连接:建立连接.发送数据包,发送心跳包,发送数据包,发送心跳包.发送心跳包. ..... 所以又频繁的数据收发的话.短连接会频繁创建TCP连接 ...
随机推荐
- API查看Web App发布版本+编译时间+环境变量
项目环境: JDK7+Maven3.04 项目架构:SpringMVC 方法一:API访问Maven生成的MANIFEST.MF 1. 在pom.xml中添加jar包支持 <dependency ...
- JSP基础语法
JSP页面元素构成: 指令: page指令: ISO-8859-1 是纯英文的字符集,UTF-8 是中文字符集,将pageEncoding =ISO-8859-1 改为 contentType=utf ...
- js回顾2
1:事件流:一个事件发生时按一个方向传播 eg:a标签->html 冒泡:从里到外(一般的选择)-----IE只有冒泡 捕获:从外到里-----网景只有捕获(已经不存在了) 2.事件处理的两种种 ...
- php 字符串转数组
$str = "你好吗"; function str($str) { $length = mb_strlen($str); for ($i=0; $i<$le ...
- JS 跑马灯
利用jquery 来实现图片切换.文字转换移动的工具. MSClass 连接 http://www.popub.net/script/MSClass.html Mark 用
- python2.7安装scikit-learn遇到的问题及解决方法
安装完matplotlib后,在运行scikit-learn相关的库的时候又遇到缺包的问题,本来以为缺什么包就装什么包,但是由于种种原因,使我走上了弯路: 第一个坑:学校校园网限制.我用scikit- ...
- 更新centos curl
centos curl 默认使用nss,而不是openssl 升级curl让curl支持openssl rpm -Uvh http://www.city-fan.org/ftp/contrib/yum ...
- python 类、对象、方法、属性
在python中,一个对象的特征也称为属性(attribute).它所具有的行为也称为方法(method) 结论:对象=属性+方法 在python中,把具有相同属性和方法的对象归为一个类(class) ...
- InnoDB 存储引擎的锁机制
测试环境隔离级别:REPEATABLE-READ 行级别的 - Share and Exclusive Locks 共享锁 S:允许持有S锁的事务对行进行读操作 排他锁 X: 允许持有X锁的事务对行进 ...
- jQuery lazyload 懒加载
Lazy Load 是一个用 JavaScript 编写的 jQuery 插件. 它可以延迟加载长页面中的图片. 在浏览器可视区域外的图片不会被载入, 直到用户将页面滚动到它们所在的位置. 这与图片预 ...