网络编程-socket实现连接循环

解决报端口被使用错误

phone.setsockopt(socket.SOL_SOCKET,socket.SO_REUSEADDR)

 bug 1:客户端敲回车被卡主,客户端被卡在recv等待接收数据

import socket
client=socket.socket(socket.AF_INET,socket.SOCK_STREAM)
client.connect((‘127.0.0.1‘,8080))
#通信循环
while True:
    msg=input(‘>> ‘).strip()
    if not msg:continue#避免用户输入空字符串导致客户端卡死
    client.send(msg.encode(‘utf-8‘))
    data=client.recv(1024).decode(‘utf-8‘)
    print(data)
#关闭连接
client.close()

bug 2:客户端单方面断开后,linux平台上服务端会出现死循环接收数据,导致服务器卡死。window平台会直接报错。

Linux服务端

import socket
phone=socket.socket(socket.AF_INET,socket.SOCK_STREAM)
#解决提示端口被使用问题
phone.setsockopt(socket.SOL_SOCKET,socket.SO_REUSEADDR,1)
phone.bind((‘127.0.0.1‘,8080))
phone.listen(5)
conn,client_addr=phone.accept()
print(client_addr)
#通信循环
while True:
    data=conn.recv(1024)
    if not data:break#客户端单方面死掉,服务端会收到空字符串
    conn.send(data.upper())
conn.close()
phone.close()

Windows服务端

import socket
phone=socket.socket(socket.AF_INET,socket.SOCK_STREAM)
#解决提示端口被使用问题
phone.setsockopt(socket.SOL_SOCKET,socket.SO_REUSEADDR,1)
phone.bind((‘127.0.0.1‘,8080))
phone.listen(5)
conn,client_addr=phone.accept()
print(client_addr)
#通信循环
while True:
    try:
        data=conn.recv(1024)
        conn.send(data.upper())
    except ConnectionResetError:
        break
conn.close()
phone.close()

客户端

import socket
client=socket.socket(socket.AF_INET,socket.SOCK_STREAM)
client.connect((‘127.0.0.1‘,8080))
#通信循环
while True:
    msg=input(‘>> ‘).strip()
    if not msg:continue#避免用户输入空字符串导致客户端卡死
    client.send(msg.encode(‘utf-8‘))
    data=client.recv(1024).decode(‘utf-8‘)
    print(data)
#关闭连接
client.close()

实现server端循环连接:

import socket
phone=socket.socket(socket.AF_INET,socket.SOCK_STREAM)
#解决提示端口被使用问题
phone.setsockopt(socket.SOL_SOCKET,socket.SO_REUSEADDR,1)
phone.bind((‘127.0.0.1‘,8080))
phone.listen(5)
while True:#连接循环
    conn,client_addr=phone.accept()
    print(client_addr)
    while True:#通信循环
        try:
            data=conn.recv(1024)
            if not data: break  # 客户端单方面死掉,服务端会收到空字符串
            conn.send(data.upper())
        except ConnectionResetError:
            break
    conn.close()#连接关闭
phone.close()#套接字关闭

原文地址:https://www.cnblogs.com/yaya625202/p/8947570.html

时间: 2024-11-13 06:47:15

网络编程-socket实现连接循环的相关文章

Android网络编程Socket长连接

