我正在使用Android应用程序构建SMS发件人应用程序。 Android应用程序充当服务器,而桌面应用程序充当客户端。我已经成功连接了两者。服务器正在接收来自客户端的消息。现在我希望服务器(即Android App)将一些基本设备信息发送回客户端(即桌面App),但不知道如何执行。我的Android应用代码在这里。
this.serverThread = new Thread(new ServerThread());
this.serverThread.start();
class ServerThread implements Runnable {
public void run() {
Socket socket = null;
try {
serverSocket = new ServerSocket(SERVERPORT);
} catch (IOException e) {
e.printStackTrace();
}
while (!Thread.currentThread().isInterrupted()) {
try {
socket = serverSocket.accept();
CommunicationThread commThread = new CommunicationThread(socket);
new Thread(commThread).start();
} catch (IOException e) {
e.printStackTrace();
}
}
}
}
class CommunicationThread implements Runnable {
private Socket clientSocket;
private BufferedReader input;
public CommunicationThread(Socket clientSocket) {
this.clientSocket = clientSocket;
try {
this.input = new BufferedReader(new InputStreamReader(this.clientSocket.getInputStream()));
} catch (IOException e) {
e.printStackTrace();
}
}
public void run() {
while (!Thread.currentThread().isInterrupted()) {
try {
String read = input.readLine();
updateConversationHandler.post(new updateUIThread(read));
} catch (IOException e) {
e.printStackTrace();
}
}
}
}
class updateUIThread implements Runnable {
private String msg;
public updateUIThread(String str) {
this.msg = str;
}
@Override
public void run() {
if(msg.equals("I m Connected"))
{
vConn.setText("Connected");
// Send Back Info
}
vClientMsg.setText(vClientMsg.getText().toString()+"Client Says: "+ msg + "\n");
}
}
答案 0 :(得分:0)
最终找到了解决方案:
第一个定义了包装类
private class Packet
{
public Socket CurrentSocket;
//public byte[] DataBuffer = new byte[4096];
public byte[] DataBuffer = new byte[1024];
/// <summary>
/// Construct a Packet Object
/// </summary>
/// <param name="sock">The socket this Packet is being used on.</param>
/// <param name="client">The client number that this packet is from.</param>
public Packet(Socket sock)
{
CurrentSocket = sock;
}
}
然后等待同步数据
/// <summary>
/// Start an asynchronous wait for data from the server. When data is recieved, a callback will be triggered.
/// </summary>
private void WaitForData()
{
try
{
Packet pack = new Packet(_clientSocket);
_clientSocket.BeginReceive(pack.DataBuffer, 0, pack.DataBuffer.Length, SocketFlags.None, new AsyncCallback(OnDataReceived), pack);
}
catch (SocketException se)
{
System.Console.WriteLine("Client EXCEPTION in WaitForData: " + se.Message);
ToFile(se.Message);
}
}
然后接收和转换数据
/// <summary>
/// A callback triggered by receiving data from the server.
/// </summary>
/// <param name="asyn">The packet object received from the server containing the received message.</param>
private void OnDataReceived(IAsyncResult asyn)
{
try
{
Packet socketData = (Packet)asyn.AsyncState;
int dataSize = socketData.CurrentSocket.EndReceive(asyn);
if (_receive != null)
{
byte[] bData = new byte[1024];
bData = socketData.DataBuffer;
_lastreceivedata = Encoding.ASCII.GetString(bData, 0, dataSize);
_receive(socketData.DataBuffer, dataSize);
}
WaitForData();
}
catch (ObjectDisposedException)
{
System.Console.WriteLine("Client EXCEPTION in OnDataReceived: Socket has been closed");
}
catch (SocketException se)
{
System.Console.WriteLine("Client EXCEPTION in OnDataReceived: " + se.Message);
if (OnDisconnected != null)
OnDisconnected();
ToFile(se.Message);
}
}