话不多说,直接上代码:
这是C#这边作为客户端
using System; // 这些是需要用到的库
using System.Net.Sockets;
using System.Net;
using System.Windows.Forms;
using System.IO;
namespace qiang
{
public partial class Form1 : Form
{
Socket tcpClient = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp); // 初始化创建,绑定内网、流、TCP协议
EndPoint remoteIp = new IPEndPoint(IPAddress.Parse("127.0.0.1"), 8888); // 获取ip、端口(ip和端口要和python中一致)
public Form1()
{
InitializeComponent();
}
private void lian_Click(object sender, EventArgs e) // 这是连接按钮
{
tcpClient.Connect(remoteIp); // 与python那边服务端连接
}
private void send_Click(object sender, EventArgs e) // 这是发送按钮
{
FileStream FileStream = new FileStream("D:\\picture\\dabo\\xixi.jpg", FileMode.Open); // 以文件流打开一个图片
byte[] byData = new byte[FileStream.Length]; // 二进制格式存储
FileStream.Read(byData, 0, byData.Length); // 读取图片的二进制数据到发送的缓存区
tcpClient.SendTo(byData, remoteIp); // 发送图片
FileStream.Close(); // 关闭文件流传输
}
private void tui_Click(object sender, EventArgs e) // 这是退出按钮
{
tcpClient.Close(); // 结束通讯
}
}
}
这是python这边作为服务端
import socket
import cv2
def get_host_ip(): # 获得ip
try:
s = socket.socket(socket.AF_INET, socket.SOCK_DGRAM) # 初始化创建(ipv4和UDP协议)
s.connect(('127.0.0.1', 80)) # 先自己socket通讯注册一个ip和端口(随便写一个ipv4的和端口)
ip = s.getsockname()[0] # 取得通讯的ip
finally:
s.close()
return ip
ip_port = (get_host_ip(), 8888) # 先自己注册一个(随便写一个端口)
sk = socket.socket() # 创建套接字
sk.bind(ip_port) # 申请一个(空闲可以使用的端口)
sk.listen(5) # 设置这个服务端可连接的客户端数量
print('启动socket服务,等待客户端连接')
conn, address = sk.accept() # 等待连接,此处自动阻塞
files = open("enmm.jpg", 'wb') # 二进制写入
while True:
data = conn.recv(1024) # 指定最大接收量
files.write(data) # 读取数据
if not data:
print("图片接收完毕")
break
files.close() # 关闭
conn.close()
img = cv2.imread("./enmm.jpg") # 用cv2打开图片
cv2.imshow('dabo', img)
cv2.waitKey()
这是我设计的窗口,其中有一些是练习测试时剩下的,大家只要管三个按钮即可,就依次点击(连接-发送-退出)
就即可在python这边窗口看到图片了
这是我第一次学习的结果,代码还不是很完善,希望各位能在评论区指出我的不足