在做一个socket通信时遇到NetworkStream不能去返回的数据问题,请大家帮忙看看客户端private TcpClient ConnectToServer()
{
TcpClient client = new TcpClient();
IPHostEntry host = Dns.GetHostEntry(Properties.Settings.Default.Server); var address=(from h in host.AddressList where h.AddressFamily==AddressFamily.InterNetwork select h).First();
client.Connect(address,Properties.Settings.Default.ServerPort);
return client;
} private void btnListPictures_Click(object sender, EventArgs e)
{
TcpClient client = ConnectToServer(); NetworkStream clientStream = client.GetStream();
string request = "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{
bytesRead = clientStream.Read(responseBuffer, 0, bytesRead);
memStream.Write(responseBuffer, 0, bytesRead);
}while(bytesRead>0); clientStream.Close();
client.Close(); byte[] buffer = memStream.GetBuffer(); ;
string response = Encoding.ASCII.GetString(buffer); this.listFiles.DataSource = response.Split(new char[]{':'},StringSplitOptions.RemoveEmptyEntries);
}
服务端static void Main()
{
//Application.EnableVisualStyles();
//Application.SetCompatibleTextRenderingDefault(false);
//Application.Run(new Form1()); TcpListener listener = new TcpListener(IPAddress.Any, Properties.Settings.Default.Port);
listener.Start();
Console.WriteLine("Server is Running........"); while (true)
{
const int bufferSize = 8192;
TcpClient client = listener.AcceptTcpClient();
NetworkStream clientSream = client.GetStream(); byte[] buffer = new byte[bufferSize];
int readBytes = 0;
readBytes = clientSream.Read(buffer, 0, bufferSize);
string request = Encoding.ASCII.GetString(buffer).Substring(0, readBytes); if (request.StartsWith("LIST", StringComparison.Ordinal))
{
byte[] responseBuffer = PictureHelper.GetFileListBytes();//这里把一个字符串转换为字节,没有任何特殊字符
clientSream.Write(responseBuffer, 0, responseBuffer.Length);
}
else if (request.StartsWith("FILE", StringComparison.Ordinal))
{
string[] requestMessage = request.Split(':');
string filename = requestMessage[1]; byte[] data = File.ReadAllBytes(Path.Combine(Properties.Settings.Default.PictureDirectory, filename)); clientSream.Write(data, 0, data.Length);
}
clientSream.Close();
}
}项目的意思就是客户端发送一个请求到服务器,服务器根据请求返回数据,客户端发送LIST,服务器就返回图片列表。如果客户端点击某副图片,服务器就返回这幅图片,问题是服务器可以得到客户端的数据,服务器也返回了数据,客户端就是取不到,怎么回事?
{
TcpClient client = new TcpClient();
IPHostEntry host = Dns.GetHostEntry(Properties.Settings.Default.Server); var address=(from h in host.AddressList where h.AddressFamily==AddressFamily.InterNetwork select h).First();
client.Connect(address,Properties.Settings.Default.ServerPort);
return client;
} private void btnListPictures_Click(object sender, EventArgs e)
{
TcpClient client = ConnectToServer(); NetworkStream clientStream = client.GetStream();
string request = "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{
bytesRead = clientStream.Read(responseBuffer, 0, bytesRead);
memStream.Write(responseBuffer, 0, bytesRead);
}while(bytesRead>0); clientStream.Close();
client.Close(); byte[] buffer = memStream.GetBuffer(); ;
string response = Encoding.ASCII.GetString(buffer); this.listFiles.DataSource = response.Split(new char[]{':'},StringSplitOptions.RemoveEmptyEntries);
}
服务端static void Main()
{
//Application.EnableVisualStyles();
//Application.SetCompatibleTextRenderingDefault(false);
//Application.Run(new Form1()); TcpListener listener = new TcpListener(IPAddress.Any, Properties.Settings.Default.Port);
listener.Start();
Console.WriteLine("Server is Running........"); while (true)
{
const int bufferSize = 8192;
TcpClient client = listener.AcceptTcpClient();
NetworkStream clientSream = client.GetStream(); byte[] buffer = new byte[bufferSize];
int readBytes = 0;
readBytes = clientSream.Read(buffer, 0, bufferSize);
string request = Encoding.ASCII.GetString(buffer).Substring(0, readBytes); if (request.StartsWith("LIST", StringComparison.Ordinal))
{
byte[] responseBuffer = PictureHelper.GetFileListBytes();//这里把一个字符串转换为字节,没有任何特殊字符
clientSream.Write(responseBuffer, 0, responseBuffer.Length);
}
else if (request.StartsWith("FILE", StringComparison.Ordinal))
{
string[] requestMessage = request.Split(':');
string filename = requestMessage[1]; byte[] data = File.ReadAllBytes(Path.Combine(Properties.Settings.Default.PictureDirectory, filename)); clientSream.Write(data, 0, data.Length);
}
clientSream.Close();
}
}项目的意思就是客户端发送一个请求到服务器,服务器根据请求返回数据,客户端发送LIST,服务器就返回图片列表。如果客户端点击某副图片,服务器就返回这幅图片,问题是服务器可以得到客户端的数据,服务器也返回了数据,客户端就是取不到,怎么回事?
解决方案 »
- 关于C#中的 combox.findstring() 求个示列
- Process识别中文路径问题
- 我的XP SP2无法安装VS2005,提示未能安装NET Famework 2.0, Error code 1603
- GIF动画格式文件的内存加载显示问题
- radiobutton在c#中有text属性,但在javascript调用时没有text属性,怎么办?
- 从数据库中读取符合搜索条件的第100到200的数据失败
- 思归在吗?
- 如何在用C#编写的Windows应用程序中的某一个控件添加显示网页功能?
- 一个关与通过DataGrid内数据修改数据库内容的问题,急,急,急
- GetPrivateProfileStringA 函数在 C# 中如何声名
- wpf中访问wmi
- C#数组如何传递?
参考
{
try
{
// Create a TcpClient.
// Note, for this client to work you need to have a TcpServer
// connected to the same address as specified by the server, port
// combination.
Int32 port = 8888;
TcpClient client = new TcpClient(server, port); // Translate the passed message into ASCII and store it as a Byte array.
Byte[] data = System.Text.Encoding.ASCII.GetBytes(message); // Get a client stream for reading and writing.
// Stream stream = client.GetStream(); NetworkStream stream = client.GetStream(); // Send the message to the connected TcpServer.
stream.Write(data, 0, data.Length); Console.WriteLine("Sent: {0}", message); // Receive the TcpServer.response. // Buffer to store the response bytes.
data = new Byte[256]; // String to store the response ASCII representation.
String responseData = String.Empty; // Read the first batch of the TcpServer response bytes.
Int32 bytes = stream.Read(data, 0, data.Length);
responseData = System.Text.Encoding.ASCII.GetString(data, 0, bytes);
Console.WriteLine("Received: {0}", responseData);
this.listFiles.DataSource = responseData.Split(new char[] { ':' }, StringSplitOptions.RemoveEmptyEntries);
// Close everything.
stream.Close();
client.Close();
do{
bytesRead = clientStream.Read(responseBuffer, 0, bytesRead);
memStream.Write(responseBuffer, 0, bytesRead);
}while(bytesRead>0);问题出在这里,你知道了吗?bytesRead 为0,所以你没有取到