004---基于TCP的套接字

基于TCP的套接字

tcp是基于链接的,必须先启动服务端,然后再启动客户端去连接服务端。
之前实现的简单套接字就是基于TCP的,但是只能实现收发消息一次、服务器与客户端都断开了。不够过瘾。

通信循环版本

服务端

#! /usr/bin/env python
# -*- coding: utf-8 -*-
# __author__ = "ziya"
# Date: 2019-02-01

import socket

ip_port = ('127.0.0.1', 8000)
buffer_size = 1024

service = socket.socket(family=socket.AF_INET, type=socket.SOCK_STREAM)

service.bind(ip_port)

service.listen(5)

conn, addr = service.accept()

# 通信循环(c/s之间不只收发一次消息)
while 1:
    msg = conn.recv(buffer_size)
    print('客户端发来的消息:', msg.decode('utf-8'))
    data = input('给客户端发的消息:')
    conn.send(data.encode('utf-8'))
    print('发生给客户端的消息成功:', data)

conn.close()

sk.close()

客户端

#! /usr/bin/env python
# -*- coding: utf-8 -*-
# __author__ = "ziya"
# Date: 2019-02-01

import socket

ip_port = ('127.0.0.1', 8000)
buffer_size = 1024

client = socket.socket(family=socket.AF_INET, type=socket.SOCK_STREAM)

client.connect(ip_port)

while 1:
    msg = input('输入发给服务端的消息:').strip()
    client.send(msg.encode('utf-8'))
    data = client.recv(buffer_size)
    print('服务端回复的消息:', data.decode('utf-8'))

client.close()



从图中可以看出有bug,当客户端强制端口连接,服务器那边会抛出异常。
还有就是客户端发送不了空消息(空格)。

小Bug修复

服务端

#! /usr/bin/env python
# -*- coding: utf-8 -*-
# __author__ = "ziya"
# Date: 2019-02-01

import socket

ip_port = ('127.0.0.1', 8000)
buffer_size = 1024

service = socket.socket(family=socket.AF_INET, type=socket.SOCK_STREAM)

# 有时候会出现端口占用的情况,加上下面代码
service.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1)

service.bind(ip_port)

service.listen(5)

conn, addr = service.accept()

# 通信循环(c/s之间不只收发一次消息)
while 1:
    try:
        msg = conn.recv(buffer_size)
        if not msg:
            print('客户端主动退出')
            break
        print('客户端发来的消息:', msg.decode('utf-8'))
        data = input('给客户端发的消息:')
        conn.send(data.encode('utf-8'))
        print('发生给客户端的消息成功:', data)
    except ConnectionResetError as con:
        print('客户端强制退出')
        break
conn.close()

service.close()

客户端

#! /usr/bin/env python
# -*- coding: utf-8 -*-
# __author__ = "ziya"
# Date: 2019-02-01

import socket

ip_port = ('127.0.0.1', 8000)
buffer_size = 1024

client = socket.socket(family=socket.AF_INET, type=socket.SOCK_STREAM)

client.connect(ip_port)

while 1:
    msg = input('输入发给服务端的消息(q/Q退出):').strip()
    if not msg:
        print('不能发送空消息给服务器')
        continue
    if msg.upper() == 'Q':
        print('正在主动退出')
        break
    client.send(msg.encode('utf-8'))
    data = client.recv(buffer_size)
    print('服务端回复的消息:', data.decode('utf-8'))

client.close()
print('exit ok')




连接循环版本

虽然没啥大问题。但是还有一个大问题,就是只能有一个客户端连接。客服端正常断开或者强制断开,服务器也会跟着断,并不能保证其他客户端来连接。

服务器

#! /usr/bin/env python
# -*- coding: utf-8 -*-
# __author__ = "ziya"
# Date: 2019-02-01

import socket

ip_port = ('127.0.0.1', 8000)
buffer_size = 1024

service = socket.socket(family=socket.AF_INET, type=socket.SOCK_STREAM)

# 有时候会出现端口占用的情况,加上下面代码
service.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1)

service.bind(ip_port)

service.listen(5)

while 1:
    # 连接循环(客户端断开之后其他客户端还能连接。
    conn, addr = service.accept()
    while 1:
        # 通信循环(c/s之间不只收发一次消息)
        try:
            msg = conn.recv(buffer_size)
            if not msg:
                print('客户端主动退出')
                break
            print('客户端发来的消息:', msg.decode('utf-8'))
            data = input('给客户端发的消息:')
            conn.send(data.encode('utf-8'))
            print('发生给客户端的消息成功:', data)
        except ConnectionResetError as con:
            print('客户端强制退出')
            break
    conn.close()

service.close()

客户端

#! /usr/bin/env python
# -*- coding: utf-8 -*-
# __author__ = "ziya"
# Date: 2019-02-01

import socket

ip_port = ('127.0.0.1', 8000)
buffer_size = 1024

client = socket.socket(family=socket.AF_INET, type=socket.SOCK_STREAM)

client.connect(ip_port)

