网络编程之--socket实现python和java通信
程序员文章站
2022-03-24 11:36:55
...
最近因为项目需求,要求能在python和java之间传输数据,所以了解了一下socket,通过使用socket在两种语言之间传输数据。期间遇见了不少坑,记录一下,算是给后来人一个借鉴(说起来都是泪啊 。。。。。)
1. 先说一下我要干什么,我通过base64编码将图片从前端传到了服务器(java写的网站),然后需要把图片数据传输到python中实现一些功能。其中使用python作为服务端,java作为客户端。服务端(python)
使用python的socket模块写客户端的时候到时没什么大问题。按照基本步骤来就行了(就当读者已经了解socket的大致运作方式,下面给出代码实现,有注释…)
import socket
# 在构建socket的时候需要用到ip和端口,必须是元组的形式。
# 另外,因为是本机上的两个程序通信,所以设置成localhost,
# 如果要和网络上的其他主机进行通信,则填上相应主机的ip地
# 址,端口的话随便设置一个,不要和已知的一些服务冲突就行
adress = ('localhost', 9999)
# 创建socket对象,同时设置通信模式,AF_INET代表IPv4,SOCK_STREAM代表流式socket,使用的是tcp协议
server = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
# 绑定到我们刚刚设置的ip和端口元组,代表我们的服务运行在本机的9999端口上
server.bind(address)
# 开始监听,5位最大挂起的连接数
server.listen(5)
# 无限循环,实现反复接收请求
while True:
# accept()方法被动接受客户端连接,阻塞,等待连接. client是客户端的socket对象,可以实现消息的接收和发送,addr表示客户端的地址
client, addr = server.accept()
data = client.recv(13) # 代表从发过来的数据中读取13byte的数据
data1 = client.recv(4) # 再接收4byte数据
client.sendall(b'1') # 发送消息给客户端,发送的消息必须是byte类型
client.close() # 关闭连接
server.close()
呼,终于写完了,感觉注释应该很详细了吧。
我必须要再说一点很重要的东西:服务端每次接受的数据是有限制的,也就是说文件大一点的话你要分好多次接收,比如我要传输图片的话只接收一次是根本接收不全的,每次收到的数据都少很多。一定要注意!一定要注意!一定要注意!
附上我的解决代码(献丑了 ???? )
img_base64 = b''
max_size = 1024 # 设置每次接收1024byte,当然也可以更大,只要不超过缓冲区大小就行
sum = img_length # img_length是我的图片数据的长度
while sum >= max_size: # 每次接收1024,直到剩下的数据小于1024
img_base64 = img_base64 + conn.recv(max_size)
sum -= max_size
if sum != 0: # 如果还剩下数据的话就接收完
mg_base64 = img_base64 + conn.recv(sum)
python服务端的代码就到此为止了。。
但是 ! ! !, 我还有问题要说,我原来是想传过来base64编码的图片数据,然后用python解码然后转换成图片,但是没搞成功,不是出现Incorrect padding异常就是解码后的数据不能正常使用,着实是没搞懂(黑人问号脸???)是python的base64太垃圾了?还是我太垃圾了?(沮丧。。)
然后把解码base64图片的工作放在了java中就行了。。。
客户端(java)
还没想好,整理一下思路再写。。。
下一篇: php中使用protobuffer
推荐阅读
-
python网络编程之TCP通信实例和socketserver框架使用例子
-
Python网络编程使用select实现socket全双工异步通信功能示例
-
java网络编程_java网络编程(2)socket通信案例(TCP和UDP)
-
Java Socket实现基于TCP和UDP多线程通信
-
linux网络编程之用socket实现简单客户端和服务端的通信(基于TCP)
-
基于Java的Socket类Tcp网络编程实现实时聊天互动程序(二):Tcp通信的过程及代码编写
-
网络编程(InetAddress类、Socket和ServerSocket、实现客户端和服务器之间的双向通信)
-
linux网络编程之用socket实现简单客户端和服务端的通信(基于UDP)
-
python网络编程之TCP通信实例和socketserver框架使用例子
-
python网络编程之TCP通信实例和socketserver框架使用例子