socket

JAVA 判断Socket 远程端是否断开连接

大憨熊 提交于 2020-03-12 17:15:09
  最近在做项目的时候,遇到这样一个问题,如何判断 Socket 远程端连接是否关闭,如果关闭的话,就要重建连接Socket的类提供了一些已经封装好的方法, 如 isClosed()、 isConnected()、isInputStreamShutdown()、isOutputStreamShutdown() 等,在测试时发现,这些方法 都是本地端的状态 ,无法判断远端是否已经断开连接。   其实在socket类中有一个方法 sendUrgentData ,它会往输出流发送一个字节的数据,只要对方Socket的SO_OOBINLINE属性没有打开,就会自动舍弃这个字节(在Java 中是抛出异常),而SO_OOBINLINE属性默认情况下就是关闭的。   以下是示例代码仅供参考: 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;//超时时间,以毫秒为单位 //----

nginx与php-fpm通信的两种方式

China☆狼群 提交于 2020-03-12 16:30:49
简述 在linux中,nginx服务器和php-fpm可以通过tcp socket和unix socket两种方式实现。 unix socket是一种终端,可以使同一台操作系统上的两个或多个进程进行数据通信。这种方式需要再nginx配置文件中填写php-fpm的pid文件位置,效率要比tcp socket高。 tcp socket的优点是可以跨服务器,当nginx和php-fpm不在同一台机器上时,只能使用这种方式。 windows系统只能使用tcp socket的通信方式 配置方法 tcp socket:tcp socket通信方式,需要在nginx配置文件中填写php-fpm运行的ip地址和端口号。 location ~ \.php$ { include fastcgi_params; fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;; fastcgi_pass 127.0.0.1:9000; fastcgi_index index.php; } unix socket:unix socket通信方式,需要在nginx配置文件中填写php-fpm运行的pid文件地址。 //service php-fpm start生成.sock文件 location ~ \.php$ { include

socket使用对象流读写数据问题

試著忘記壹切 提交于 2020-03-12 04:41:43
文章目录 Socket使用ObjectInputStream与ObjectOutputStream读写数据问题 原因 教训 Socket使用ObjectInputStream与ObjectOutputStream读写数据问题 服务端一直阻塞。 原因 ObjectInputStreamAPI:Creates an ObjectInputStream that reads from the specified InputStream. A serialization stream header is read from the stream and verified. This constructor will block until the corresponding ObjectOutputStream has written and flushed the header. 意思是,创建一个ObjectInputStream,从指定流中InputStream读取数据,从流中读取序列化标头进行验证,那么这个构造函数将被阻塞,直到相应的ObjectOutputStream已经写入数据并刷新了报头。即,读取与写入是一一对应的,代码中,只需将client中的创建流的顺序更改一下即可。 教训 这个问题因为复制代码没有检查造成结果,收获,复制代码一定要认真检查,不然会付出惨痛的代价。 来源:

python通过ssh读写远程数据

本小妞迷上赌 提交于 2020-03-11 17:58:09
1.适用场景   需要读取(写)多台远程机器下的一个或多个文件,如果要通过 os.system('scp ......')来完成就必须配置免密登陆,比较麻烦 2.准备工作,   安装依赖   pip install ssh2,   如未安装pip可以通过网页下载ssh2.zip文件然后通过动态加载 import os import imp os.system('unzip ssh2.zip') imp.load_package('ssh2','./ssh2') 3.具体操作方式,    import socket from odps import ODPS from ssh2.session import Session from datetime import date, timedelta, datetime from ssh2.sftp import LIBSSH2_FXF_READ, LIBSSH2_SFTP_S_IRUSR sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM) sock.connect((host, 22)) session = Session() session.handshake(sock) session.userauth_password(user, pwd) sftp = session

Linux下socket编程的简单实例

筅森魡賤 提交于 2020-03-11 14:51:59
1 服务器端的socket编程 服务器端主要的功能,就是创建socket监听,等待客户端的连接。 基础的步骤很简单,如下: (1) 创建socket; (2) 绑定地址和端口; (3) 启动监听; (4) 接受客户端请求; (5) 读/写数据; 1.1 创建socket: 函数原型: mysocket = socket ( int socket_family , int socket_type , int protocol ) ; 1 第一个参数为socket的协议族,由一组宏定义表示,一般使用AF_INET,表示使用IPV4协议。 第二个参数为socket的类型,主要分为SOCK_STREAM和SOCK_DGRAM,分别对应TCP协议和UDP协议。 第三个参数为socket使用的特定协议,一般对应一个协议族就只有一个协议,可以使用0表示使用默认的协议。 函数返回值为创建的socket文件描述符。-1表示创建失败。 函数定义及相关宏定义在头文件<sys/socket.h>。 1.2 绑定地址和端口: 函数原型: int bind ( int sockfd , const struct sockaddr * addr , socklen_t addrlen ) ; 1 第一个参数为刚刚创建的socket; 第二个参数是一个结构体sockaddr的指针。但实际使用的时候,根据协议的不同

TCP/IP Socket网络编程

