关于异步通信的问题
我想写一个最简单的异步通信,就是把客户端的一个字符串传入服务器端,在服务器端倒序之后传回客户端显示,不知道是不是我这样写,而且在客户端还有报错,求高人指点。代码如下:
服务器端:
namespace SimpleServer
{
public partial class Form1 : Form
{
private Thread ListenerThread;
TcpListener tcpListener = null;
public Form1()
{
InitializeComponent();
ListenerThread = new Thread(new ThreadStart(ListenerThreadMethod));
ListenerThread.IsBackground = true;
ListenerThread.Start();
}
public void ListenerThreadMethod()
{
TcpClient tcpClient = null;
NetworkStream networkStream = null;
try
{
IPAddress ip = IPAddress.Parse("127.0.0.1");
tcpListener = new TcpListener(ip, 7777);
tcpListener.Start();
}
catch
{
MessageBox.Show("不能建立服务器");
}
while (true)
{
try
{
tcpClient = tcpListener.AcceptTcpClient();
//对收到的请求做处理
List<byte> reData = new List<byte>();
byte[] reDataBytes = new byte[tcpClient.ReceiveBufferSize];
int n = 0;
networkStream = tcpClient.GetStream();
if (networkStream.CanRead)
{
do
{
n = networkStream.Read(reDataBytes, 0, (int)tcpClient.ReceiveBufferSize);
if (n == (int)tcpClient.ReceiveBufferSize)
reData.AddRange(reDataBytes);
else if (n != 0)
{
byte[] bytes1 = new byte[n];
for (int i = 0; i < n; i++)
{
bytes1[i] = reDataBytes[i];
}
reData.AddRange(bytes1);
}
} while (networkStream.DataAvailable);
}
reDataBytes = reData.ToArray();
//字符串倒序
string reString = Encoding.UTF8.GetString(reDataBytes);
string tempString = "";
for (int i = reString.Length - 1; i >= 0; i--)
{
tempString += reString[i];
}
byte[] data = Encoding.UTF8.GetBytes(tempString);
networkStream.BeginWrite(data, 0, data.Length, new AsyncCallback(DownLoadCallBackF), networkStream);
}
catch
{
}
}
}
public void DownLoadCallBackF(IAsyncResult ar)
{
NetworkStream networkStream = (NetworkStream)ar.AsyncState;
try
{
networkStream.EndWrite(ar);
}
catch
{
}
finally
{
if (networkStream != null)
networkStream.Close();
}
}
}
}
客户端:
namespace SimpleClientC#?异步通信
{
public partial class Form1 : Form
{
public Form1()
{
InitializeComponent();
}
private void button1_Click(object sender, EventArgs e)
{
TcpClient tcpClient = new TcpClient();
tcpClient.BeginConnect(IPAddress.Parse("127.0.0.1"), 7777, new AsyncCallback(DownloadCallBackF), tcpClient);
}
public byte[] ReadFromTcpClient(TcpClient tcpClient)
{
List<byte> data = new List<byte>();
NetworkStream networkStream = null;
byte[] bytes = new byte[tcpClient.ReceiveBufferSize];
int n = 0;
try
{
networkStream = tcpClient.GetStream();
if (networkStream.CanRead)
{
do
{
n = networkStream.Read(bytes, 0, (int)tcpClient.ReceiveBufferSize);
if (n == (int)tcpClient.ReceiveBufferSize)
data.AddRange(bytes);
else if (n != 0)
{
byte[] bytes1 = new byte[n];
for (int i = 0; i < n; i++)
bytes1[i] = bytes[i];
data.AddRange(bytes1);
}
} while (networkStream.DataAvailable);
}
bytes = data.ToArray();
}
catch
{
MessageBox.Show("读取数据失败");
bytes = null;
}
finally
{
if (networkStream != null)
networkStream.Close();
tcpClient.Close();
}
return bytes;
}
public void DownloadCallBackF(IAsyncResult ar)
{
TcpClient tcpClient = (TcpClient)ar.AsyncState;
try
{
tcpClient.EndConnect(ar);
NetworkStream netStreamSend = null;
byte[] netSend = new byte[textBox1.Text.Length];
netSend = Encoding.UTF8.GetBytes(textBox1.Text);
netStreamSend.BeginWrite(netSend, 0, netSend.Length, new AsyncCallback(SendCallBackF), netStreamSend);
}
//此处捕获异常“未将对象引用设置到对象的实例。”
catch
{
MessageBox.Show("连接失败");
return;
}
byte[] bytes = ReadFromTcpClient(tcpClient);
textBox2.Text = Encoding.UTF8.GetString(bytes);
}
public void SendCallBackF(IAsyncResult ar)
{
NetworkStream netStream = (NetworkStream)ar.AsyncState;
try
{
netStream.EndWrite(ar);
}
catch
{
}
finally
{
if (netStream != null)
netStream.Close();
}
}
}
}
[解决办法]
NetworkStream netStreamSend = null;
你这里声明后 没有给他复制你看是不是
所以会 捕获异常“未将对象引用设置到对象的实例。”的异常