'''
网络:计算机与计算机之间的通信
协议:
TCP:可靠,有状态,长连接的协议(具有应答机制)
主叫方 被叫方
服务套接字(socket)
客户套接字 == 客户套接字
UDP:不可靠,无连接(类似快递)
HTTP
FTP
POP3
SMTP
'''
Socket:
网络上的两个程序通过一个双向的通讯连接实现数据的交换,这个双向链路的一端称为一个Socket。Socket通常用来实现客户方和服务方的连接。Socket是TCP/IP协议的一个十分流行的编程界面,一个Socket由一个IP地址和一个端口号唯一确定.但是,Socket所支持的协议种类也不光TCP/IP一种,因此两者之间是没有必然联系的。在Java环境下,Socket编程主要是指基于TCP/IP协议的网络编程。
Socket编程思路
----------------------------华丽的分割线---------------------------
---------------------------一对一聊天demo---------------------------
---被叫方(也叫服务端)
import socket
import threading
#创建服务套接字
ss=socket.socket(socket.AF_INET,socket.SOCK_STREAM)
'''
服务套接字绑定主机,绑定端口号
如果主机为"0.0.0.0",所有人可以连接
如果主机为"localhost",只能自己访问
如果主机为一个指定ip,只能该IP或其子网IP访问
'''
ss.bind(("0.0.0.0",9999))
ss.listen(5) #设置最大连接数
c=ss.accept() #如果没有客户端连接,线程阻塞
#ss.accept()返回连接者的对象及连接者的Ip
print("我被人连接啦!!")
def mydecv(c):
while True:
msg = c.recv(1024) #接受发送的utf-8数据,utf-8一个字节为3
print(msg.decode()) #接受数据时需要解析
threading._start_new_thread(mydecv,(c[0],))
while True:
msg = input()
c[0].send(msg.encode())
---主叫方(也叫客户端)
import socket
import threading
c=socket.socket(socket.AF_INET,socket.SOCK_STREAM)
# c.connect(("192.168.66.180",9999))
c.connect(("192.168.12.53",9999))#连接服务端,不成功抛出异常
print("我已经连接到服务端")
def mydecv(c):
while True:
msg = c.recv(1024)
print(msg.decode())
threading._start_new_thread(mydecv,(c,))
while True:
msg = input()
c.send(msg.encode())
--------------多人聊天demo-------------------------
---chatServer
import socket
import threading
ss=socket.socket(socket.AF_INET,socket.SOCK_STREAM)
ss.bind(("0.0.0.0",9999))
ss.listen(10)
msg=None
lock=threading.Lock()
con=threading.Condition(lock)
def server_recv(c,a):
global msg
while True:
str1=c.recv(1024)
con.acquire()
msg=str(a)+str1.decode()
con.notify_all()
con.release()
def server_send(c,a):
global msg
while True:
con.acquire()
con.wait()
con.release()
c.send(msg.encode())
while True:
c,a=ss.accept() #c:连接者的对象,a:连接者的IP
print("c:{0},a:{1}".format(c,a))
threading._start_new_thread(server_recv,(c,a))
print("recv.....")
threading._start_new_thread(server_send,(c,a))
print("send.....")
---主叫方(也叫客户端)
import socket
import threading
c=socket.socket(socket.AF_INET,socket.SOCK_STREAM)
# c.connect(("192.168.66.180",9999))
c.connect(("192.168.12.53",9999))#连接服务端,不成功抛出异常
print("我已经连接到服务端")
def mydecv(c):
while True:
msg = c.recv(1024)
print(msg.decode())
threading._start_new_thread(mydecv,(c,))
while True:
msg = input()
c.send(msg.encode())