java Socket长连接
来源:互联网 发布:ug4.0编程教学 编辑:程序博客网 时间:2024/04/30 23:10
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;
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 socket 长连接
- java Socket长连接
- java socket 长连接
- Java Socket长连接
- Java Socket 长连接通信
- java socket保持长连接
- Java Socket长连接实现
- java socket 长连接事例
- Java 心跳 Socket 长连接
- java socket长连接服务端
- Socket 长连接 短连接 心跳 JAVA SOCKET编程
- Socket 长连接 短连接 心跳 JAVA SOCKET编程
- 经典java socket 长连接实例
- java socket 长连接发送数据概要
- Java Socket收发异步长连接
- Java socket 长连接与短链接
- Java socket长连接代码实现
- java-socket编程_ 2.socket保持长连接
- 微软2013暑假实习生笔试题
- linux下C、C++开发工具
- Android EditText插入字符串到光标所在位置的两种方式
- Android Java 中Thread与Runnable的区别
- typedef和typename关键字
- java Socket长连接
- 医疗业务系统的授权操作模式
- VMware ESXi v5.1.0 / vSphere client v5.1.0 配置SRIOV
- How to share files between Mac and Windows
- 部署第一个域:Active Directory系列之二
- cocos2d库的更新
- 【KMP算法详解——适合初学KMP算法的朋友】
- Linux命令行文本处理工具
- HibernateTemplate和HibernateDaoSupport