在实际的应用中客户端可能需要和服务器端保持长时间的通信,即服务器需要不断地读取客户端数据,并向客户端写入数据:客户端也需要不断地读取服务器数据,并向服务器写入数据. 简单实现代码如下: 1 public class MyServer { 2 //定义保存所有Socket的ArrayList 3 public staticArrayList socketList = newArrayList(); 4 5 public static voidmain(String[] args) throws I

Python 之 网络编程——SOCKET开发

一.预备知识 对于我们,主要掌握5层协议就行. 物理层: 转成二进制数序列数据链路层: 形成统一的协议:Internet协议 包括数据头(18个字节,前6个字节原地址,中间6个字节为目标地址,后6个字节为数据的描述)和数据网络层: 有IP协议,包括IP头和数据传输层: 包括tcp.UDP两个协议:基于端口(0-65535)的协议应用层: 包括http.ftp协议 TCP协议:流式协议,先把管道修好 客户端   服务端 C-------------------------------->S   <

java网络编程socket\server\TCP笔记(转)

java网络编程socket\server\TCP笔记(转) 2012-12-14 08:30:04|  分类: Socket |  标签:java  |举报|字号 订阅 1 TCP的开销 a  连接协商三次握手,c->syn->s,s->syn ack->c, c->ack->s b  关闭协商四次握手,c->fin->s, s->ack-c,s->fin->c,c->ack->s c  保持数据有序,响应确认等计算开销 d

linux 网络编程 socket bind failed 问题解决

今天写一个简单的socket网络通讯的程序的时候,用ctrl+c结束服务器端程序之后,再次启动服务器出现了bind failed:the address already in use的错误.在网上查了一下以后找到了原因,在此记录一下.这个IBM的官网上说到了这一点:http://www.ibm.com/developerworks/cn/linux/l-sockpit/.详细介绍如下: bind 普遍遭遇的问题是试图绑定一个已经在使用的端口.该陷阱是也许没有活动的套接字存在,但仍然禁止绑定端口(

Android 网络编程 Socket

1.服务端开发 创建一个Java程序 public class MyServer { // 定义保存所有的Socket,与客户端建立连接得到一个Socket public static List<Socket> socketList = new ArrayList<Socket>(); public static void main(String[] args) throws IOException { ServerSocket server = new ServerSocket(

网络编程socket基本API详解(转)

网络编程socket基本API详解 socket socket是在应用层和传输层之间的一个抽象层,它把TCP/IP层复杂的操作抽象为几个简单的接口供应用层调用已实现进程在网络中通信. socket起源于UNIX,在Unix一切皆文件哲学的思想下,socket是一种"打开—读/写—关闭"模式的实现,服务器和客户端各自维护一个"文件",在建立连接打开后,可以向自己文件写入内容供对方读取或者读取对方内容,通讯结束时关闭文件. socket 类型 常见的socket有3种类

网络编程Socket之TCP之close/shutdown详解(续)

接着上一篇网络编程Socket之TCP之close/shutdown详解 现在我们看看对于不同情况的close的返回情况和可能遇到的一些问题: 1.默认操作的close 说明:我们已经知道write操作返回成功只能说明数据已经发送到套接字的发送缓冲区,不能代表对端已经成功收到数据,close的默认返回成功也只是成功发出了一个FIN分节,也不代表对端已经确认 问题1:如果中途网络发生故障,很有可能服务端接收不到这个来自客户端的FIN分节: 问题2:假设服务器忙,那么来自客户端的数据由TCP加入到套

python网络编程socket (一)

提起网络编程,不同于web编程,它主要是C/S架构,也就是服务器.客户端结构的.对于初学者而言,最需要理解的不是网络的概念,而是python对于网络编程都提供了些什么模块和功能.不同于计算机发展的初级阶段,程序员走到今天,已经脱离了手工打造一切,要自己实现所有细节的年代.现在提倡的是不要重复造轮子,而是学习别人的轮子怎么用,只有那些有需求或能专研的人才去设计轮子甚至汽车,so,这是一个速成的年代. 因此,对于一个面向工作的python程序员,学习python的网络编程,其实学的就是那么几个模块,

Python开发【第八篇】:网络编程 Socket

Socket socket通常也称作"套接字",用于描述IP地址和端口,是一个通信链的句柄,应用程序通常通过"套接字"向网络发出请求或者应答网络请求. socket起源于Unix,而Unix/Linux基本哲学之一就是“一切皆文件”,对于文件用[打开][读写][关闭]模式来操作.socket就是该模式的一个实现,socket即是一种特殊的文件,一些socket函数就是对其进行的操作(读/写IO.打开.关闭) socket和file的区别: file模块是针对某个指定