在同一台设备上,直接调用的函数么?这种情况用回环地址。
MAC、IP、目的端口对了没(不在同一台设备、自己实现协议)、再不在同一个网段?
确定你实现的协议格式是不是对的、在不在一个网段,如果确定都没问题,那么建议你禁止错误帧丢弃这个功能。用wireshark抓包分析。
这个问题产生的原因是因为编码不一致导致的,如果数据包中包含中文,建议使用UTF-8传输,只含有英文可以使用ISO-8859-1,您可以尝试getBytes("ISO-8859-1"),接收的时候也可以带上编码String info = new String(dpgetData(), 0, dpgetLength(),"ISO-8859-1"); getBytes()在不同系统之间得到的数据很有可能是不同的。
//这是一个源码你看看
using System;
using SystemNet;
using SystemNetSockets;
using SystemText;
using SystemThreading;
using SystemWindowsForms;
namespace UDPClient
{
public partial class frmUdp : Form
{
private UdpClient sendUdpClient;
private UdpClient receiveUpdClient;
public frmUdp()
{
InitializeComponent();
IPAddress[] ips = DnsGetHostAddresses("");
tbxlocalipText = ips[3]ToString();
int port = 51883;
tbxlocalPortText = portToString();
tbxSendtoIpText = ips[3]ToString();
tbxSendtoportText = portToString();
}
// 接受消息
private void btnReceive_Click(object sender, EventArgs e)
{
// 创建接收套接字
IPAddress localIp = IPAddressParse(tbxlocalipText);
IPEndPoint localIpEndPoint = new IPEndPoint(localIp, intParse(tbxlocalPortText));
receiveUpdClient = new UdpClient(localIpEndPoint);
Thread receiveThread = new Thread(ReceiveMessage);
receiveThreadStart();
}
// 接收消息方法
private void ReceiveMessage()
{
IPEndPoint remoteIpEndPoint = new IPEndPoint(IPAddressAny, 0);
while (true)
{
try
{
// 关闭receiveUdpClient时此时会产生异常
byte[] receiveBytes = receiveUpdClientReceive(ref remoteIpEndPoint);
string message = EncodingUnicodeGetString(receiveBytes);
// 显示消息内容
ShowMessageforView(lstbxMessageView, stringFormat("{0}[{1}]", remoteIpEndPoint, message));
}
catch
{
break;
}
}
}
// 利用委托回调机制实现界面上消息内容显示
delegate void ShowMessageforViewCallBack(ListBox listbox, string text);
private void ShowMessageforView(ListBox listbox, string text)
{
if (listboxInvokeRequired)
{
ShowMessageforViewCallBack showMessageforViewCallback = ShowMessageforView;
listboxInvoke(showMessageforViewCallback, new object[] { listbox, text });
}
else
{
lstbxMessageViewItemsAdd(text);
lstbxMessageViewSelectedIndex = lstbxMessageViewItemsCount - 1;
lstbxMessageViewClearSelected();
}
}
private void btnSend_Click(object sender, EventArgs e)
{
if (tbxMessageSendText == stringEmpty)
{
MessageBoxShow("发送内容不能为空","提示");
return;
}
// 选择发送模式
if (chkbxAnonymousChecked == true)
{
// 匿名模式(套接字绑定的端口由系统随机分配)
sendUdpClient = new UdpClient(0);
}
else
{
// 实名模式(套接字绑定到本地指定的端口)
IPAddress localIp = IPAddressParse(tbxlocalipText);
IPEndPoint localIpEndPoint = new IPEndPoint(localIp, intParse(tbxlocalPortText));
sendUdpClient = new UdpClient(localIpEndPoint);
}
Thread sendThread = new Thread(SendMessage);
sendThreadStart(tbxMessageSendText);
}
// 发送消息方法
private void SendMessage(object obj)
{
string message = (string)obj;
byte[] sendbytes = EncodingUnicodeGetBytes(message);
IPAddress remoteIp = IPAddressParse(tbxSendtoIpText);
IPEndPoint remoteIpEndPoint = new IPEndPoint(remoteIp, intParse(tbxSendtoportText));
sendUdpClientSend(sendbytes, sendbytesLength, remoteIpEndPoint);
sendUdpClientClose();
// 清空发送消息框
ResetMessageText(tbxMessageSend);
}
// 采用了回调机制
// 使用委托实现跨线程界面的 *** 作方式
delegate void ResetMessageCallback(TextBox textbox);
private void ResetMessageText(TextBox textbox)
{
// ControlInvokeRequired属性代表
// 如果控件的处理与调用线程在不同线程上创建的,则为true,否则为false
if (textboxInvokeRequired)
{
ResetMessageCallback resetMessagecallback = ResetMessageText;
textboxInvoke(resetMessagecallback, new object[] { textbox });
}
else
{
textboxClear();
textboxFocus();
}
}
// 停止接收
private void btnStop_Click(object sender, EventArgs e)
{
receiveUpdClientClose();
}
// 清空接受消息框
private void btnClear_Click(object sender, EventArgs e)
{
thislstbxMessageViewItemsClear();
}
}
}
以上就是关于急!!请问,我做C和JAVA做UDP通信程序,客户端接收不到数据,但是可以发送~~弄了好久了,求谁帮帮我全部的内容,包括:急!!请问,我做C和JAVA做UDP通信程序,客户端接收不到数据,但是可以发送~~弄了好久了,求谁帮帮我、java udp协议 16进制转换、关于c#中UDP编程等相关内容解答,如果想了解更多相关内容,可以关注我们,你们的支持是我们更新的动力!
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)