套接字 (socket)处使用

基于TCP 协议的套接字

TCP 是基于链接的 ,服务器端和客户端启动没有顺序.

服务器端设置:

import socket
sk =socket.socket() # 1. 实例化
sk.bind(('127.0.0.1',))#把地址绑定到套接字 #2. bind
sk.listen()#监听链接 #3.监听
conn,addr = sk.accept()#接收客户端链接 #4.接收链接
ret =conn.recv(())#接收客户端信息 #5. 接收信息
print(ret)
conn.send(b'hello_world')#向客户端发送信息. #6.发消息
conn.close()#关闭链接
sk.close()#关闭服务器套接字,可选

输出结果 :b'hellow iam the client side !'

客户端配置:

import socket
sk =socket.socket() #创建客户套接字 1.实例化
sk.connect(('127.0.0.1',)) #尝试链接服务器 #2.连接
sk.send(b'hellow iam the client side !') #3. 发送
ret =sk.recv() #4.接收
print(ret)
sk.close()#关闭客户套接字.

输出结果:b'hello_world'

问题:有的同学在重启服务端时可能会遇到

解决办法

import socket
from socket import SOL_SOCKET,SO_REUSEADDR
sk =socket.socket()
sk.setsockopt(SOL_SOCKET,SO_REUSEADDR,)#在bind前绑定.
sk.bind(('127.0.0.1',))#把地址绑定到套接字
sk.listen()#监听链接
conn,addr = sk.accept()#接收客户端链接
ret =conn.recv(())#接收客户端信息
print(ret)
conn.send(b'hello_world')#向客户端发送信息.
conn.close()#关闭链接
sk.close()#关闭服务器套接字,可选

基于UDP的套接字协议

upd是面向无连接的,启动服务后可以直接接受消息,不需要提前建立链接

Server端

import socket
udp_sk = socket.socket(type=socket.SOCK_DGRAM) #1. 实例化
udp_sk.bind(('127.0.0.1',)) #2.bind 地址与端口
msg,addr = udp_sk.recvfrom() #3. 接收消息.
print(msg)
udp_sk.sendto(b'hello iam the serverside',addr) #4.发送消息.
udp_sk.close()

输出结果:

client端

import socket
ip_port =('127.0.0.1',)
udp_sk =socket.socket(type=socket.SOCK_DGRAM) #1.实例化
udp_sk.sendto(b'hello',ip_port) #2.发送
msg,addr=udp_sk.recvfrom() #3.接收
print(msg)

输出结果  b'hello iam the serverside'

  TCP 聊天小工具

服务器端

import  socket
sk =socket.socket()
sk.setsockopt(socket.SOL_SOCKET,socket.SO_REUSEADDR,)
sk.bind(('192.168.21.36',))
sk.listen()
while True:
con,addr =sk.accept()#接收连接,三次握手conn
while True:
inp = input('请输入')
if inp =='q':
con.send(inp.encode('utf-8'))
break
con.send(inp.encode('utf-8'))
msg =con.recv()
if msg ==b'q':break
print(msg.decode('utf-8'))
con.close()
sk.close()

客户端:

import socket
sk = socket.socket()
sk.connect(('127.0.0.1',))
while True:
msg = sk.recv()
print(msg.decode('utf-8'))
if msg == b'q':break
inp = input('>>>')
if inp == 'q':
sk.send(inp.encode('utf-8'))
break
sk.send(inp.encode('utf-8'))
sk.close()

UDP 聊天小工具

服务器端

import socket
sk = socket.socket(type=socket.SOCK_DGRAM) # 建立一个socket对象,
# 指定以UDP协议的形式来连接
sk.bind(('127.0.0.1',8080))
# 指定服务的地址

msg,addr = sk.recvfrom(1024) # 接收消息,发送端的地址
print(msg,addr)
sk.sendto(b'HELLO',addr) # 给发送端回复消息

sk.close() # 关闭socket连接

客户端

import socket

sk = socket.socket(type=socket.SOCK_DGRAM)

sk.sendto(b'hello',('127.0.0.1',))   # 直接给服务器发送一段消息
msg,addr = sk.recvfrom() # 接收对面的回信
print(msg)
sk.close()

时钟同步试题

服务器端

import socket

sk = socket.socket(type=socket.SOCK_DGRAM)

sk.sendto(b'hello',('127.0.0.1',))   # 直接给服务器发送一段消息
msg,addr = sk.recvfrom() # 接收对面的回信
print(msg)
sk.close()

客户端

# client端每隔一段时间发送请求到服务端
# 发送时间的格式
import time
import socket
sk = socket.socket(type = socket.SOCK_DGRAM)
sk.sendto('%Y-%m-%d %H:%M:%S'.encode('utf-8'),('127.0.0.1',))
msg,addr = sk.recvfrom()
print(msg.decode('utf-8'))
sk.close() # 方式一
# 操作系统的定时任务 + python代码的形式
# 方式二
# while True + time.sleep的形式

