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长连接相关推荐

  1. java socket 长连接事例

    一 .我们知道java的socket是基于TCP的连接,而ServerSocket 的accept()方法是阻塞的,直到有客户端连接到服务器端,我们常用多线程的方式来实现服务器端响应多个客户端,以下是 ...

  2. java socket长连接怎么维持_socket长连接的维持

    import java.io.Serializable; import java.text.SimpleDateFormat; import java.util.Date;/** * 维持连接的消息对 ...

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

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

  4. Java实现SSL Socket长连接

    一.单向认证 1.生成服务端密钥(配置了jdk的环境变量即可用keytool命令) 命令:keytool -genkey -keystore server_ks.jks -storepass serv ...

  5. android端 socket长连接 架构

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

  6. java前端长连接框架_Java如何实现长连接

    实现原理: 长连接的维持,是要客户端程序,定时向服务端程序,发送一个维持连接包的. 如果,长时间未发送维持连接包,服务端程序将断开连接. 客户端: Client通过持有Socket的对象,可以随时(使 ...

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

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

  8. socket 长链接linux,手把手教你写 Socket 长连接

    原标题:手把手教你写 Socket 长连接 8点43分打卡 就是真爱 本文转载自公众号 玉刚说,由玉刚说写作平台[1]提供写作赞助 原作者:水晶虾饺[2] 版权声明:本文版权归微信公众号玉刚说所有,未 ...

  9. 手把手教你写 Socket 长连接

    本文由玉刚说写作平台[1]提供写作赞助 原作者:水晶虾饺[2] 版权声明:本文版权归微信公众号 玉刚说 所有,未经许可,不得以任何形式转载 本篇我们先简单了解一下 TCP/IP,然后通过实现一个 ec ...

最新文章

  1. 《LeetCode力扣练习》剑指 Offer 11. 旋转数组的最小数字 Java
  2. php禁止伪造_php防止伪造的数据从URL提交方法
  3. python【蓝桥杯vip练习题库】ADV-288成绩排名
  4. CTabControl使用(系统配置程序部分功能)
  5. MySQL limit
  6. 我的天,强化学习还能用在自动驾驶领域?
  7. JS收集:限制输入搜索串
  8. js动态的属性名如何取该属性的值
  9. bootstrap学习笔记(1)基础段落,表格的实现
  10. mysql 语句活用增删改
  11. Luogu1005 矩阵取数游戏
  12. 华为云NP考试题库_华为认证考试题库-HCNP
  13. C/C++静态代码检查工具CodeChecker(一)简介
  14. 电商系统商品库的基本功能设计与实现
  15. 软件测试好书推荐《自动化测试实践》30个项目测试案例分析
  16. Android studio 导出安卓APP软件方法
  17. quartus更新symbol后没反应_Quartus II使用常见问题
  18. Unity中使用ProtoBuf-保姆式教程
  19. 内地炒美股需要什么条件?有哪些美股交易基础要点
  20. 湿地营救机器人_“湿地卫士”创意机器人,真棒!

热门文章

  1. 触摸屏 服务器系统,IP网络触摸屏服务器 SK1606
  2. 用exec()函数执行新程序
  3. 入门必学的sql语句
  4. 直接调节风扇转速的Windows开源工具--Open Hardware Monitor
  5. 克隆系统安装安全软件避免重复ID 方法
  6. win7+mbr安装黑苹果
  7. bitset(位图)原理与用法
  8. 位运算符之---按位取反运算符(简单易懂)
  9. python 生成待图片的二维码代码
  10. 用微积分证明泰勒公式