0
我有一个简单的UDP服务器运行在一个设备上,当一个客户端想要连接时,它向服务器发送一条消息“connect”,然后服务器将地址,并开始发送数据到该地址,现在当另一个客户端想要加入时,该客户端发送消息“连接”,但有时没有任何反应,这就像客户端想加入消息永远不会被服务器接收,我将如何修复这个?另外这里是服务器多个UDP客户端发送数据包到一个主机不起作用
protected String doInBackground(String... params) {
boolean run = true;
String data = "";
DatagramPacket packet = null;
boolean position = false;
while(run)
{
if(data.equalsIgnoreCase(""))
{
}
//Send some data
if(data.equalsIgnoreCase("connect") && wait == true)
{
Log.d(TAG, "Someone wants to connect");
//Increase the total players by 1
players = players + 1;
//Notify to the host (client) something has change
//notify client
//Send a message to the client with the ID
byte[] bufer = new byte[256];
//Send a message "connect" to the host
String msg = Integer.toString(players);
int msgLength = msg.length();
bufer = msg.getBytes();
InetAddress address;
//Default ip address of the host
//Take the address from the packet
addresses.add(packet.getAddress());
Log.d(TAG, "Address is " + addresses.get(addresses.size() - 1));
address = addresses.get(addresses.size() - 1);
DatagramPacket p = new DatagramPacket(bufer, bufer.length , address, port);
//Send packet
try
{
socket.send(p);
}
catch (IOException e)
{
e.printStackTrace();
}
wait = false;
}
if(wait == true && position == true)
{
position = false;
wait = false;
}
for(int i = 0;i < positions.length; i++)
{
if(positions[i] != null)
{
//Log.d(TAG, "X and Y position of asset:"+i+", is:"+ positions[i]);
}
}
//Needs to try and reteive data...
if(wait == false)
{
//Log.d(TAG, "Waiting to retreive data");
byte[] buf = new byte[256];
packet = new DatagramPacket(buf, buf.length);
try
{
socket.receive(packet);
wait = true;
}
catch (IOException e)
{
Log.d(TAG, "Error with receiving data");
e.printStackTrace();
}
data = new String(buf, 0, packet.getLength());
//Log.d(TAG, "Data received from :" + packet.getAddress() + ", holds this value: " + data);
String[] dataStrings = data.split(":");
if(dataStrings[0].equalsIgnoreCase("position"))
{
position = true;
}
}
//Log.d(TAG, "Data received was :" + data);
/*try
{
Thread.sleep(25);
}
catch (InterruptedException e)
{
// TODO Auto-generated catch block
Log.d(TAG, "Error with trying to sleep");
e.printStackTrace();
}*/
}
Log.d(TAG, "Error with while run value");
return "finished";
}
客户端代码连接到服务器
public void connectToServer()
{
//Send a connect message to the server
try {
//Create a socket
socket = new DatagramSocket(port);
byte[] bufer = new byte[256];
//Send a message "connect" to the host
String msg = "connect";
int msgLength = msg.length();
bufer = msg.getBytes();
InetAddress address;
//Default ip address of the host
address = InetAddress.getByName("192.168.1.59");
DatagramPacket p = new DatagramPacket(bufer, bufer.length , address, port);
//Send packet
socket.send(p);
} catch (UnknownHostException e2) {
Log.d(TAG, "Unknown host");
e2.printStackTrace();
} catch (SocketException e) {
Log.d(TAG, "Socket problem");
e.printStackTrace();
} catch (IOException e) {
Log.d(TAG, "I/O problem");
e.printStackTrace();
}
//Receive the message back
byte[] buf = new byte[256];
DatagramPacket packet = new DatagramPacket(buf, buf.length);
//Try to receive a packet from the server
try
{
Log.d(TAG, "Waiting for data");
socket.receive(packet);
}
//Error
catch (IOException e)
{
Log.d(TAG, "Error with receiving data");
e.printStackTrace();
}
//Convert the packet to a string
String data = new String(buf, 0, packet.getLength());
//Use the string to find out what ID this client is
ID = Integer.parseInt(data);
//Setup the client game
setUpClient();
}
我应该尝试并获得connectToServer方法不断地尝试,如果事情是不正确的代码?
帆布
我现在正在处理这个问题,并且我在Android设备上使用AsyncTask,其中一些在ver4及更高版本上运行,线程无法通过GUI使用,我当然会检查代码一旦我得到一切工作正常,只是想获得东西的工作:) – Canvas
oohh也客户端将不断发送数据到服务器,一旦他们已经连接,我没有显示代码,因为这不是问题 – Canvas
那么什么正在发生的事情是,已经连接的客户端正在保持套接字接收繁忙,并且新客户端无法发送连接,因为它很忙。 – Canvas