单用户连接:
# coding:utf-8
# server端程序
import socket # 导入socket 模块address = ('0.0.0.0', 50000) # IP地址和端口号
print('Waiting for a client now !')
server = socket.socket(socket.AF_INET, socket.SOCK_STREAM) # 创建一个空的套接字,socket.AF_INET表示创建一个IP套接字;
# socket.SOCK_STREAM表示流式socket,TCP模式;sock_DGRAM表示数据报式socket,UDP模式
server.bind(address) # 绑定(监听这个IP地址和端口的所有数据)到这个套接字上
server.listen(5) # 表示最多可以和5个客户端连接,超过5个就会拒绝
# 调用accept方法时,socket会时入“waiting”状态。客户请求连接时,方法建立连接并返回服务器。
# accept方法返回一个含有两个元素的元组(connection,address)。
# 第一个元素connection是新的socket对象,服务器必须通过它与客户通信;第二个元素address是客户的Internet地址
client, addr = server.accept()
data = client.recv(1000) # 指定最大可以接受消息长度为1000字节
print("Client:", client, "Said", data) # 输出client客户端信息以及接收到的数据data
client.sendall('hello'.encode("utf8")) # 发送数据
client.close() # 关闭
server.close()
# coding:utf-8
# client端程序
import socket # 导入 socket 模块try:address = ('127.0.0.1', 50000)client = socket.socket(socket.AF_INET, socket.SOCK_STREAM)client.connect(address) # 与指定地址建立连接print("Connection succeeded!")client.sendall('Hi!'.encode("utf8")) # 发送数据data = client.recv(1000)print("Server reply", data.decode("utf8"))client.close()
except:print("Connection failed.")
聊天程序
Server.py
# 聊天程序
import socket
# socket Sever,首先做了绑定,在server上不停的监听,当监听到有一个新生成的连接,就绑定一个socket,因此后续的发送是socket,而不是server
server = socket.socket(socket.AF_INET,socket.SOCK_STREAM)
server.bind(('0.0.0.0',9999)) # bind必须绑定tuple。 如果绑定127.0.0.1,会导致通过局域网的ip无法访问
print('Waiting for a client now !')
server.listen(5)
sock,addr = server.accept() # 全局的接收,只能接收一次请求,接受以后,双方做数据交流,server用来监听,socket用于用户连通while True: # 接受后,不可以closedata = sock.recv(1024) # 一次获取1KB数据print(data.decode("utf8"))re_data = input() # 通过手工输入来做交互sock.send(re_data.encode("utf8"))
Client.py
import socket
# 初始化的client就是我们一直要用到的client,因此只需要一个client即可
client = socket.socket(socket.AF_INET,socket.SOCK_STREAM)
client.connect(("127.0.0.1",9999)) # 连接本地服务器
print("Connection succeeded!")
while True: # 接受后,不可以closere_data = input() # 通过手工输入来做交互client.send(re_data.encode("utf8"))data = client.recv(1024) # 由发起端先发送数据过去,从client端请求数据。 而服务器端是先recv数据print(data.decode("utf8")) # 打印放在recv之后
多用户聊天
Server.py
# 聊天程序
import socket
import threading
# socket Sever,首先做了绑定,在server上不停的监听,当监听到有一个新生成的连接,就绑定一个socket,因此后续的发送是socket,而不是server
server = socket.socket(socket.AF_INET,socket.SOCK_STREAM)
server.bind(('0.0.0.0',9999)) # bind必须绑定tuple。 如果绑定127.0.0.1,会导致通过局域网的ip无法访问
print('Waiting for a client now !')
server.listen(5)
# sock,addr = server.accept() # 全局的接收,只能接收一次请求,接受以后,双方做数据交流,server用来监听,socket用于用户连通
# 目前,一次只能连接一个client,如何实现多用户聊天,同时接入server? 就需要用到多线程,在线程里面进行循环。主线程不停的接收其它请求def handle_sock(sock,addr):while True: # 接受后,不可以closedata = sock.recv(1024) # 由发起端先发送数据过去,从client端请求数据。 而服务器端是先recv数据print(data.decode("utf8")) # 打印放在recv之后re_data = input() # 通过手工输入来做交互sock.send(re_data.encode("utf8"))while True: # 接受后,不可以closesock,addr = server.accept() # 接收到新请求时,立即交给线程,由线程进行处理新的socket。# 用线程去处理新接收的连接(用户)client_thread = threading.Thread(target=handle_sock,args=(sock,addr)) # target传递的一定是函数的名称,而不是函数的调用client_thread.start() # 启动线程
Client-x.py
# client-n.py
import socket
# 初始化的client就是我们一直要用到的client,因此只需要一个client即可
client = socket.socket(socket.AF_INET,socket.SOCK_STREAM)
client.connect(("127.0.0.1",9999)) # 连接本地服务器
print("Connection succeeded!")
while True: # 接受后,不可以closere_data = input() # 通过手工输入来做交互client.send(re_data.encode("utf8"))data = client.recv(1024) # 由发起端先发送数据过去,从client端请求数据。 而服务器端是先recv数据print(data.decode("utf8")) # 打印放在recv之后
先运行Server.py, 提示“Waiting for a client now !"
运行Client-1.py, 提示Connection succeeded!
在Client-1端,输入“Client-1”, 查看Server 端,发现Server端已经收到“Client-1”
在Server端,输入“Server-1”,查看Client端,发现Client端收到了“Server-1”
再运行Client-2.py,提示Connection succeed!
在Client-2端,输入“Client-2”, 查看Server 端,发现Server端已经收到“Client-2”
在Server端,输入“Server-2”,查看Client-2端,发现Client端收到了“Server-2”;查看Client-1端,发现Client端没有收到“Server-2”