TCP通信无法接收数据,代码如下: /// <summary>
/// 声明获取事件的委托
/// </summary>
private delegate void SynReceive();
/// <summary>
/// 线程接收函数
/// </summary>
public void Receive()
{
try
{
string strRcv = "";
// 声明字节数组,一次接收数据的长度为1024字节
byte[] RcvBuffer = new byte[1024];
//循环读取,直到接收完所有数据
while (true)
{
int bytes = socket.Receive(RcvBuffer, RcvBuffer.Length, 0);
//读取完成后退出循环
if (bytes <= 0)
break;
//将读取的字节数转换为字符串
strRcv += Encoding.ASCII.GetString(RcvBuffer,bytes,0);
if (!txtRcv.InvokeRequired)
{
txtRcv.AppendText(strRcv); }
else
{
txtRcv.Invoke(new SynReceive(Receive));
} }
}
catch (Exception ex)
{
MessageBox.Show(ex.Message);
} }
/// 声明获取事件的委托
/// </summary>
private delegate void SynReceive();
/// <summary>
/// 线程接收函数
/// </summary>
public void Receive()
{
try
{
string strRcv = "";
// 声明字节数组,一次接收数据的长度为1024字节
byte[] RcvBuffer = new byte[1024];
//循环读取,直到接收完所有数据
while (true)
{
int bytes = socket.Receive(RcvBuffer, RcvBuffer.Length, 0);
//读取完成后退出循环
if (bytes <= 0)
break;
//将读取的字节数转换为字符串
strRcv += Encoding.ASCII.GetString(RcvBuffer,bytes,0);
if (!txtRcv.InvokeRequired)
{
txtRcv.AppendText(strRcv); }
else
{
txtRcv.Invoke(new SynReceive(Receive));
} }
}
catch (Exception ex)
{
MessageBox.Show(ex.Message);
} }
如果反复调用的话,你可以在While循环里面打断点看下具体的执行情况。
{
if(socket 有可读数据)
{
读取数据
// TCP 网络延迟状态下,发送数据过后,不一定会马上收到消息回复,所以外层先判断 是否有可读数据
}
else
{
System.Threading.Thread.Sleep(1);
}
}
既然你的接收函数一直被调用,那么你就得看看你的电脑是否收到这个报文,先确定是哪个层面上没接收到:
1.报文没有送到你的电脑,通过ethereal等抓包软件查看有没有抓到这些应该接收得报文。
2.如果第1步是接收到得,且端口地址都正确,一般情况下都会正常上送tcp层的,这个时候不用接收,直接查看socket上的接收到字节数的数据,如果字节数>0的话,说明tcp层也是传给你了的。
ps:需要注意的,如果你用ethereal抓包看到在你建立tcp链接的端口上有“校验和”错误的报文,这个时候你要更改一下网卡的校验和模式(一般都是取消)。
2.应该是strRcv += Encoding.ASCII.GetString(RcvBuffer,0,bytes);
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Text;
using System.Windows.Forms;
using System.Net;
using System.Net.Sockets;
using System.Threading;namespace ClientTCP
{
public partial class ClientForm : Form
{
//声明端口号变量;
private int port;
//声明IP地址字符串变量
private String strIP;
//声明IP地址和端口信息
private IPEndPoint ServerEP;
//声明IP地址变量
private IPAddress ip;
//声明Socket变量
private Socket socket;
//声明线程
private Thread thread;
public ClientForm()
{
InitializeComponent();
}
/// <summary>
/// 打开连接
/// </summary>
/// <param name="sender"></param>
/// <param name="e"></param>
private void btnOpen_Click(object sender, EventArgs e)
{
if (!(socket == null) && socket.Connected)
{
MessageBox.Show("连接已建立");
return;
}
try
{
strIP = txtIP.Text.Trim();
//将IP地址字符串转化为IPAddress实例
ip = IPAddress.Parse(strIP);
port = Int32.Parse(txtPort.Text.Trim());
ServerEP = new IPEndPoint(ip, port);
socket = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);
socket.Connect(ServerEP);
thread = new Thread(new ThreadStart(Receive)); }
catch (Exception ex)
{
MessageBox.Show(ex.Message);
}
}
/// <summary>
/// 关闭连接
/// </summary>
/// <param name="sender"></param>
/// <param name="e"></param>
private void btnClose_Click(object sender, EventArgs e)
{
if (!(socket == null) && socket.Connected)
{
socket.Close();
socket = null;
}
} private void btnSend_Click(object sender, EventArgs e)
{
if (socket == null && !(socket.Connected))
{
MessageBox.Show("没有建立连接!");
return;
}
else
{
if(!(txtSend==null))
{
BeginSend();
}
}
}
/// <summary>
/// 数据发送函数
/// </summary> private void BeginSend()
{ try
{
byte[] byteMessage;
if (socket.Connected)
{ byteMessage = Encoding.ASCII.GetBytes(txtSend.Text+"\r\n");
socket.Send(byteMessage);
txtSend.Clear(); }
}
catch (Exception ex)
{
MessageBox.Show(ex.Message);
}
}
/// <summary>
/// 声明获取事件的委托
/// </summary>
private delegate void SynReceive();
/// <summary>
/// 线程接收函数
/// </summary>
public void Receive()
{
try
{
string strRcv = "";
// 声明字节数组,一次接收数据的长度为1024字节
byte[] RcvBuffer = new byte[1024];
//循环读取,直到接收完所有数据
while (true)
{
int bytes = socket.Receive(RcvBuffer, RcvBuffer.Length, 0);
////读取完成后退出循环
//if (bytes <= 0)
// break;
//将读取的字节数转换为字符串
strRcv= Encoding.ASCII.GetString(RcvBuffer);
if (!txtRcv.InvokeRequired)
{
txtRcv.AppendText(strRcv); }
else
{
txtRcv.Invoke(new SynReceive(Receive));
} }
}
catch (Exception ex)
{
MessageBox.Show(ex.Message);
} }
帮忙解决一下
这哥们......唉......客户端没有显示绑定,就是系统自己选择一个不冲突的端口作为源端口来处理的,虽然tcp是双向链接,但是也要分客户端服务端。
txtRcv.Invoke(new SynReceive(Receive))会执行。那请问你在这个语句前接收的数据,你放到哪了。if (!txtRcv.InvokeRequired)
{
txtRcv.AppendText(strRcv); }
else
{
txtRcv.Invoke(new SynReceive(Receive));
}
/// <summary>
/// 线程接收函数
/// </summary> public void RealRec(string str)
{
this.txtRcv.AppendText(str);
} private void Receive()
{
try
{
string strRcv = ""; byte[] RcvBuffer = new byte[1024]; while (true)
{
int bytes = socket.Receive(RcvBuffer, RcvBuffer.Length, 0); strRcv = Encoding.ASCII.GetString(RcvBuffer,0,bytes); if (!this.txtRcv.InvokeRequired)
this.txtRcv.AppendText(strRcv);
else
this.txtRcv.Invoke(new SynReceive(this.RealRec), new object[] { strRcv });
if (bytes <= 0)
break;
} }
catch (Exception ex)
{
MessageBox.Show(ex.Message);
}
}
IP:119.75.217.56
port:80
request:GET / HTTP/1.1(这里加个回车)
会返回百度的首页
http://topic.csdn.net/u/20110616/16/e1e83e95-1e82-4068-ba01-fa84be1a061b.html?42870
不能接收,是弹出错误提示,还是收不到数据?另外程序中的两个问题先说一下:1. 不要用socket.Connected来判断连接是否建立,即使在双方正在进行通信时它都可能是false,网上的解释很多,自己查一下。
所以你的几个按钮都会出现判断错误的情况发生。2. int bytes = socket.Receive(RcvBuffer, RcvBuffer.Length, 0);
如果RcvBuffer.Length不等于0,且未收到数据时,这条语句会报错,是吗,前两天帮人调试时,是这样
int bytes = socket.Receive(RcvBuffer, RcvBuffer.Length, 0);
代的代码很好,顺便学习,谢谢!