`
李村民
  • 浏览: 37500 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

java Socket完美实例。。。

阅读更多
java Socket完美实例。。。(转)

转 http://hi.baidu.com/bieluanchi/blog/item/6991f01daa193efbe0fe0ba4.html

java socekt 同步套节字编程主要用到java.net.Socket类,通常情况下我们需要socket的长连接模式。其次就是在连接的另一端断开之后需要及时响应。

对于连接的判断,socket提供的isClosed,isConnected等都是判断本地套节字的状态。要判断运程的连接,可以通过发送紧急数据来判断,紧急数据发送成功与否,就表示远程是否断开。

package org.noka.nsocket;

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.io.PrintWriter;
import java.net.InetAddress;
import java.net.Socket;
import java.net.UnknownHostException;
/**
* socket 长连接类
* @author rebin
* @version 1.0
* @object noka tag
* @web http://www.97521.com
*/
public class Nksocket extends Thread{
public String ip=null;//连接服务器的IP
public Integer port=null;//连接服务器的端口
private Socket socket=null;//套节字对象
private boolean close = false; // 关闭连接标志位,true表示关闭,false表示连接
private Integer sotimeout=1*1*10;//超时时间,以毫秒为单位
//------------------------------------------------------------------------------
public Nksocket(){
   init();
}
public Nksocket(String ip,Integer port){
   setIp(ip);
   setPort(port);
   init();
}
/**
* 初始化socket对象
*/
public void init(){
   try {
    InetAddress address = InetAddress.getByName(getIp());
    socket = new Socket(address,getPort());
    socket.setKeepAlive(true);//开启保持活动状态的套接字
    socket.setSoTimeout(sotimeout);//设置超时时间
    close=!Send(socket,"2");//发送初始数据,发送成功则表示已经连接上,发送失败表示已经断开
   }catch(UnknownHostException e) {
    e.printStackTrace();
   }catch(IOException e){
    e.printStackTrace();
   }
}
/**
* 读数据线程
*/
public void run() {
   while(true){
    //---------读数据---------------------------
    close = isServerClose(socket);//判断是否断开
    if(!close){//没有断开,开始读数据
     String readtext = ReadText(socket);
     if(readtext!=null && readtext.trim().length()>0){
      System.out.println("读取数据:"+readtext);
     }
    }
    //---------创建连接-------------------------
    while(close){//已经断开,重新建立连接
     try{
      System.out.println("重新建立连接:"+getIp()+":"+getPort());
      InetAddress address = InetAddress.getByName(getIp());
      socket = new Socket(address,getPort());
      socket.setKeepAlive(true);
      socket.setSoTimeout(sotimeout);
      close = !Send(socket,"2");
      System.out.println("建立连接成功:"+getIp()+":"+getPort());
     }catch(Exception se){
      System.out.println("创建连接失败:"+getIp()+":"+getPort());
      close=true;
     }
    }
   }
}
/**
* 发送数据,发送失败返回false,发送成功返回true
* @param csocket
* @param message
* @return
*/
public Boolean Send(Socket csocket,String message){
   try{
    PrintWriter out = new PrintWriter(socket.getOutputStream(), true);
    out.println(message);
    return true;
   }catch(Exception se){
    se.printStackTrace();
    return false;
   }
}
/**
* 读取数据,返回字符串类型
* @param csocket
* @return
*/
public String ReadText(Socket csocket){
   try{
    csocket.setSoTimeout(sotimeout);
    InputStream input = csocket.getInputStream();
    BufferedReader in = new BufferedReader(new InputStreamReader(input));
    char[] sn = new char[1000];
    in.read(sn);
    String sc = new String(sn);
    return sc;
   }catch(IOException se){
    return null;
   }
}
/**
* 判断是否断开连接,断开返回true,没有返回false
* @param socket
* @return
*/
public Boolean isServerClose(Socket socket){
   try{
    socket.sendUrgentData(0);//发送1个字节的紧急数据,默认情况下,服务器端没有开启紧急数据处理,不影响正常通信
    return false;
   }catch(Exception se){
    return true;
   }
}
/**
* 测试
* @param ags
*/
public static void main(String[] ags){
   Nksocket nksocket = new Nksocket("127.0.0.1",8089);
   nksocket.start();
}
//------------------------------------------------------------------------------
public String getIp() {
   return ip;
}
public void setIp(String ip) {
   this.ip = ip;
}
public Integer getPort() {
   return port;
}
public void setPort(Integer port) {
   this.port = port;
}
}
分享到:
评论

相关推荐

    JAVA上百实例源码以及开源项目源代码

     Java波浪文字,一个利用Java处理字符的实例,可以设置运动方向参数,显示文本的字符数组,高速文本颜色,显示字体的 FontMetrics对象,得到Graphics实例,得到Image实例,填充颜色数组数据,初始化颜色数组。...

    java源码包---java 源码 大量 实例

     Java波浪文字,一个利用Java处理字符的实例,可以设置运动方向参数,显示文本的字符数组,高速文本颜色,显示字体的 FontMetrics对象,得到Graphics实例,得到Image实例,填充颜色数组数据,初始化颜色数组。...

    JAVA上百实例源码以及开源项目

     Java波浪文字,一个利用Java处理字符的实例,可以设置运动方向参数,显示文本的字符数组,高速文本颜色,显示字体的 FontMetrics对象,得到Graphics实例,得到Image实例,填充颜色数组数据,初始化颜色数组。...

    socket通讯java语言聊天室(仿qq风格)

    很完美的聊天室系统,摘自java精通实例,非常具有参考学习价值。

    java源码包4

     Java波浪文字,一个利用Java处理字符的实例,可以设置运动方向参数,显示文本的字符数组,高速文本颜色,显示字体的 FontMetrics对象,得到Graphics实例,得到Image实例,填充颜色数组数据,初始化颜色数组。...

    java源码包3

     Java波浪文字,一个利用Java处理字符的实例,可以设置运动方向参数,显示文本的字符数组,高速文本颜色,显示字体的 FontMetrics对象,得到Graphics实例,得到Image实例,填充颜色数组数据,初始化颜色数组。...

    java源码包2

     Java波浪文字,一个利用Java处理字符的实例,可以设置运动方向参数,显示文本的字符数组,高速文本颜色,显示字体的 FontMetrics对象,得到Graphics实例,得到Image实例,填充颜色数组数据,初始化颜色数组。...

    成百上千个Java 源码DEMO 4(1-4是独立压缩包)

    Java Telnet客户端实例源码 一个目标文件,演示Socket的使用。 Java 组播组中发送和接受数据实例 3个目标文件。 Java读写文本文件的示例代码 1个目标文件。 java俄罗斯方块 一个目标文件。 Java非对称加密源码实例 ...

    成百上千个Java 源码DEMO 3(1-4是独立压缩包)

    Java Telnet客户端实例源码 一个目标文件,演示Socket的使用。 Java 组播组中发送和接受数据实例 3个目标文件。 Java读写文本文件的示例代码 1个目标文件。 java俄罗斯方块 一个目标文件。 Java非对称加密源码实例 ...

    Google Android SDK开发范例大全(第3版) 1/5

    Google Map应用:GPS定位、规划导航路径、GPS Google地图、地址反查地理坐标等卫星全球定位实例。 创意程序设计:即时动态桌面、电蚊香、转转轮盘、任务管理器、中英发音字典、手机手电筒、GPS轨迹记录器、女性贴身...

    Google Android SDK开发范例大全(第3版) 4/5

    Google Map应用:GPS定位、规划导航路径、GPS Google地图、地址反查地理坐标等卫星全球定位实例。 创意程序设计:即时动态桌面、电蚊香、转转轮盘、任务管理器、中英发音字典、手机手电筒、GPS轨迹记录器、女性贴身...

    Google Android SDK开发范例大全(第3版) 3/5

    Google Map应用:GPS定位、规划导航路径、GPS Google地图、地址反查地理坐标等卫星全球定位实例。 创意程序设计:即时动态桌面、电蚊香、转转轮盘、任务管理器、中英发音字典、手机手电筒、GPS轨迹记录器、女性贴身...

    Google Android SDK开发范例大全(第3版) 5/5

    Google Map应用:GPS定位、规划导航路径、GPS Google地图、地址反查地理坐标等卫星全球定位实例。 创意程序设计:即时动态桌面、电蚊香、转转轮盘、任务管理器、中英发音字典、手机手电筒、GPS轨迹记录器、女性贴身...

Global site tag (gtag.js) - Google Analytics