一、UDP
1.服务端
# !/usr/bin/env python
from socket import * #导入模块
HOST = '127.0.0.1' # ip地址
PORT = 9999 # 端口号
Addr=(HOST,PORT)
s = socket(AF_INET, SOCK_DGRAM) #创建UDP连接
s.bind((HOST, PORT)) #绑定服务器地址
#s.bin(Addr)
print('waiting for message..') #打印
while True: #服务器无限循环
print('等待连接......')
data, address = s.recvfrom(1024) #接受客户的连接
print(data, address)
#s.sendto(bytes('this is the UDP server',address))
#s.send(bytes(address,"utf-8"))
message=bytes('this is the UDP server','utf-8') # 将消息转为字节类型
s.sendto( message,address) # 发送UDP数据
#conn.send(bytes("connected from %s:%s." % addr, "utf-8")) # 发送给客户端
s.close() #关闭服务器连接
2.客户端
from socket import *
HOST = '127.0.0.1'
PORT = 9999
s = socket(AF_INET, SOCK_DGRAM)
s.connect((HOST, PORT))
while True:
message = input('send message:>>')
if not message:
break
s.sendall(bytes(message,'utf-8'))
data = s.recv(1024)
print(data)
s.close()
3.运行结果
服务端
waiting for message..
b'hello' ('127.0.0.1', 63491)
b'hi' ('127.0.0.1', 63491)
客户端
send message:>>hello
b'this is the UDP server'
send message:>>hi
b'this is the UDP server'
send message:>>
二、TCP
1.代码:socket有客户端和服务端,先写服务端,服务端一般内容比较多。
import socket # 导入socket模块
# 建立一个服务端
sk = socket.socket() # 创建socket对象
print(sk) # 输出socket对象参数
HOST = '127.0.0.1' #指定ip
PORT = 2222 #侦听端口
BUFSIZ = 1024 #缓存大小
ADDR = (HOST,PORT) #套接字
sk.bind(ADDR) #套接字ip端口进行绑定
sk.listen(5) #等待客户端连接,连接等待数,默认5
print("waiting...")
while True: # 服务器无限循环,conn就是客户端连接过来而在服务端为期生产的一个链接实例
conn,addr = sk.accept() # 建立客户端连接,并返回新的套接字和IP地址
ip,port = addr # 返回IP地址和端口号
print("Got connection from",addr)
conn.send(bytes("connected from %s:%s." %addr,"utf-8")) #发送给客户端
while True: # 通讯无限循环
data = conn.recv(BUFSIZ) #接受数据
if not data:
break #直接回车退出本次连接
print(data) #打印接收到的数据
conn.send(data) #然后再发送数据
conn.close() #关闭连接
s.close() #关闭连接
2.客户端
import socket
#客户端
HOST = '127.0.0.1'
PORT = 2222
BUFSIZ = 1024
ADDR = (HOST,PORT)
cl = socket.socket()
cl.connect(ADDR) #建立一个连接,连接到本地的2222端口
print(cl.recv(BUFSIZ)) #打印收到的消息
while True:
inp = input(">>>") #输入数据
if not inp: #忽略空格回车
continue
cl.send(bytes(inp,"utf-8")) #发送消息
print(cl.recv(BUFSIZ)) #打印收到的消息
cl.close() #关闭这个连接
3.运行结果
<socket.socket fd=504, family=AddressFamily.AF_INET, type=SocketKind.SOCK_STREAM, proto=0>
waiting...
Got connection from ('127.0.0.1', 60331)
b'hello'
b'hi'
b'python'
b'connected from 127.0.0.1:60331.'
>>>hello
b'hello'
>>>hi
b'hi'
>>>python
b'python'
>>>
三、sockerserver
1.服务端
#coding:utf-8
import socketserver #导入socket server,能实现并发
#并发聊天
class MyServer(socketserver.BaseRequestHandler): # 请求处理类,创建一个继承自 SocketServer.BaseRequestHandler 的类
print("服务端启动...")
def handle(self): # 定义handle方法
while True:
conn = self.request # 创建一个线程用来处理请求
print (self.client_address) # 打印ip和端口号
while True:
client_data=conn.recv(1024) # 接收客户端消息
print (str(client_data,"utf8")) # 打印接收到的客户端的消息
print ("waiting...")
server_response=input(">>>")
conn.sendall(bytes(server_response,"utf8")) #把消息发给客户端
conn.close() #关闭连接
if __name__ == '__main__': # server.py文件被直接运行时,以下代码块将被运行
server = socketserver.ThreadingTCPServer(('127.0.0.1',2223),MyServer) # 启动ThreadingTCPServer
server.serve_forever() # 处理多个请求,一直执行
2.客户端
#coding:utf-8
import socket
ip_port = ('127.0.0.1',2223) #套接字
sk = socket.socket()
sk.connect(ip_port) #建立连接
print ("客户端启动:")
while True:
inp = input('>>>')
sk.sendall(bytes(inp,"utf-8")) #把消息发送给服务端
if inp == 'exit':
break
server_response=sk.recv(1024) #接受消息
print (str(server_response,"utf-8"))
sk.close() #关闭连接
3.运行结果
服务端启动...
('127.0.0.1', 60314)
hello
waiting...
>>>hi
I
waiting...
>>> i
'm a boy.
waiting...
>>>
客户端启动:
>>>hello
hi
>>>I'm a boy.
i
>>>