用vs2005做了个简单的通信实例,但是有一些问题自已不明白,请教大家:
以下是一段监听的代码:
string messageStr = "";
IPAddress ipAddress = Dns.Resolve(Dns.GetHostName().ToString()).AddressList[0];
tcpListener = new TcpListener(ipAddress, port);
tcpListener.Start();
while (true)
{
Socket socket = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);
socket = tcpListener.AcceptSocket();
byte[] buffer = new byte[socket.Available];
int i = socket.Receive(buffer);
messageStr = System.Text.UnicodeEncoding.UTF8.GetString(buffer);
if (messageStr != "")
{
this.rtbRecordMessage.AppendText("[user] " + ipAddress + " " + System.DateTime.Now + "\n" + messageStr );
messageStr = "";
}
}
<1> 如果在第六行加一个断点,然后在vs2005中运行,再运行另一个生成好的.EXE文件相互通信,可以实现通信,但只能通信二次,到第三次的时候就不监听了.不知道为什么
<2> 如果直接运行二个.EXE文件在本机做通信测试,接收端一次消息也收不到.
以下是一段监听的代码:
string messageStr = "";
IPAddress ipAddress = Dns.Resolve(Dns.GetHostName().ToString()).AddressList[0];
tcpListener = new TcpListener(ipAddress, port);
tcpListener.Start();
while (true)
{
Socket socket = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);
socket = tcpListener.AcceptSocket();
byte[] buffer = new byte[socket.Available];
int i = socket.Receive(buffer);
messageStr = System.Text.UnicodeEncoding.UTF8.GetString(buffer);
if (messageStr != "")
{
this.rtbRecordMessage.AppendText("[user] " + ipAddress + " " + System.DateTime.Now + "\n" + messageStr );
messageStr = "";
}
}
<1> 如果在第六行加一个断点,然后在vs2005中运行,再运行另一个生成好的.EXE文件相互通信,可以实现通信,但只能通信二次,到第三次的时候就不监听了.不知道为什么
<2> 如果直接运行二个.EXE文件在本机做通信测试,接收端一次消息也收不到.
建立一个连接...然后执行完毕...连接后接收消息... 然后你又NEW了SOCKET..老的就是没了引用.. SOCKET不能丢弃..
如果丢弃你的发送端要重新建立连接.
IPAddress ipAddress = Dns.Resolve(Dns.GetHostName().ToString()).AddressList[0];
tcpListener = new TcpListener(ipAddress, port);
tcpListener.Start();
Socket socket = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);
while (true)
{
socket = tcpListener.AcceptSocket();
byte[] buffer = new byte[socket.Available];
int i = socket.Receive(buffer);
messageStr = System.Text.UnicodeEncoding.UTF8.GetString(buffer);
if (messageStr != "")
{
this.rtbRecordMessage.AppendText("[user] " + ipAddress + " " + System.DateTime.Now + "\n" + messageStr );
messageStr = "";
}
}改成这样也不行啊.
//用vs2005做了个简单的通信实例,但是有一些问题自已不明白,请教大家:
//以下是一段监听的代码:
string messageStr = "";
IPAddress ipAddress = Dns.Resolve(Dns.GetHostName().ToString()).AddressList[0];
tcpListener = new TcpListener(ipAddress, port);
tcpListener.Start();
while (true)
{
Socket socket = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);
socket = tcpListener.AcceptSocket();
byte[] buffer = new byte[socket.Available];
int i = socket.Receive(buffer);
messageStr = System.Text.UnicodeEncoding.UTF8.GetString(buffer);
if (messageStr != "")
{
this.rtbRecordMessage.AppendText("[user] " + ipAddress + " " + System.DateTime.Now + "\n" + messageStr );
messageStr = "";
}
}<1> 如果在第六行加一个断点,然后在vs2005中运行,再运行另一个生成好的.EXE文件相互通信,可以实现通信,但只能通信二次,到第三次的时候就不监听了.不知道为什么
<2> 如果直接运行二个.EXE文件在本机做通信测试,接收端一次消息也收不到.
{
string data = "";
TcpListener tcpListener = new TcpListener(2048);
tcpListener.Start();
Console.WriteLine("Begin linsten.......");
while (true)
{
Console.WriteLine("Waiting for a connection......... ");
TcpClient client = tcpListener.AcceptTcpClient();
Console.WriteLine("Client :"+client.Client.RemoteEndPoint.ToString() + " connected!");
Byte[] bytes = new Byte[768];
NetworkStream stream = client.GetStream();
int i;
while ((i = stream.Read(bytes, 0, bytes.Length)) != 0)
{
data = System.Text.Encoding.ASCII.GetString(bytes, 0, i);
Console.WriteLine("Received: {0}", data);
data = data.ToUpper();
byte[] msg = System.Text.Encoding.ASCII.GetBytes(data);
stream.Write(msg, 0, msg.Length);
Console.WriteLine("Sent: {0}", data);
}
} }
{
try
{
serverTcpListen = new TcpListener(IPAddress.Parse(ServerIP), ServerReceivePort);
serverTcpListen.Start();
serverListenThread = new Thread(new ThreadStart(ServerListen));
serverListenThread.Start();
}
catch (Exception ex)
{
//TODO:打开服务器端口失败后的异常处理
serverListenLoopTag = false;
}
}
/// <summary>
/// 监听服务器端口
/// </summary>
private void ServerListen()
{
while (serverListenLoopTag)
{
try
{
tcpClient = serverTcpListen.AcceptTcpClient();
int bufflen = 0;
byte[] buffer = new byte[1024];
bufflen = tcpClient.Client.Available;
tcpClient.Client.Receive(buffer, 0, bufflen, SocketFlags.None);
string message = Encoding.ASCII.GetString(buffer, 0, bufflen);
}
catch (Exception ex)
{
//TODO:接收数据线程异常处理
serverListenLoopTag = false;
MessageBox.Show(ex.Message);
}
}
}