【发布时间】:2014-01-24 16:27:14
【问题描述】:
我一直在开发一个将连接到另一台计算机上的 C# 服务器的 Android 项目。我已经使用 C# 客户端测试了服务器端,但我需要一个 Android 客户端才能从 Android 平板电脑连接。
我发现的问题是套接字没有被实例化,我不知道为什么。任何指导将不胜感激,我是 Android 新手并想学习。
首先我在清单中的权限:
<uses-permission android:name="android.permission.INTERNET" />
<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE"/>
接下来在我的 .java 类中,在触摸事件上调用一个线程:
new Thread(new ClientThread()).start();
最后我们有了线程:
class ClientThread implements Runnable
{
@Override
public void run()
{
ConnectivityManager connMgr = (ConnectivityManager) getSystemService(Context.CONNECTIVITY_SERVICE);
NetworkInfo networkInfo = connMgr.getActiveNetworkInfo();
if (networkInfo != null && networkInfo.isConnected())
{
try
{
Log.i("Project", SERVER_IP);
InetAddress serverAddr = InetAddress.getByName(SERVER_IP);
Log.i("Project", serverAddr.toString());
Log.i("Project", String.valueOf(SERVERPORT));
socket = new Socket(serverAddr, SERVERPORT);
Log.i("Project", "Socket created");
OutputStream out = socket.getOutputStream();
Log.i("Project", "Open paint writer");
PrintWriter output = new PrintWriter(out);
Log.i("Project", "Sending Data to PC");
output.println("Hello from Android");
Log.i("Project", "out.flush");
out.flush();
Log.i("Project", "out.close");
out.close();
Log.i("Project", "Data sent to PC, close socket");
socket.close();
}
catch (Exception e)
{
Log.i("IS4432", "Error");
e.printStackTrace();
}
}
else
{
// display error
Log.i("Project", "No Internet");
}
我使用日志来查找代码停止工作的位置,它停止在socket = new Socket(serverAddr, SERVERPORT);。它也没有捕获任何异常。
编辑 - 已解决的解决方案
我按照建议从线程切换到AsyncTask。我实例化了套接字然后连接它。现在我的应用程序能够向服务器发送一个字符串
首先从触摸事件中调用方法:
getSocket task = new getSocket();
task.execute(new String[] { "PlaceHolder" });
还有方法,我在www.vogella.com上的一个教程里记笔记:
private class getSocket extends AsyncTask<String, Void, String>
{
@Override
protected String doInBackground(String... urls)
{
String response = "";
String msg = "Hello, from Android<EOF>";
socket = new Socket();
Log.i("Project","Socket instantiated");
try
{
socket.connect(new InetSocketAddress(SERVER_IP, SERVERPORT), 5000);
Log.i("Project","Connection Made");
// This buffer to receive data from your server
BufferedReader in = new BufferedReader(new InputStreamReader(socket.getInputStream()));
response = in.toString();
Log.i("Project","Input Stream");
// This one to send
OutputStream out = socket.getOutputStream();
Log.i("Project","Output Stream");
out.write(msg.getBytes("US-ASCII"));
out.flush();
Log.i("Project", msg.getBytes().toString());
}
catch (IOException e)
{
// TODO Auto-generated catch block
e.printStackTrace();
Log.i("Project","IOException");
}
catch (Exception e)
{
Log.i("Project","Something went Wrong");
}
return response;
}
}
【问题讨论】:
-
请发布 LogCat 错误
-
必须有。再看一遍。
标签: java android multithreading sockets