我在云服务器上运行了服务端
并尝试在本地运行客户端去连接服务端
可无法连接
以下为详细代码(PS:我开启了对应的防火墙)
#服务器端
import socket
import threading
con = threading.Condition()
host = input('input the servers ip address:')#我填的是内网IP
port = 2000
s = socket.socket()
print('Socket created')
s.bind((host, port))
s.listen(5)
print('Socket is listening')
data=b''
def NotifAll(sss):
global data
if con.acquire():#获取锁
data = sss
con.notifyAll()#放弃当前资源 通知其他线程从wait执行
con.release()#释放
def threadOut(con):#send
global data
while True:
if con.acquire():
con.wait()#放弃占用 等通知,若无,堵塞
if data:
try:
conn.send(data.encode())
con.release()
except:
con.release()
return
def threadIn(conn,nick):
while True:
try:
temp = conn.recv(1024)
if not temp:
conn.close()
return
NotifAll(temp)
print(data.decode())
except:
NotifAll(nick.decode()+'error')
print(data.decode())
return
while True:
conn, addr = s.accept()
print(str(addr[0]) + ',' + str(addr[1]) + 'is connect')
nick = conn.recv(1024)
NotifAll('Welcom'+nick.decode()+'to the room')
print(data)
conn.send(data.encode())
threading.Thread(target=threadOut, args=(con,)).start()
threading.Thread(target=threadIn, args=(conn, nick)).start()
#客户端
import socket
import threading
port = 2000
ip = '填的内网ip'
arr = (ip, port)
outStr=''
inStr=''
def client_send(sock):
global outStr
while True:
outStr = input('words')
sock.send(outStr.encode())
def client_accept(sock):
global inStr
while True:
try:
inStr = sock.recv(1024)
if not inStr:
break
if outStr != inStr:
print(inStr.decode())
except:
break
nick=input('words')
sock = socket.socket()
sock.connect((ip, port))
sock.send(nick.encode())
th_send = threading.Thread(target=client_send,args=(sock,))
th_send.start()
th_accept = threading.Thread(target=client_accept,args=(sock,))
th_accept.start()
你先在局域网里测试成功了,再搬到云服务器上去。
除了在广域网上会产生分包粘包,你需要修改接收函数之外,能不能连上跟在哪关系不大。
而且云服务器上有好几重防火墙,你都要一一打开才行
系统本身有防火墙,然后IE界面上也有防火墙设置