- 1 socket的使用
- 1.1 TCP方法
- 1.2 UDP方法
- 2 局域网内连接
- 2.1
- 总结
1 socket的使用 1.1 TCP方法
在socket中使用socket.socket建立会话,如果是服务器,需要绑定服务器地址和端口号,然后进行循环监听,当有客户端连接时再接收数据。
代码如下:
import socket
def tcpServer(address,port=8686):
# stream代表tcp方式
server = socket.socket(socket.AF_INET,socket.SOCK_STREAM)
server.bind((address, port))
server.listen()
print('Server start')
while True:
client, ad = server.accept()
data = client.recv(1024)
# 处理接收到的数据
print('receive from : ',ad, ' data: ', data)
# 回传数据给客户端
client.send('I have received your data'.encode('utf-8'))
# 如果接收到close则关闭服务器
c =[chr(data[i]) for i in range(5)]
if ''.join(c) == 'close':
break
server.close()
print('Server close')
if __name__ == "__main__":
address = "localhost"
port = 8686
tcpServer(address,port)
在客户端,使用send方法向服务器发送一次数据
import socket
def tcpSend(address,port,message):
server = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
server.connect((address, port))
server.send(message.encode("utf-8"))
data = server.recv(1024)
server.close()
return data
if __name__ == '__main__':
address = 'localhost'
port = 8686
message = 'message'
receive = tcpSend(address,port,message)
print('receive: ', receive)
1.2 UDP方法
UDP方法面向无连接,在socket设置会话的属性时参数修改为socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
服务器端接收数据是一次接收数据和端口地址,代码如下:
import socket
def udpServer(address,port=8686):
# dgram代表udp方式
server = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
server.bind((address, port))
print('Server start')
while True:
data, ad = server.recvfrom(1024)
# 处理接收到的数据
print('receive from : ', ad, ' data: ', data)
server.sendto('I have received your data'.encode('utf-8'),ad)
c = [chr(data[i]) for i in range(5)]
if ''.join(c) == 'close':
break
server.close()
print('Server close')
if __name__ == "__main__":
address = "localhost"
port = 8686
udpServer(address,port)
客户端
import socket
def udpSend(address,port,message):
server = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
server.connect((address, port))
server.send(message.encode("utf-8"))
data = server.recv(1024)
server.close()
return data
if __name__ == '__main__':
address = 'localhost'
port = 8686
message = 'message'
receive = tcpSend(address,port,message)
print('receive: ', receive)
2 局域网内连接
当将服务器ip地址替换address时,在两台主机上测试,往往会发生这样的错误
ConnectionResetError: [WinError 10054] 远程主机强迫关闭了一个现有的连接
其中一个很大的原因就是个人主机对局域网的连接有防火墙设置。
解决方法:在服务器端通过 控制面板->系统和安全->Windows Defender 防火墙->高级设置->入站/出站规则(入站和出站都要),找到文件和打印机共享(回显请求 - ICMPv4-In/Out) 域中,启用规则,域表示当前局域网。客户端无需设置,即可实现两台主机的测试。
在客户端,接收来自服务器的数据后,未关闭会话时不能print(data),会导致输入输出错误。
def tcpSend(address,port,message):
server = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
server.connect((address, port))
server.send(message.encode("utf-8"))
data = server.recv(1024)
print(data) # 会在这里陷入等待
server.close()
return data
总结
简述了TCP和UDP两种方法的应用,以及解决服务器端防火墙导致局域网内两台主机不能成功连通的问题。但是对于服务器还有更多的内容需要设置,没有学,在此不深究。


![python: 使用socket实现局域网不同主机通信。解决ConnectionResetError: [WinError 10054] 远程主机强迫关闭了一个现有的连接。 python: 使用socket实现局域网不同主机通信。解决ConnectionResetError: [WinError 10054] 远程主机强迫关闭了一个现有的连接。](http://www.mshxw.com/aiimages/31/283106.png)
