网络编程分为。TCP和UDP,TCP为可靠连接,UDP为不可靠连接。仅用代码来展示。
import socket
import threading
client = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
#元组第一个元素为客户端要连接的服务器的IP地址,第二个参数为服务器的端口号
client.connect(("10.0.122.158", 8080))
# 创建接收线程
def run1(c):
while True:
data = c.recv(1024).decode("utf-8")
print("服务器说:" + data)
th1 = threading.Thread(target=run1, args=(client,))
th1.start()
def run2(c):
while True:
# 456#你真坏
data = input("请输入要发送给服务器的消息:")
data = "talk#" + data
c.send(data.encode("utf-8"))
th2 = threading.Thread(target=run2, args=(client,))
th2.start()
client.send("register#123#sunck".encode("utf-8"))
th1.join()
th2.join()
import socket
import threading
from person import Person
usersDict = {}
# 1、创建socket
# AF_INET:表示使用IPv4
# SOCK_STREAM:表示TCP协议
server = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
#2、绑定
# 参数为一个元组,元组第一个元素为本机ip,第二元素为端口号,使用8000以上的值,最大使用到65535
server.bind(("10.0.122.158", 8080))
#3、监听,设置最多连接数
server.listen(50)
def run(clientSocket, clientAddr):
while True:
# register#123#sunck
# talk#456#sunck nice
data = clientSocket.recv(1024).decode("utf-8")
#解析数据
arr = data.split("#")
if arr[0] == "register":
per = Person(clientSocket, arr[1], arr[2])
usersDict[arr[1]] = per
elif arr[0] == "talk":
#找到当前用户的用户名
name = None
for account, per in usersDict.items():
if per.clientSocket is clientSocket:
name = per.name
break
#找到好友
per = usersDict.get(arr[1])
friendScoket = per.clientSocket
# 给好友发送消息
# sunck说:你真帅
friendScoket.send((name+":"+arr[2]).encode("utf-8"))
#4、等待客户端的链接
while True:
print("等待链接……")
#客户端连接成功返回客户端的socket和客户端的IP地址
clientSocket, clientAddr = server.accept()
print(clientAddr, "客户链接成功")
#创建线程交互
th = threading.Thread(target=run, args=(clientSocket, clientAddr))
th.start()
class Person(object):
def __init__(self, clientSocket, account, name):
self.clientSocket = clientSocket
self.account = account
self.name = name
import socket
client = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
while True:
data = input("输入要发送的信息:")
client.sendto(data.encode("utf-8"), ("10.0.122.158", 8080))
以下方式不建议使用
client = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
client.connect(("10.0.122.158", 8081))
while True:
data = input("输入要发送的信息:")
client.send(data.encode("utf-8"))
# TCP是建立可靠连接,并且通信双方都可以以流的形式发送数据。相对TCP,UDP则是面向无连接的协议
# 使用UDP协议时,不需要建立连接,只需要知道对方的IP地址和端口号,就可以直接发送数据包,但是能不能到达就不知道了
# 虽然UDP传输数据不可靠,但是它的优点是和TCP相比较,速度快,对于不要求可靠到达的数据,可以使用UDP,广播类型的软件经常使用
import socket
server = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
server.bind(("10.0.122.158", 8081))
while True:
data, addr = server.recvfrom(1024)
print("来自", addr, "的消息:", data.decode("utf-8"))