我正在尝试在UDP network
上开发客户端服务器应用。我使用listview来显示聊天。但是当user1键入一个很长的句子时,listview
显示句子的一部分(因为它只在一行中输入)。
所以,如果字符数超过70,我编写了一个将sentdata
拆分为行的逻辑。它在服务器端工作正常,但在客户端不工作。我已将缓冲区数组大小设置为2000.
当我尝试在标签上打印接收的数据massage.length
时,它始终显示为2000.(这就是为什么逻辑不起作用的原因)。什么造成这种情况?如何克服它?我想要收到的消息中的字符数..(用此发布代码)..
public partial class Form1 : Form
{
Socket sckt;
EndPoint epLocal, epRemote;
byte[] buffer;
public Form1()
{
InitializeComponent();
txtChat.Text = "";
}
private void Form1_Load(object sender, EventArgs e)
{
//setting up the socket
sckt = new Socket(AddressFamily.InterNetwork, SocketType.Dgram, ProtocolType.Udp);
sckt.SetSocketOption(SocketOptionLevel.Socket, SocketOptionName.ReuseAddress, true);
//getting users' IP
txtLocalIp.Text = GetIPLocal();
}
private string GetIPLocal()
{
IPHostEntry host;
host = Dns.GetHostEntry(Dns.GetHostName());
foreach (IPAddress ip in host.AddressList)
if (ip.AddressFamily == AddressFamily.InterNetwork)
return ip.ToString();
return "127.0.0.1";
}
private void buttonConnect_Click(object sender, EventArgs e)
{
if (buttonConnect.Text != "Disconnect !")
{
//binding socket to the Button
epLocal = new IPEndPoint(IPAddress.Parse(txtLocalIp.Text), Convert.ToInt32(txtLocalPort.Text));
sckt.Bind(epLocal);
//connecting to Remote IP
epRemote = new IPEndPoint(IPAddress.Parse(txtRemoteIp.Text), Convert.ToInt32(txtRemotePort.Text));
sckt.Connect(epRemote);
listView1.Columns.Add("",0, HorizontalAlignment.Left);
listView1.Columns.Add("starting chat . . .", 444, HorizontalAlignment.Left);
//listening to (receiving from) the specific port on Remote side
buffer = new byte[2000];
sckt.BeginReceiveFrom(buffer, 0, buffer.Length, SocketFlags.None, ref epRemote, new AsyncCallback(MessageCallBack), buffer);
buttonConnect.Text = "Disconnect !";
}
else
{
txtRemoteIp.Text = "";
buttonConnect.Text = "Connect";
}
}
private void MessageCallBack(IAsyncResult aResult)
{
try
{
if (buttonConnect.Text == "Disconnect !")
{
byte[] receivedData = new byte[2000];
receivedData = (byte[])aResult.AsyncState;
//converting byte[] to string
ASCIIEncoding aEncoding = new ASCIIEncoding();
string receivedMessage = aEncoding.GetString(receivedData);
Console.Beep();
Thread.Sleep(1000);
int l = Convert.ToInt32(receivedData.Length) ;
label2.Text = "";
label1.Text = l.ToString();
string[] arr = new string[2];
ListViewItem itm;
arr[0] = "";
string firstString = receivedMessage;
if (firstString.Length > 70)
{
firstString = firstString.Remove(70);
string renewedString = receivedMessage;
renewedString = renewedString.Remove(0, 70);
if (renewedString.Length > 70)
{
string secondstring = renewedString.Remove(70);
renewedString = renewedString.Remove(0, 70);
if (renewedString.Length <= 70)
{
string s = "Friend : " + firstString;
arr[1] = s;
itm = new ListViewItem(arr);
listView1.Items.Add(itm);
arr[1] = secondstring;
itm = new ListViewItem(arr);
listView1.Items.Add(itm);
arr[1] = renewedString;
itm = new ListViewItem(arr);
listView1.Items.Add(itm);
}
else
{
MessageBox.Show("message too long, reduce size !");
}
}
}
else
{
arr[1] = "Friend : " + firstString;
itm = new ListViewItem(arr);
listView1.Items.Add(itm);
}
//callbacking again
buffer = new byte[2000];
sckt.BeginReceiveFrom(buffer, 0, buffer.Length, SocketFlags.None, ref epRemote, new AsyncCallback(MessageCallBack), buffer);
}
}
catch(Exception ex)
{
MessageBox.Show("ERROR : " + ex.ToString());
}
}
private void buttonSend_Click(object sender, EventArgs e)
{
try
{
if (buttonConnect.Text == "Disconnect !")
{
//convert string message to byte[]
ASCIIEncoding aEncoding = new ASCIIEncoding();
byte[] sendData = new byte[2000];
sendData = aEncoding.GetBytes(txtChat.Text);
//sending the Encoded message
sckt.Send(sendData);
string[] arr = new string[2];
ListViewItem itm;
arr[0] = "";
string firstString = txtChat.Text;
if (firstString.Length > 70)
{
firstString = firstString.Remove(70);
string renewedString = txtChat.Text;
renewedString = renewedString.Remove(0, 70);
if (renewedString.Length > 70)
{
string secondstring = renewedString.Remove(70);
renewedString = renewedString.Remove(0, 70);
if (renewedString.Length <= 70)
{
string s = "me : " + firstString;
arr[1] = s;
itm = new ListViewItem(arr);
listView1.Items.Add(itm);
arr[1] = secondstring;
itm = new ListViewItem(arr);
listView1.Items.Add(itm);
arr[1] = renewedString;
itm = new ListViewItem(arr);
listView1.Items.Add(itm);
}
else
{
MessageBox.Show("message too long, reduce size !");
}
}
}
else
{
arr[1] = "Me123 : " + firstString;
itm = new ListViewItem(arr);
listView1.Items.Add(itm);
}
txtChat.Text = "";
}
else
{
MessageBox.Show("Sorry, Session Expired !");
}
}
catch (Exception ex)
{
MessageBox.Show("ERROR : " + ex.ToString());
}
}
}
}
答案 0 :(得分:0)
您需要阅读(并了解)有关BeginReceiveFrom
和EndReceiveFrom
的在线帮助,在您的代码中BeginReceiveFrom
的最后一个参数不正确。
当因为套接字中有数据接收而调用回调函数时,一旦获得需要调用IAsyncResult
的套接字以完成操作,就必须从EndReceiveFrom
参数中提取套接字描述符正确并返回读取的字节数。
我认为您需要了解AysncFunction
如何工作,没有比Visual Studio的在线帮助更好的了,在那里,您可以获得使用这些函数BeginReceiveFrom / EndReceiveFrom / AsyncCallback等所需的一切。