Socket发送图片

博客给出服务器端和客户端关于图片传输的代码。服务器端通过文件流读取图片数据并以字节形式发送,客户端接收字节数据,利用内存流创建图片对象并显示。涉及socket、byte和image等信息技术相关内容。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

服务器端(发送图片)代码如下:
With Me.OpenFileDialog1
            .AddExtension = True
            .CheckFileExists = True
            .CheckPathExists = True
            .Filter = "位图(*.bmp)|*.bmp|jpg图象(*.jpg)|*.jpg"
            .ShowDialog()
            Name = .FileName
        End With
        Dim filestream As New IO.FileStream(Name, IO.FileMode.OpenOrCreate)
        Dim msg(filestream.Length) As Byte
        filestream.Read(msg, 0, msg.Length - 1) '读取文件中的数据,然后保存到msg中
        clientsocket.Send(msg, msg.Length, SocketFlags.None)
        filestream.Close() '关闭文件流


客户端代码(接收图片)
 Public Sub socketReceive()    '接收图片的函数
        While (True)
            Dim recvbytes(2000000) As Byte
            clientsocket.Receive(recvbytes, recvbytes.Length,SocketFlags.None)
            '使用内存流创建image对象    
            Dim mStream As IO.MemoryStream = New IO.MemoryStream(recvbytes)  
            Me.PictureBox1.Image = Image.FromStream(mStream)
             mStream.Close()                
        End While
    End Sub

要在 C 语言中使用 Socket 发送图片服务器,可以按照以下步骤进行: 1. 打开图片文件并读取数据 首先,需要打开图片文件,并读取其中的数据。可以使用标准的 C 文件操作函数,如 `fopen()`、`fread()` 和 `fclose()` 等。例如,可以使用以下代码打开一个名为 `image.jpg` 的图片文件,并读取其中的数据: ```c FILE *fp; fp = fopen("image.jpg", "rb"); if (fp == NULL) { perror("Error opening file"); return 1; } fseek(fp, 0, SEEK_END); long file_size = ftell(fp); rewind(fp); char *file_data = malloc(file_size); fread(file_data, 1, file_size, fp); fclose(fp); ``` 2. 创建 Socket 连接 接下来,需要创建 Socket 连接,以便将数据发送服务器。可以使用标准的 C Socket API 函数,如 `socket()`、`connect()` 和 `send()` 等。例如,可以使用以下代码创建一个 TCP Socket 连接,并连接到名为 `example.com` 的服务器的端口 `8080`: ```c #include <sys/socket.h> #include <netinet/in.h> #include <arpa/inet.h> int sockfd; struct sockaddr_in server_addr; sockfd = socket(AF_INET, SOCK_STREAM, 0); if (sockfd < 0) { perror("Error creating socket"); return 1; } server_addr.sin_family = AF_INET; server_addr.sin_port = htons(8080); server_addr.sin_addr.s_addr = inet_addr("example.com"); if (connect(sockfd, (struct sockaddr *) &server_addr, sizeof(server_addr)) < 0) { perror("Error connecting to server"); return 1; } ``` 3. 发送数据 一旦连接成功,就可以使用 `send()` 函数将图片数据发送服务器。需要注意的是,由于图片数据可能比较大,不能一次性发送全部数据,需要分多次发送。可以使用循环将数据分批发送。例如,可以使用以下代码将图片数据分批发送: ```c int bytes_sent = 0; int bytes_left = file_size; while (bytes_sent < file_size) { int bytes_to_send = bytes_left < 1024 ? bytes_left : 1024; int ret = send(sockfd, file_data + bytes_sent, bytes_to_send, 0); if (ret < 0) { perror("Error sending data"); return 1; } bytes_sent += ret; bytes_left -= ret; } ``` 4. 关闭 Socket 连接 最后,需要关闭 Socket 连接。可以使用 `close()` 函数关闭连接。例如,可以使用以下代码关闭连接: ```c close(sockfd); ``` 完整代码示例: ```c #include <stdio.h> #include <stdlib.h> #include <sys/socket.h> #include <netinet/in.h> #include <arpa/inet.h> int main() { FILE *fp; fp = fopen("image.jpg", "rb"); if (fp == NULL) { perror("Error opening file"); return 1; } fseek(fp, 0, SEEK_END); long file_size = ftell(fp); rewind(fp); char *file_data = malloc(file_size); fread(file_data, 1,
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值