Day 33 Socket编程.的更多相关文章

  1. python网络编程-socket编程

     一.服务端和客户端 BS架构 (腾讯通软件:server+client) CS架构 (web网站) C/S架构与socket的关系: 我们学习socket就是为了完成C/S架构的开发 二.OSI七层 ...

  2. 揭开Socket编程的面纱

    对TCP/IP.UDP.Socket编程这些词你不会很陌生吧?随着网络技术的发展,这些词充斥着我们的耳朵.那么我想问: 1. 什么是TCP/IP.UDP? 2. Socket在哪里呢? 3. Sock ...

  3. winsock教程- windows下的socket编程(c语言实现)

    winsock教程- windows下的socket编程(c语言实现) 使用winsock进行socket 编程     这是一个学习windows下socket编程(c语言)的快速指南.这是因为一下 ...

  4. day8---多线程socket 编程,tcp粘包处理

    复习下socket 编程的步骤: 服务端:   1 声明socket 实例 server = socket.socket()  #括号里不写  默认地址簇使用AF_INET  即 IPv4       ...

  5. 转:Python 的 Socket 编程教程

    这是用来快速学习 Python Socket 套接字编程的指南和教程.Python 的 Socket 编程跟 C 语言很像. Python 官方关于 Socket 的函数请看 http://docs. ...

  6. PHP简单socket编程

    今天再看一点邮件发送的功能,所以了解一下socket变成,看到了一篇不错的文章,转发过来做个笔记吧. 原文链接:http://www.cnblogs.com/thinksasa/archive/201 ...

  7. Android应用开发提高篇(4)-----Socket编程(多线程、双向通信)

    链接地址:http://www.cnblogs.com/lknlfy/archive/2012/03/04/2379628.html 一.概述 关于Socket编程的基本方法在基础篇里已经讲过,今天把 ...

  8. 基于libevent, libuv和android Looper不断演进socket编程 - 走向架构师之路 - 博客频道 - CSDN.NET

    基于libevent, libuv和android Looper不断演进socket编程 - 走向架构师之路 - 博客频道 - CSDN.NET 基于libevent, libuv和android L ...

  9. Socket编程实践(6) --TCP服务端注意事项

    僵尸进程处理 1)通过忽略SIGCHLD信号,避免僵尸进程 在server端代码中添加 signal(SIGCHLD, SIG_IGN); 2)通过wait/waitpid方法,解决僵尸进程 sign ...

随机推荐

  1. 练习并熟练掌握交互式 SQL 语言

    哈工大数据库系统 实验:练习并熟练掌握交互式 SQL 语言   实验目的:基于给定的 OrderDB 数据库, 练习并熟练掌握交互式 SQL 语言实验环境:sql sever 2008 附:Order ...

  2. Vue-cli 配置开发环境让测试服务器监听所有IP

    //config/inex.js // Various Dev Server settingshost: '0.0.0.0', // can be overwritten by process.env ...

  3. 5. Import the project download from Git

    1.Recover eclipse project Copy .project from other project(You can new a project first in eclipse. T ...

  4. 库函数方式文件编程----fopen

    使用fopen等文件访问库函数编写应用程序,该应用程序实现文件的复制功能. 1.打开文件---fopen 函数功能:打开文件 头文件:#include<stdio.h> 函数原型:FILE ...

  5. foreach循环赋值问题

    foreach ($list as $key=>$val){ $data=array();//这一个一定要加上不然循环后,modify_one,modify_two都会赋值 if ($val[' ...

  6. 25. Green Living 绿色生活

    25. Green Living 绿色生活 ①We all know that humans are damaging the environment,but what can we do about ...

  7. Tomcat & SVN

    1. Tomcat简介 tomcat是一个web服务器,类似nginx,apache的http nginx,http只能处理html等静态文件(jpg) 网页分为静态网页(以.html或者.htm结尾 ...

  8. UVa 11384 Help is needed for Dexter (递归)

    题意:给定一个n表示1到n的序列,让你用最小的步数把这个序列都变为0,每个操作可以从序列中选择一个或多个个,同时减掉一个正整数,求最少的步数. 析:一看这个题,感觉挺高深的,但是静下心来想想,其实挺简 ...

  9. java程序设计基本概念 jvm

    JVM (1)对于字符串:其对象的引用都是存储在栈中的,如果是编译期已经创建好(直接用双引号定义的)的就存储在常量池中,如果是运行期(new出来的)才能确定的就存储在堆中.对于equals相等的字符串 ...

  10. C/C++的Name Mangling

    C语言 函数 1.void __CALLTYPE f();2.int __CALLTYPE f();3.int __CALLTYPE f(int);4.double __CALLTYPE f(int, ...