C# socket 客户端和服务器端 发送接收图片 C# socket 客户端如何发送Image到服务器端,服务器端如何接收image显示,请熟悉socket编程的高手帮忙提供代码 我是初学socket分不多了 抱歉! 解决方案 » 免费领取超大流量手机卡,每月29元包185G流量+100分钟通话, 中国电信官方发货 首先将图片序列化成内存流,然后调用SOCKET的SEND函数发送,接收端调用SOCKET的接收函数接收即可!接收完成后将内存流反序列化成图片! //TcpServer的辅助类using System;using System.IO;using System.Text;namespace TcpServer{ /// <summary> /// 控制台应用程序的帮助类PictureHelper /// </summary> public static class PictureHelper { //LIST请求:在字节数组中返回文件列表 public static byte[] GetFileListBytes() { string[] files = PictureHelper.GetFileList(); //调用GetFileList函数获取文件列表 StringBuilder responseMessage = new StringBuilder(); foreach (string s in files) { responseMessage.Append(s); responseMessage.Append(":"); } byte[] responseBuffer = Encoding.ASCII.GetBytes(responseMessage.ToString()); return responseBuffer; } // 以字符形式返回所有文件的列表, 供GetFileListBytes调用 private static string[] GetFileList() { string[] files = Directory.GetFiles(Properties.Settings.Default.PictureDirectory); for (int i = 0; i < files.Length; i++) { files[i] = Path.GetFileName(files[i]); } return files; } //返回图片文件的字节数组 public static byte[] GetPictureBytes(string filename) { FileInfo fileInfo = new FileInfo(filename); byte[] buffer = new byte[fileInfo.Length]; using (FileStream stream = fileInfo.OpenRead()) { stream.Read(buffer, 0, buffer.Length); } return buffer; } }}//服务器端#region Using directivesusing System;using System.Text;using System.IO;using System.Net;using System.Net.Sockets;#endregionnamespace TcpServer{ class Program { static void Main(string[] args) { //创建TcpListener对象, 并指定端口号 System.Net.Sockets.TcpListener listener = new System.Net.Sockets.TcpListener(IPAddress.Any, 8888); listener.Start(); //启动监听 while (true) { const int bufferSize = 256; TcpClient client = listener.AcceptTcpClient(); //等待客户机与它连接 NetworkStream clientStream = client.GetStream(); //返回一个NetworkStream对象 byte[] buffer = new byte[bufferSize]; int readBytes = 0; readBytes = clientStream.Read(buffer, 0, bufferSize); //将网络流中的数据读入到字节数组 string request = Encoding.ASCII.GetString(buffer).Substring(0, readBytes); //将字节级数转换为字符串 //根据请求字符串, 把一个图片文件列表或图片字节返回给客户机 if (request.StartsWith("LIST")) { byte[] responseBuffer = PictureHelper.GetFileListBytes(); //得到文件列表的字节数组形式 clientStream.Write(responseBuffer, 0, responseBuffer.Length); //写入网络流, 发回客户机 } else if (request.StartsWith("FILE")) { string[] requestMessage = request.Split(':'); string filename = requestMessage[1]; //requestMessage[0]="FILE" requestMessage[1]=文件名 //读出指定的图像文件的数据 byte[] data = File.ReadAllBytes(Path.Combine(Properties.Settings.Default.PictureDirectory, filename)); clientStream.Write(data, 0, data.Length); //写入网络流, 发回客户机 } else { // 未知的请求 } clientStream.Close(); //关闭连接 } } }}#region Using directivesusing System;using System.Collections.Generic;using System.ComponentModel;using System.Data;using System.Drawing;using System.Windows.Forms;using System.Net;using System.Net.Sockets;using System.IO;using System.Text;#endregionnamespace WinTcpClient{ partial class PictureClientForm : Form { public PictureClientForm() { InitializeComponent(); } //获取文件列表 private void OnListPictures(object sender, EventArgs e) { const int bufferSize = 256; TcpClient client = new TcpClient(); //创建TcipClient对象 IPHostEntry host = Dns.GetHostEntry("192.168.1.109"); //指定服务器地址 client.Connect(host.AddressList[0], 8888); //连接主机 //使用NetworkStream可以把数据发送给服务器,NetworkStream可以使用TcpClient对象的GetStream()方法访问. //要写入的数据可以使用NetworkStream方法发送给服务器 NetworkStream clientStream = client.GetStream(); string request = "LIST"; //发送LIST请求 byte[] requestBuffer = Encoding.ASCII.GetBytes(request); clientStream.Write(requestBuffer, 0, requestBuffer.Length); byte[] responseBuffer = new byte[bufferSize]; MemoryStream memStream = new MemoryStream(); int bytesRead = 0; do { //从服务器返回的数据用clientStream对象的Read()方法读取,由于不能肯定有多少 //数据从服务器上返回,所以使用循环读取数据. 所读取的数据追加到MemoryStream //中, 该对象可以自动调整大小 bytesRead = clientStream.Read(responseBuffer, 0, bufferSize); memStream.Write(responseBuffer, 0, bytesRead); } while (bytesRead > 0); clientStream.Close(); client.Close(); //关闭连接 byte[] buffer = memStream.GetBuffer(); //得到字节数组 string response = Encoding.ASCII.GetString(buffer); //转换为字符 string[] fileNames = response.Split(':'); this.listFiles.DataSource = fileNames; //显示文件列表 } //获得图片 private void OnDownladPicture(object sender, EventArgs e) { const int bufferSize = 256; TcpClient client = new TcpClient(); //创建TcipClient对象 IPHostEntry host = Dns.GetHostEntry("192.168.1.109"); //指定服务器地址 client.Connect(host.AddressList[0], 8888); //连接主机 NetworkStream clientStream = client.GetStream(); string request = "FILE:" + this.listFiles.SelectedItem.ToString(); //设置请求文件 byte[] requestBuffer = Encoding.ASCII.GetBytes(request); //发送FILE请求 clientStream.Write(requestBuffer, 0, requestBuffer.Length); byte[] responseBuffer = new byte[bufferSize]; MemoryStream memStream = new MemoryStream(); int bytesRead = 0; do { bytesRead = clientStream.Read(responseBuffer, 0, bufferSize); memStream.Write(responseBuffer, 0, bytesRead); //读出数据 } while (bytesRead > 0); clientStream.Close(); client.Close(); //关闭连接 Image picture = Image.FromStream(memStream); //得到图像并显示 this.pictureBox.Image = picture; } }} 恩 好的 发我邮箱里也行 [email protected] 谢谢楼上的大哥了! 你到下面的链接去下载吧http://http://download.csdn.net/source/2654937 上面的链接弄错了。http://download.csdn.net/source/2654937 string s = @"E:\a.bmp"; Image m = Image.FromFile(s); MemoryStream stream = new MemoryStream(); m.Save(stream,System.Drawing.Imaging.ImageFormat.Bmp); byte[] image = new byte[stream.Length]; stream.Position = 0; stream.Read(image,0,(int)stream.Length);此时图像存在byte[] image 里,用socket发送接受后假设存到byte[] image1里 string strPath = @"E:\ss.bmp"; FileStream stream1 = File.Create(strPath); stream1.Write(image1,0,image1.Length); stream1.Close();凭印象写的。试试吧 socket方面的资料比较多,可是很多博客中的似乎都是转载的,原创的很少 当copy成为一种习惯的时候,技术也就是纸上谈名 。 调用存储过程问题,代码如下 怎么判断一个变量是否赋值? 怎么通过生日直接判断出生年龄 关于combobox的初始化问题 急啊!Winform程序请问如何去掉TextBox.Text中那些回车和换行符 saucer等高手救我,remote问题! 【孟宪会之精彩世界】中,右下角逐渐出现的小窗口怎么实现的,求解! 在C#里面模糊查询 GridView如何删除一行? 控制台应用程序运行到 double.Parse(Console.ReadLine())时出现黄色的警告:索引超出了数组界限。 一个关于datagridview的问题 文本框的联想功能
using System;
using System.IO;
using System.Text;namespace TcpServer
{
/// <summary>
/// 控制台应用程序的帮助类PictureHelper
/// </summary>
public static class PictureHelper
{
//LIST请求:在字节数组中返回文件列表
public static byte[] GetFileListBytes()
{
string[] files = PictureHelper.GetFileList(); //调用GetFileList函数获取文件列表
StringBuilder responseMessage = new StringBuilder();
foreach (string s in files)
{
responseMessage.Append(s);
responseMessage.Append(":");
}
byte[] responseBuffer = Encoding.ASCII.GetBytes(responseMessage.ToString()); return responseBuffer;
}
// 以字符形式返回所有文件的列表, 供GetFileListBytes调用
private static string[] GetFileList()
{
string[] files = Directory.GetFiles(Properties.Settings.Default.PictureDirectory);
for (int i = 0; i < files.Length; i++)
{
files[i] = Path.GetFileName(files[i]);
}
return files;
}
//返回图片文件的字节数组
public static byte[] GetPictureBytes(string filename)
{
FileInfo fileInfo = new FileInfo(filename);
byte[] buffer = new byte[fileInfo.Length];
using (FileStream stream = fileInfo.OpenRead())
{
stream.Read(buffer, 0, buffer.Length);
}
return buffer;
}
}
}//服务器端
#region Using directives
using System;
using System.Text;
using System.IO;
using System.Net;
using System.Net.Sockets;
#endregionnamespace TcpServer
{
class Program
{
static void Main(string[] args)
{
//创建TcpListener对象, 并指定端口号
System.Net.Sockets.TcpListener listener = new System.Net.Sockets.TcpListener(IPAddress.Any, 8888);
listener.Start(); //启动监听 while (true)
{
const int bufferSize = 256;
TcpClient client = listener.AcceptTcpClient(); //等待客户机与它连接
NetworkStream clientStream = client.GetStream(); //返回一个NetworkStream对象 byte[] buffer = new byte[bufferSize];
int readBytes = 0;
readBytes = clientStream.Read(buffer, 0, bufferSize); //将网络流中的数据读入到字节数组 string request = Encoding.ASCII.GetString(buffer).Substring(0, readBytes); //将字节级数转换为字符串 //根据请求字符串, 把一个图片文件列表或图片字节返回给客户机
if (request.StartsWith("LIST"))
{
byte[] responseBuffer = PictureHelper.GetFileListBytes(); //得到文件列表的字节数组形式
clientStream.Write(responseBuffer, 0, responseBuffer.Length); //写入网络流, 发回客户机
}
else if (request.StartsWith("FILE"))
{
string[] requestMessage = request.Split(':');
string filename = requestMessage[1]; //requestMessage[0]="FILE" requestMessage[1]=文件名
//读出指定的图像文件的数据
byte[] data = File.ReadAllBytes(Path.Combine(Properties.Settings.Default.PictureDirectory, filename)); clientStream.Write(data, 0, data.Length); //写入网络流, 发回客户机
}
else
{
// 未知的请求
}
clientStream.Close(); //关闭连接
}
}
}
}#region Using directives
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Windows.Forms;
using System.Net;
using System.Net.Sockets;
using System.IO;
using System.Text;
#endregionnamespace WinTcpClient
{
partial class PictureClientForm : Form
{
public PictureClientForm()
{
InitializeComponent();
}
//获取文件列表
private void OnListPictures(object sender, EventArgs e)
{
const int bufferSize = 256; TcpClient client = new TcpClient(); //创建TcipClient对象 IPHostEntry host = Dns.GetHostEntry("192.168.1.109"); //指定服务器地址
client.Connect(host.AddressList[0], 8888); //连接主机 //使用NetworkStream可以把数据发送给服务器,NetworkStream可以使用TcpClient对象的GetStream()方法访问.
//要写入的数据可以使用NetworkStream方法发送给服务器
NetworkStream clientStream = client.GetStream(); string request = "LIST"; //发送LIST请求
byte[] requestBuffer = Encoding.ASCII.GetBytes(request);
clientStream.Write(requestBuffer, 0, requestBuffer.Length); byte[] responseBuffer = new byte[bufferSize];
MemoryStream memStream = new MemoryStream();
int bytesRead = 0;
do
{
//从服务器返回的数据用clientStream对象的Read()方法读取,由于不能肯定有多少
//数据从服务器上返回,所以使用循环读取数据. 所读取的数据追加到MemoryStream
//中, 该对象可以自动调整大小
bytesRead = clientStream.Read(responseBuffer, 0, bufferSize);
memStream.Write(responseBuffer, 0, bytesRead);
}
while (bytesRead > 0);
clientStream.Close();
client.Close(); //关闭连接 byte[] buffer = memStream.GetBuffer(); //得到字节数组
string response = Encoding.ASCII.GetString(buffer); //转换为字符
string[] fileNames = response.Split(':');
this.listFiles.DataSource = fileNames; //显示文件列表
}
//获得图片
private void OnDownladPicture(object sender, EventArgs e)
{
const int bufferSize = 256; TcpClient client = new TcpClient(); //创建TcipClient对象
IPHostEntry host = Dns.GetHostEntry("192.168.1.109"); //指定服务器地址
client.Connect(host.AddressList[0], 8888); //连接主机 NetworkStream clientStream = client.GetStream(); string request = "FILE:" + this.listFiles.SelectedItem.ToString(); //设置请求文件
byte[] requestBuffer = Encoding.ASCII.GetBytes(request); //发送FILE请求
clientStream.Write(requestBuffer, 0, requestBuffer.Length); byte[] responseBuffer = new byte[bufferSize];
MemoryStream memStream = new MemoryStream();
int bytesRead = 0;
do
{
bytesRead = clientStream.Read(responseBuffer, 0, bufferSize);
memStream.Write(responseBuffer, 0, bytesRead); //读出数据
}
while (bytesRead > 0);
clientStream.Close();
client.Close(); //关闭连接 Image picture = Image.FromStream(memStream); //得到图像并显示
this.pictureBox.Image = picture;
}
}
}
http://http://download.csdn.net/source/2654937
http://download.csdn.net/source/2654937
Image m = Image.FromFile(s);
MemoryStream stream = new MemoryStream();
m.Save(stream,System.Drawing.Imaging.ImageFormat.Bmp);
byte[] image = new byte[stream.Length];
stream.Position = 0;
stream.Read(image,0,(int)stream.Length);此时图像存在byte[] image 里,用socket发送接受后假设存到byte[] image1里
string strPath = @"E:\ss.bmp";
FileStream stream1 = File.Create(strPath);
stream1.Write(image1,0,image1.Length);
stream1.Close();
凭印象写的。试试吧