while 1:
    msg = input('输入发给服务端的消息(q/Q退出):').strip()
    if not msg:
        print('不能发送空消息给服务器')
        continue
    if msg.upper() == 'Q':
        print('正在主动退出')
        break
    client.send(msg.encode('utf-8'))
    data = client.recv(buffer_size)
    print('服务端回复的消息:', data.decode('utf-8'))

client.close()
print('exit ok')

原文地址:https://www.cnblogs.com/xjmlove/p/10345876.html

时间: 2024-10-17 06:48:39

004---基于TCP的套接字的相关文章

python基础之socket编程-------基于tcp的套接字实现远程执行命令的操作

远程实现cmd功能: import socket import subprocess phone=socket.socket(socket.AF_INET,socket.SOCK_STREAM) phone.bind(("127.0.0.1",8080)) phone.listen(5) print("starting....") while True: conn,addr=phone.accept() while True: try: date=conn.recv

Day35:基于UDO的套接字、粘包问题

一.基于UDP的套接字 UDP服务端 ss = socket() #创建一个服务器的套接字 ss.bind() #绑定服务器套接字 inf_loop: #服务器无限循环 cs = ss.recvfrom()/ss.sendto() # 对话(接收与发送) ss.close() # 关闭服务器套接字 UDP客户端 cs = socket() # 创建客户套接字 comm_loop: # 通讯循环 cs.sendto()/cs.recvfrom() # 对话(发送/接收) cs.close() #

【Java】Java网络编程菜鸟进阶:TCP和套接字入门

Java网络编程菜鸟进阶:TCP和套接字入门 JDK 提供了对 TCP(Transmission Control Protocol,传输控制协议)和 UDP(User Datagram Protocol,用户数据报协议)这两个数据传输协议的支持.本文开始探讨 TCP. TCP 基础知识 在“服务器-客户端”这种架构中,服务器和客户端各自维护一个端点,两个端点需要通过网络进行数据交换.TCP 为这种需求提供了一种可靠的流式连接,流式的意思是传出和收到的数据都是连续的字节,没有对数据量进行大小限制.

使用 TCP / IP 套接字(Sockets)

使用TCP / IP 套接字(Sockets) TCP/IP 套接字提供了跨网络的低层控制.TCP/IP套接字是两台计算机之间的逻辑连接,通过它,计算机能够在任何时间发送或接收数据:这个连接一直保持,直到这台计算机显式发出关闭指令.它提供了高度的灵活性,但也带来了大量的问题,在这一章中我们会看到,因此,除非真的需要非常高度的控制,否则,最好还是使用更抽象的网络协议,在这一章的后面我们也会谈到. 为了使用TCP/IP 套接字所必须的类包含在命名空间System.Net,表 11-1 进行了汇总.

python基于udp的套接字

1.基于udp的套接字 (1)udp不会产生粘包现象 (2)udp是无链接的,先启动哪一端都不会报错. (3)upd是无连接的,所以可以同时多个客户端跟服务端通信. 2.代码例子 服务端: from socket import * udp_server=socket(AF_INET,SOCK_DGRAM) #创建一个服务器的套接字 udp_server.bind(('127.0.0.1',8080)) #绑定一个服务器套接字 while True: data,client_addr=udp_se

基于流式套接字的回射客服端编程程序

基于流式套接字的回射客服端编程程序 #include <WS2tcpip.h> #include<unistd.h> #include<stdio.h> #include<string.h> #include<stdlib.h> #include <winsock2.h> #define MAXLINE 512 #define PORT 7210 //填服务器端口号 #define IP_ADDRESS "127.0.0.1

TCP之套接字socket编程

一.socket套接字 "IP地址 + 端口号 "就称为socket.在TCP协议里,建立连接的两个进程各自有一个socket标识,这两个socket pair就唯一标识一个连接,描述网络连接的一对一关系. Linux的基本哲学就是"一切皆文件",其实socket就是一种特殊的文件,是"open-write/read-close"模式的一种实现. 二.socket的基本操作 1.socket()函数 socket函数对应于普通文件的打开操作.普通

TCP/UDP套接字 java socket编程实例

网络协议七层结构: 什么是Socket? socket(套接字)是两个程序之间通过双向信道进行数据交换的端,可以理解为接口.使用socket编程也称为网络编程,socket只是接口并不是网络通信协议. HTTP协议和Socket的区别 http协议是应用层,其模式是请求-应答,客户端发送请求,服务器端进行响应.传输的数据是原始格式的数据,eg :json.xml.text等数据格式. socket不是协议是接口,socket提供TCP/UDP socket 的实例,供java 或者其他语言操作数

TCP/UDP套接字网络协议

TCP服务端(以字节串传输信息) import socket 1.创建套接字 sockfd = socket.socket(socket_family = AF_INET,socket_type = SOCK_STREAM,proto = 0) 功能:创建一个IPv4的流式套接字,括号中的创建IPv4流式套接字的时候可以不写,有缺省值. 参数:socket_family 地址族类型 AF_INET 表示IPv4网络通信 socket_type 套接字类型 SOCK_STREAM 流式  SOCK