半城伤御伤魂 提交于 2020-03-11 10:05:35
典型的Client/Server程序流程图 面向流的套接字程序通常遵循规定的顺序。有关典型客户端和服务器的逻辑流程图,请参见下图。在研究此图时,请记住一个事实,即 并发服务器通常在客户端启动之前启动 ,并在步骤3等待客户端请求连接。然后,在关闭客户端连接后,它将继续等待其他客户端请求。 步骤1:服务器和客户端使用socket()调用创建一个流socket。 步骤2 :(对于客户端是可选的)使用bind()调用将套接字s绑定到本地地址。 步骤3:服务器使用listen()调用向TCP / IP机器发出接受连接意愿的警报。 步骤4:客户端使用connect()调用将套接字s连接到外部主机。 步骤5:服务器接受连接,并通过accept()阻塞,直到在此套接字上建立新连接例如ns或出现错误。 步骤6和7:服务器使用send()和recv()调用在套接字ns上读取和写入数据,客户端在套接字s上读取和写入数据,直到所有数据都已交换。 步骤8:服务器使用close()调用关闭套接字ns。客户端关闭套接字s,并通过close()调用结束TCP / IP会话。转到步骤5。 Basic socket calls Socket: 获取一个要读取或写入的套接字。 Bind: 将套接字与端口号关联。 Listen: 告诉TCP⁄IP该进程正在侦听此套接字上的连接。 Select: 等待套接字上的活动。

Python—在底层创建socket并且封装一个HTTP功能

三世轮回 提交于 2020-03-11 01:02:29
在底层创建socket并且封装一个HTTP功能 一、TCP回顾 1.TCP的创建及使用 二、使用TCP/socket封装一个HTTP功能 1.封装socket 一、TCP回顾 1.TCP的创建及使用 from socket import * def run_one ( ) : #创建一个TCP/socket连接 socketServer = socket ( AF_INET , SOCK_STREAM ) # 绑定ip和端口号 socketServer . bind ( ( '' , 8088 ) ) # 监听端口 socketServer . listen ( 128 ) # 接受一个客户端的字节套(内容) client_socket , clientAdr = socketServer . accept ( ) # 接受到的连接信息 print ( client_socket ) # 接收到的客户端地址 print ( clientAdr ) # 接收对方发送过来的数据 recv_data = client_socket . recv ( 1024 ) . decode ( 'gbk' ) # 接收1024个字节 # 获取头的访问连接一个get传参 data_url = recv_data . splitlines ( ) [ 0 ] . strip ( ' ' ) [ 1 ]

人人商城互动直播(与通信服务器连接失败)

流过昼夜 提交于 2020-03-10 20:19:10
人人商城互动直播(与通信服务器连接失败) 原创shitian0811 最后发布于2018-08-07 13:58:08 阅读数 8266 收藏 展开 如上图所示 解决办法: 1,先确定确定组件安装了没,如果没有安装请到人人商城帮助中心搜索下如何安装:直达链接 2,然后打开人人商城模块里的配置文件(路径/addons/ewei_shopv2/core/socket/socket.config.php) 如果没有的按下面代码直接创建个放入 <?php /** * socket server配置文件,重启后生效 */ // 开发模式开关 define('SOCKET_SERVER_DEBUG', false); // 设置服务端IP define('SOCKET_SERVER_IP', 'localhost'); // 设置服务端端口 define('SOCKET_SERVER_PORT', '9501'); // 设置是否启用SSL define('SOCKET_SERVER_SSL', false); // 设置SSL KEY文件路径 define('SOCKET_SERVER_SSL_KEY_FILE', '/www/'); // 设置SSL CERT文件路径 define('SOCKET_SERVER_SSL_CERT_FILE', '/www/'); //

树莓派与PC机的socket通信(1)

a 夏天 提交于 2020-03-10 18:57:58
1.服务端(即pc) import socket import time HOST = '#.#.#.#' #连接本地服务器,可通过ipconfig/all看IPV4的地址 PORT = 8001 #设置端口号,自己设置即可 # socket.AF_INET用于服务器与服务器之间的网络通信 # socket.SOCK_STREAM代表基于TCP的流式socket通信 sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM) sock.bind((HOST, PORT)) #绑定端口 sock.listen(5) #监听这个端口,可连接最多5个设备 while True: connection,address = sock.accept() #接收客户端的连接请求 try: connection.settimeout(10) #设置10s时限 buf = connection.recv(1024)#接收数据实例化 if buf: #接收成功 connection.send(b'welcome to server!') #发送消息,b表示bytes类型 print('Connection success!') else: #接收失败 connection.send(b'Please go out!') except socket

网络socket多进程编程之服务器

ぃ、小莉子 提交于 2020-03-10 18:40:12
文章目录 fork系统调用 网络socket多进程编程之服务器代码示例 在写多进程编程之前,我们先了解一下fork系统调用。 fork系统调用 ①Linux内核在启动的最后阶段会创建init进程来执行序/sbin/init,该进程是系统运行的第一个进程,进程号为 1,称为Linux 系统的初始化进程,该进程会创建其他子进程来启动不同写系统服务,而每个服务又可能创建不同的子进程来执行不同的程序。Linux 中维护着一个数据结构叫做 进程表,保存当前加载在内存中的所有进程的有关信息,其中包括进程的 PID(Process ID)、进程的状态、命令字符串等,操作系统通过进程的 PID 对它们进行管理,这些 PID 是进程表的索引。 ②Linux下有两个基本的系统调用可以用于创建子进程:fork()和vfork()。在我们编程的过程中,一个函数调用只有一次返回(return),但由于fork()系统调用会创建一个新的进程,这时会有两次返回。一次返回是给父进程,其返回值是子进程的PID(Process ID),第二次返回是给子进程,其返回值为0。所以我们在调用fork()后,需要通过其返回值来判断当前的代码是在父进程还是子进程运行,如果返回值是0说明现在是子进程在运行,如果返回值>0说明是父进程在运行,而如果返回值<0的话,说明fork()系统调用出错。fork 函数调用失败的原因主要有两个