使用 Wi-Fi direct 的点对点数据共享
Peer to peer data sharing using Wi-Fi direct
我正在使用 Wi-Fi direct
开发 Android 多人游戏。
使用 Wi-Fi direct,我能够在对等设备之间建立连接。该代码还能够将数据从客户端设备发送到服务器设备。 (根据 Android 文档,Wi-Fi 直连使用客户端-服务器模型)
问题:
我无法使用 Wi-Fi direct 将数据从服务器设备共享到客户端设备。
我有以下问题:
- 有没有其他方法可以在两者之间传输数据
(bi-directional)
Android 哪些设备通过 Wi-Fi Direct 连接?
- 在我的在线研究中,我了解到从服务器发送数据
设备到客户端设备,服务器需要知道客户端的IP
地址。如何使用此客户端的 IP 地址从中发送数据
服务器设备到客户端设备? (我能够获取客户端的 IP
地址)
如果您对这些问题有任何建议,我将不胜感激。提前谢谢你。
代码:
服务器端
public class DataTransferAsyncTask extends AsyncTask<Void,Void,String>{
ServerSocket serverSocket;
Socket client;
InputStream inputstream;
Context context = mActivity.getApplicationContext();
String s;
InetAddress client_add;
@Override
protected String doInBackground(Void... voids) {
try{
serverSocket = new ServerSocket(9999);
Log.e("hello", "Server: Socket opened");
client = serverSocket.accept();
Log.e("hello", "Server: connection done");
inputstream = client.getInputStream();
// OutputStream outputStream = serverSocket.getO
//getting data from client
byte[] address = new byte[12];
if(client.isConnected())
inputstream.read(address);
s = new String(address);
String only_add = new String();
only_add = s.substring(0,12);
client_add = InetAddress.getByName(only_add);
Log.e("hello", "Server: clients ip 1 " + only_add);
Log.e("hello", "Server: converted address 1 " + client_add + " \n is connected"+
client.isConnected());
//send data to client
OutputStream stream = client.getOutputStream();
stream.write(s.getBytes());
Log.e("hello","context value "+context);
// cancel(true);
}catch (IOException e){
}
return null;
}
}
客户端:
@override
protected void onHandleIntent(Intent intent) {
Log.e("hello","client socket");
Toast.makeText(this,"client socket",Toast.LENGTH_LONG).show();
Context context = getApplicationContext();
if(intent.getAction().equals(action_send_data)){
String host = intent.getStringExtra(group_owner_address);
Socket socket = new Socket();
int port = intent.getIntExtra(group_owner_port,9999);
//binding connection
try{
String x="hello";
Log.e("hello","opening client socket");
byte[] address = getLocalAddress();
String ipAdd = getDottedDecimalIP(address);
socket.bind(null);
socket.connect(new InetSocketAddress(host,port),socket_timeout);
Log.e("hello","device socket address "+ socket.getInetAddress() );
Log.e("hello","client socket is connected"+socket.isConnected());
Log.e("hello","device address :"+ipAdd + " byte "+ address);
//sending data to server
OutputStream stream = socket.getOutputStream();
stream.write(ipAdd.getBytes());
//getting data from the server(supposed to)
InputStream inputstream = socket.getInputStream();
byte[] address_to_sto_fr_ser = new byte[15] ;
inputstream.read(address_to_sto_fr_ser);
String s = new String(address_to_sto_fr_ser);
Log.e("msg from server","msg from server "+s);
// stream.close();
// is.close();
}catch (IOException e){
}
}
}
客户端与 WiFi Direct 群组所有者之间的通信基于群组所有者上的套接字服务器 运行 以及连接到该服务器的客户端。
一旦 WiFi Direct 组形成(你可以通过检查“onConnectionInfoAvailable(WifiP2pInfo wifiP2pInfo)”知道),检查当前设备是否是组所有者,如果是,启动套接字服务器(类似于你的代码) :
mServerSocket = new ServerSocket(mPort);
Log.e(getClass().getSimpleName(), "Running on port: " + mServerSocket.getLocalPort());
接下来,添加此行以接受连接并存储客户端套接字的引用:
Socket mSocket = mServerSocket.accept();
现在,您有了客户端套接字的引用,您可以使用它向它发送数据/消息。接下来,另一个设备(客户端)应该发起到套接字服务器的连接:
mSocket = new Socket();
mSocket.bind(null);
mSocket.connect(new InetSocketAddress(mAddress, mPort), 500);
从服务器向客户端发送消息:
DataOutputStream mDataOutputStream = new DataOutputStream(mSocket.getOutputStream());
发送简单消息:
mDataOutputStream.writeUTF(message);
mDataOutputStream.flush();
希望对您有所帮助。
我正在使用 Wi-Fi direct
开发 Android 多人游戏。
使用 Wi-Fi direct,我能够在对等设备之间建立连接。该代码还能够将数据从客户端设备发送到服务器设备。 (根据 Android 文档,Wi-Fi 直连使用客户端-服务器模型)
问题:
我无法使用 Wi-Fi direct 将数据从服务器设备共享到客户端设备。
我有以下问题:
- 有没有其他方法可以在两者之间传输数据
(bi-directional)
Android 哪些设备通过 Wi-Fi Direct 连接? - 在我的在线研究中,我了解到从服务器发送数据 设备到客户端设备,服务器需要知道客户端的IP 地址。如何使用此客户端的 IP 地址从中发送数据 服务器设备到客户端设备? (我能够获取客户端的 IP 地址)
如果您对这些问题有任何建议,我将不胜感激。提前谢谢你。
代码: 服务器端
public class DataTransferAsyncTask extends AsyncTask<Void,Void,String>{
ServerSocket serverSocket;
Socket client;
InputStream inputstream;
Context context = mActivity.getApplicationContext();
String s;
InetAddress client_add;
@Override
protected String doInBackground(Void... voids) {
try{
serverSocket = new ServerSocket(9999);
Log.e("hello", "Server: Socket opened");
client = serverSocket.accept();
Log.e("hello", "Server: connection done");
inputstream = client.getInputStream();
// OutputStream outputStream = serverSocket.getO
//getting data from client
byte[] address = new byte[12];
if(client.isConnected())
inputstream.read(address);
s = new String(address);
String only_add = new String();
only_add = s.substring(0,12);
client_add = InetAddress.getByName(only_add);
Log.e("hello", "Server: clients ip 1 " + only_add);
Log.e("hello", "Server: converted address 1 " + client_add + " \n is connected"+
client.isConnected());
//send data to client
OutputStream stream = client.getOutputStream();
stream.write(s.getBytes());
Log.e("hello","context value "+context);
// cancel(true);
}catch (IOException e){
}
return null;
}
}
客户端:
@override
protected void onHandleIntent(Intent intent) {
Log.e("hello","client socket");
Toast.makeText(this,"client socket",Toast.LENGTH_LONG).show();
Context context = getApplicationContext();
if(intent.getAction().equals(action_send_data)){
String host = intent.getStringExtra(group_owner_address);
Socket socket = new Socket();
int port = intent.getIntExtra(group_owner_port,9999);
//binding connection
try{
String x="hello";
Log.e("hello","opening client socket");
byte[] address = getLocalAddress();
String ipAdd = getDottedDecimalIP(address);
socket.bind(null);
socket.connect(new InetSocketAddress(host,port),socket_timeout);
Log.e("hello","device socket address "+ socket.getInetAddress() );
Log.e("hello","client socket is connected"+socket.isConnected());
Log.e("hello","device address :"+ipAdd + " byte "+ address);
//sending data to server
OutputStream stream = socket.getOutputStream();
stream.write(ipAdd.getBytes());
//getting data from the server(supposed to)
InputStream inputstream = socket.getInputStream();
byte[] address_to_sto_fr_ser = new byte[15] ;
inputstream.read(address_to_sto_fr_ser);
String s = new String(address_to_sto_fr_ser);
Log.e("msg from server","msg from server "+s);
// stream.close();
// is.close();
}catch (IOException e){
}
}
}
客户端与 WiFi Direct 群组所有者之间的通信基于群组所有者上的套接字服务器 运行 以及连接到该服务器的客户端。
一旦 WiFi Direct 组形成(你可以通过检查“onConnectionInfoAvailable(WifiP2pInfo wifiP2pInfo)”知道),检查当前设备是否是组所有者,如果是,启动套接字服务器(类似于你的代码) :
mServerSocket = new ServerSocket(mPort);
Log.e(getClass().getSimpleName(), "Running on port: " + mServerSocket.getLocalPort());
接下来,添加此行以接受连接并存储客户端套接字的引用:
Socket mSocket = mServerSocket.accept();
现在,您有了客户端套接字的引用,您可以使用它向它发送数据/消息。接下来,另一个设备(客户端)应该发起到套接字服务器的连接:
mSocket = new Socket();
mSocket.bind(null);
mSocket.connect(new InetSocketAddress(mAddress, mPort), 500);
从服务器向客户端发送消息:
DataOutputStream mDataOutputStream = new DataOutputStream(mSocket.getOutputStream());
发送简单消息:
mDataOutputStream.writeUTF(message);
mDataOutputStream.flush();
希望对您有所帮助。