【发布时间】:2013-12-06 20:29:05
【问题描述】:
我想创建一个非常简单的 android UDP Uni cast 服务器和一个 C# UDP 客户端。我们可以在 android 上创建服务器吗?如果是,那么应该为 c# 客户端提供什么 IP 地址以与 android 服务器连接?
编辑:我已经在我的 Android 上完成了单播 UDP 服务器,并在 C# 中完成了单播 UDP 客户端。 服务器正在发送数据报包,客户端正在成功接收。但相反的情况并没有发生,也没有任何错误和异常。但我无法理解代码中的问题。
安卓服务器:
public class MainActivity extends Activity {
String myIP;
final Integer myPort = 12345;
String clientIP = "192.168.1.3";
Integer clientPort = 54321;
byte[] inBuffer,outBuffer;
Button send, set;
EditText sendMsg, receiveMsg, cip, cp;
DatagramSocket me;
AsyncTask<Void, byte[], Void> asyncReceiver;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
send = (Button) findViewById(R.id.button1);
sendMsg = (EditText) findViewById(R.id.editText1);
receiveMsg = (EditText) findViewById(R.id.editText2);
set = (Button) findViewById(R.id.button2);
cip = (EditText) findViewById(R.id.editText3);
cp = (EditText) findViewById(R.id.editText4);
inBuffer = new byte[256];
outBuffer = new byte[256];
myIP = null;
myIP = GetCurrentIP();
if (myIP == null) {
Msg("GetCurrentIP error.");
} else {
try {
setTitle(myIP+"|"+InetAddress.getLocalHost());
} catch (UnknownHostException e1) {
// TODO Auto-generated catch block
e1.printStackTrace();
}
if (!Bind()) {
Msg("Bind() error.");
} else {
set.setOnClickListener(new OnClickListener() {
@Override
public void onClick(View v) {
// TODO Auto-generated method stub
clientIP = cip.getText().toString();
clientPort = Integer.parseInt(cp.getText().toString());
Msg(clientIP+"|"+clientPort);
}
});
send.setOnClickListener(new OnClickListener() {
@Override
public void onClick(View v) {
// TODO Auto-generated method stub
outBuffer = sendMsg.getText().toString().getBytes();
SendToClient();
}
});
//-----------
asyncReceiver = new AsyncTask<Void, byte[], Void>() {
@Override
protected void onProgressUpdate(byte[]... values) {
// TODO Auto-generated method stub
super.onProgressUpdate(values);
receiveMsg.append(new String(values[0]));
}
@Override
protected Void doInBackground(Void... params) {
// TODO Auto-generated method stub
try {
while(true){
inBuffer = new byte[256];
DatagramPacket pack = new DatagramPacket(inBuffer, inBuffer.length, InetAddress.getByName(clientIP), clientPort);
me.receive(pack);
publishProgress(inBuffer);
Thread.sleep(500);
}
} catch (Exception e) {
// TODO: handle exception
Msg(e.getMessage());
}
return null;
}
};
//-----------
asyncReceiver.execute(new Void[1]);
Msg("Receiving started.");
}
}
}
private void SendToClient(){
try {
DatagramPacket pack = new DatagramPacket(outBuffer, outBuffer.length, InetAddress.getByName(clientIP), clientPort);
me.send(pack);
Msg("Sent successfully.");
} catch (Exception e) {
// TODO: handle exception
Msg(e.getMessage());
}
}
private boolean Bind(){
try {
// DatagramChannel channel = DatagramChannel.open();
// me = channel.socket();
// //me = new DatagramSocket();
// SocketAddress localAddr = new InetSocketAddress(InetAddress.getByName(myIP), myPort);
// me.bind(localAddr);
me = new DatagramSocket(myPort, InetAddress.getByName(myIP));
Msg("Bound Successfully.");
return true;
} catch (SocketException e) {
// TODO Auto-generated catch block
e.printStackTrace();
Msg(e.getMessage());
} catch (UnknownHostException e) {
// TODO Auto-generated catch block
e.printStackTrace();
Msg(e.getMessage());
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
return false;
}
private String GetCurrentIP(){
WifiManager wifiMgr = (WifiManager) getSystemService(WIFI_SERVICE);
return Formatter.formatIpAddress(wifiMgr.getConnectionInfo().getIpAddress());
}
public void Msg(String msg){
Toast.makeText(getApplicationContext(), msg, Toast.LENGTH_SHORT).show();
Log.v(">>>>>", msg);
}
@Override
public boolean onCreateOptionsMenu(Menu menu) {
// Inflate the menu; this adds items to the action bar if it is present.
getMenuInflater().inflate(R.menu.main, menu);
return true;
}
}
c# 客户端...
public partial class Form1 : Form
{
Socket me;
EndPoint myEndPoint;
byte[] inBuffer, outBuffer;
EndPoint serverEP;
private void SendToClient()
{
if (serverEP == null)
{
serverEP = new IPEndPoint(IPAddress.Parse(textBoxsip.Text), int.Parse(textBoxsp.Text));
}
try
{
lock (me)
{
outBuffer = new byte[256];
outBuffer = Encoding.Default.GetBytes(textBoxmsg.Text);
me.SendTo(outBuffer, serverEP);
}
Task.Run(() => MessageBox.Show("Sent"));
}
catch (Exception ex)
{
MessageBox.Show(ex.Message);
}
}
private String GetCurrentIP()
{
IPAddress[] ips = Dns.GetHostAddresses(Dns.GetHostName());
var selectedIPs = from ip in ips
where ip.AddressFamily == AddressFamily.InterNetwork
select ip;
return selectedIPs.First().ToString();
}
public Form1()
{
InitializeComponent();
inBuffer = new byte[256];
outBuffer = new byte[256];
}
private void Form1_Load(object sender, EventArgs e)
{
this.Text = GetCurrentIP();
me = new Socket
(
AddressFamily.InterNetwork,
SocketType.Dgram,
ProtocolType.Udp
);
}
private void buttonBind_Click(object sender, EventArgs e)
{
try
{
myEndPoint = new IPEndPoint(IPAddress.Parse(textBoxBip.Text), int.Parse(textBoxBp.Text));
me.Bind(myEndPoint);
Task.Run(()=> MessageBox.Show("Bound Successfully."));
}
catch (Exception ex)
{
MessageBox.Show(ex.Message);
}
}
private void buttonReceiveFrom_Click(object sender, EventArgs e)
{
if (serverEP == null)
{
serverEP = new IPEndPoint(IPAddress.Parse(textBoxsip.Text), int.Parse(textBoxsp.Text));
}
try
{
me.BeginReceiveFrom
(
inBuffer,
0,
inBuffer.Length,
SocketFlags.None,
ref serverEP,
new AsyncCallback(onReceiveComplete),
null
);
}
catch (Exception ex)
{
MessageBox.Show(ex.Message);
}
}
private void onReceiveComplete(IAsyncResult ar)
{
try
{
int nobs = me.EndReceiveFrom(ar, ref serverEP);
if (nobs > 0)
{
AddtoListBox(Encoding.Default.GetString(inBuffer));
}
inBuffer = new byte[256];
me.BeginReceiveFrom
(
inBuffer,
0,
inBuffer.Length,
SocketFlags.None,
ref serverEP,
new AsyncCallback(onReceiveComplete),
null
);
}
catch (Exception ex)
{
MessageBox.Show(ex.Message);
}
}
private void AddtoListBox(String msg)
{
this.Invoke((Action)delegate(){listBox1.Items.Add(msg);});
}
private void buttonSendTo_Click(object sender, EventArgs e)
{
SendToClient();
}
}
}
【问题讨论】:
-
好吧,我已经做了很多研究并尝试了很多代码,但没有成功。现在是晚上 2 点,我对此感到厌倦,不想写大篇幅的材料,所以请帮忙
-
简单回答我应该给c#客户端提供什么ip
标签: c# android sockets udp datagram