目录
- 1 socket的使用
- 1.1 TCP方法
- 1.2 UDP方法
- 2 局域网内连接
- 2.1
- 总结
1 socket的使用
1.1 TCP方法
在socket中使用socket.socket
建立会话,如果是服务器,需要绑定服务器地址和端口号,然后进行循环监听,当有客户端连接时再接收数据。
代码如下:
import socketdef 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':breakserver.close()print('Server close')if __name__ == "__main__":address = "localhost"port = 8686tcpServer(address,port)
在客户端,使用send
方法向服务器发送一次数据
import socketdef 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 dataif __name__ == '__main__':address = 'localhost'port = 8686message = 'message'receive = tcpSend(address,port,message)print('receive: ', receive)
1.2 UDP方法
UDP方法面向无连接,在socket
设置会话的属性时参数修改为socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
服务器端接收数据是一次接收数据和端口地址,代码如下:
import socketdef 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':breakserver.close()print('Server close')if __name__ == "__main__":address = "localhost"port = 8686udpServer(address,port)
客户端
import socketdef 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 dataif __name__ == '__main__':address = 'localhost'port = 8686message = 'message'receive = tcpSend(address,port,message)print('receive: ', receive)
2 局域网内连接
当将服务器ip地址替换address
时,在两台主机上测试,往往会发生这样的错误
ConnectionResetError: [WinError 10054] 远程主机强迫关闭了一个现有的连接
其中一个很大的原因就是个人主机对局域网的连接有防火墙设置。
解决方法:在服务器端通过 控制面板->系统和安全->Windows Defender 防火墙->高级设置->入站/出站规则(入站和出站都要),找到文件和打印机共享(回显请求 - ICMPv4-In/Out) 域
中,启用规则,域表示当前局域网。客户端无需设置,即可实现两台主机的测试。
2.1
在客户端,接收来自服务器的数据后,未关闭会话时不能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两种方法的应用,以及解决服务器端防火墙导致局域网内两台主机不能成功连通的问题。但是对于服务器还有更多的内容需要设置,没有学,在此不深究。