我用Console做了一个服务器 代码如下
class Server
{
static void Main(string[] args)
{ const int BufferSize = 8192; // 缓存大小,8192Bytes
ConsoleKey key; Console.WriteLine("Server is running ... ");
IPAddress ip = new IPAddress(new byte[] { 127, 0, 0, 1 });
TcpListener listener = new TcpListener(ip, 8500); listener.Start(); // 开始侦听
Console.WriteLine("Start Listening ..."); // 获取一个连接,同步方法,在此处中断
while (true)
{
TcpClient remoteClient = listener.AcceptTcpClient(); // 打印连接到的客户端信息
Console.WriteLine("Client Connected!{0} <-- {1}",
remoteClient.Client.LocalEndPoint, remoteClient.Client.RemoteEndPoint);
#region
// 获得流
NetworkStream streamToClient = remoteClient.GetStream();
do
{
// 写入buffer中
byte[] buffer = new byte[BufferSize];
int bytesRead;
try
{
while (true)
{
lock (streamToClient)
{
bytesRead = streamToClient.Read(buffer, 0, BufferSize);
}
if (bytesRead > 0) break;
}
Console.WriteLine("Reading data, {0} bytes ...", bytesRead); // 获得请求的字符串
string msg = Encoding.Unicode.GetString(buffer, 0, bytesRead);
Console.WriteLine("Received: {0}", msg); // 转换成大写并发送
msg = msg.ToUpper();
buffer = Encoding.Unicode.GetBytes(msg);
lock (streamToClient)
{
streamToClient.Write(buffer, 0, buffer.Length);
}
Console.WriteLine("Sent: {0}", msg);
}
catch (Exception ex)
{
Console.WriteLine(ex.Message);
break;
}
} while (true);
streamToClient.Dispose();
remoteClient.Close(); Console.WriteLine("\n\n输入\"Q\"键退出。");
do
{
key = Console.ReadKey(true).Key;
} while (key != ConsoleKey.Q);
#endregion
}
#endregion
}
}
然后用web 作为客户端代码如下
protected void Button2_Click(object sender, System.EventArgs e)
{
// Console.WriteLine("Client Running ...");
// TcpClient client;
// ConsoleKey key;
const int BufferSize = 8192;
TcpClient client = new TcpClient();
try
{
// IPHostEntry here = Dns.GetHostByName(Dns.GetHostName());
client.Connect("localhost", 8500);
}
catch (Exception ex)
{
Console.WriteLine(ex.Message);
return;
} // 打印连接到的服务端信息
this.DIV.InnerHtml += "链接服务器!" + client.Client.LocalEndPoint + "-->" + client.Client.RemoteEndPoint + "<br/>"; NetworkStream streamToServer = client.GetStream();
this.DIV.InnerHtml += "Menu: S - Send, X - Exit" + "<br/>";
// 获取输入的字符串
string msg = this.TXT.Value; byte[] buffer = Encoding.Unicode.GetBytes(msg); // 获得缓存
try
{
lock (streamToServer)
{
streamToServer.Write(buffer, 0, buffer.Length); // 发往服务器
}
this.DIV.InnerHtml += "Sent: " + msg + "<br/>"; int bytesRead;
buffer = new byte[BufferSize];
lock (streamToServer)
{
bytesRead = streamToServer.Read(buffer, 0, BufferSize);
}
msg = Encoding.Unicode.GetString(buffer, 0, bytesRead);
this.DIV.InnerHtml += "Received: " + msg + "<br/>"; }
catch (Exception ex)
{
Console.WriteLine(ex.Message);
}
streamToServer.Dispose();
client.Close();
}现在问题出来了, 由于http是无状态的协议, 每次就只有一次链接是返回了Console里转换为大写的值。 当第二次在客户端点击按钮后·就在客户端里的
lock (streamToServer)
{
bytesRead = streamToServer.Read(buffer, 0, BufferSize);
}read处卡上了。 有没有什么方法可以解决这个问题呢
class Server
{
static void Main(string[] args)
{ const int BufferSize = 8192; // 缓存大小,8192Bytes
ConsoleKey key; Console.WriteLine("Server is running ... ");
IPAddress ip = new IPAddress(new byte[] { 127, 0, 0, 1 });
TcpListener listener = new TcpListener(ip, 8500); listener.Start(); // 开始侦听
Console.WriteLine("Start Listening ..."); // 获取一个连接,同步方法,在此处中断
while (true)
{
TcpClient remoteClient = listener.AcceptTcpClient(); // 打印连接到的客户端信息
Console.WriteLine("Client Connected!{0} <-- {1}",
remoteClient.Client.LocalEndPoint, remoteClient.Client.RemoteEndPoint);
#region
// 获得流
NetworkStream streamToClient = remoteClient.GetStream();
do
{
// 写入buffer中
byte[] buffer = new byte[BufferSize];
int bytesRead;
try
{
while (true)
{
lock (streamToClient)
{
bytesRead = streamToClient.Read(buffer, 0, BufferSize);
}
if (bytesRead > 0) break;
}
Console.WriteLine("Reading data, {0} bytes ...", bytesRead); // 获得请求的字符串
string msg = Encoding.Unicode.GetString(buffer, 0, bytesRead);
Console.WriteLine("Received: {0}", msg); // 转换成大写并发送
msg = msg.ToUpper();
buffer = Encoding.Unicode.GetBytes(msg);
lock (streamToClient)
{
streamToClient.Write(buffer, 0, buffer.Length);
}
Console.WriteLine("Sent: {0}", msg);
}
catch (Exception ex)
{
Console.WriteLine(ex.Message);
break;
}
} while (true);
streamToClient.Dispose();
remoteClient.Close(); Console.WriteLine("\n\n输入\"Q\"键退出。");
do
{
key = Console.ReadKey(true).Key;
} while (key != ConsoleKey.Q);
#endregion
}
#endregion
}
}
然后用web 作为客户端代码如下
protected void Button2_Click(object sender, System.EventArgs e)
{
// Console.WriteLine("Client Running ...");
// TcpClient client;
// ConsoleKey key;
const int BufferSize = 8192;
TcpClient client = new TcpClient();
try
{
// IPHostEntry here = Dns.GetHostByName(Dns.GetHostName());
client.Connect("localhost", 8500);
}
catch (Exception ex)
{
Console.WriteLine(ex.Message);
return;
} // 打印连接到的服务端信息
this.DIV.InnerHtml += "链接服务器!" + client.Client.LocalEndPoint + "-->" + client.Client.RemoteEndPoint + "<br/>"; NetworkStream streamToServer = client.GetStream();
this.DIV.InnerHtml += "Menu: S - Send, X - Exit" + "<br/>";
// 获取输入的字符串
string msg = this.TXT.Value; byte[] buffer = Encoding.Unicode.GetBytes(msg); // 获得缓存
try
{
lock (streamToServer)
{
streamToServer.Write(buffer, 0, buffer.Length); // 发往服务器
}
this.DIV.InnerHtml += "Sent: " + msg + "<br/>"; int bytesRead;
buffer = new byte[BufferSize];
lock (streamToServer)
{
bytesRead = streamToServer.Read(buffer, 0, BufferSize);
}
msg = Encoding.Unicode.GetString(buffer, 0, bytesRead);
this.DIV.InnerHtml += "Received: " + msg + "<br/>"; }
catch (Exception ex)
{
Console.WriteLine(ex.Message);
}
streamToServer.Dispose();
client.Close();
}现在问题出来了, 由于http是无状态的协议, 每次就只有一次链接是返回了Console里转换为大写的值。 当第二次在客户端点击按钮后·就在客户端里的
lock (streamToServer)
{
bytesRead = streamToServer.Read(buffer, 0, BufferSize);
}read处卡上了。 有没有什么方法可以解决这个问题呢
解决方案 »
免费领取超大流量手机卡,每月29元包185G流量+100分钟通话, 中国电信官方发货