Android的插座不能被实例化 [英] Android Socket not being instantiated
问题描述
我一直在努力的Android项目将连接到一个C#服务器另一台计算机上。我已经测试了C#的客户端服务器端,但我需要一个Android用户从Android平板电脑连接。
我发现的问题是,插座没有被实例化,我想不通为什么。任何指导,将AP preciated,我是新来的Android和想学习。
首先我在清单权限:
<使用许可权的android:NAME =android.permission.INTERNET对/>
<使用许可权的android:NAME =android.permission.ACCESS_NETWORK_STATE/>
接下来我的.java类,一个线程被称为上的触摸事件:
新主题(新的ClientThread())开始();
最后,我们纷纷跟帖:
类ClientThread实现Runnable
{
@覆盖
公共无效的run()
{
ConnectivityManager connMgr =(ConnectivityManager)getSystemService(Context.CONNECTIVITY_SERVICE);
的NetworkInfo NETWORKINFO = connMgr.getActiveNetworkInfo();
如果(NETWORKINFO = NULL&放大器;!&安培; networkInfo.isConnected())
{
尝试
{
Log.i(项目,SERVER_IP);
InetAddress类serverAddr = InetAddress.getByName(SERVER_IP);
Log.i(项目,serverAddr.toString()); Log.i(项目,将String.valueOf(SERVERPORT));
插座=新的Socket(serverAddr,SERVERPORT);
Log.i(项目,创造插座); OutputStream的OUT = socket.getOutputStream(); Log.i(项目,开放漆作家);
PrintWriter的输出=新的PrintWriter(出); Log.i(项目,将数据发送到PC);
output.println(你好于Android); Log.i(项目,了out.flush);
了out.flush(); Log.i(项目,out.close);
out.close(); Log.i(项目,数据传送到PC,关闭套接字);
socket.close();
}
赶上(例外五)
{
Log.i(IS4432,错误);
e.printStackTrace();
}
}
其他
{
//显示错误
Log.i(项目,无网络);
}
我使用日志的寻找到code停止工作,停止对插座=新的Socket(serverAddr,SERVERPORT);
。它也没有捕获任何异常。
编辑 - 解决方案
我从一个线程切换到的AsyncTask
的通知。我实例化的插座,然后再连接它。现在我的应用程序能够将字符串发送到服务器
首先从触摸事件调用方法:
getSocket任务=新getSocket();
task.execute(新的String [] {占位符});
和方法,我把笔记从教程 www.vogella.com 一>:
私有类getSocket扩展的AsyncTask<弦乐,太虚,字符串>
{
@覆盖
保护字符串doInBackground(字符串的URL ...)
{
串响应=;
弦乐味精=你好,从Android和LT; EOF>中;
插座=新的Socket();
Log.i(项目,插座实例); 尝试
{
socket.connect(新的InetSocketAddress(SERVER_IP,SERVERPORT),5000);
Log.i(项目,连接制造); //这个缓冲区从服务器接收数据
在的BufferedReader =新的BufferedReader(新的InputStreamReader(socket.getInputStream()));
响应= in.toString();
Log.i(项目,输入流); //这一次送
OutputStream的OUT = socket.getOutputStream();
Log.i(项目,输出流); out.write(msg.getBytes(US-ASCII));
了out.flush();
Log.i(项目,msg.getBytes()的toString());
}
赶上(IOException异常E)
{
// TODO自动生成catch块
e.printStackTrace();
Log.i(项目,IOException异常);
}
赶上(例外五)
{
Log.i(项目,出事了);
}
返回响应;
}
}
我的建议是,如果你只是在Android beggining,实施内的的AsyncTask
的插座。这基本上是一个发
与你需要自己,如果你使用了发
类控制一些改进。一旦你清楚这一点,你可能要开始与发
取值自己经历,在我看来,首先是一个主题学习
是有点'铁杆'。
开始在你的 doInBackground()
方法插座,使用这样的:
插座=新的Socket();
socket.connect(新的InetSocketAddress(主机,端口),超时);//这个缓冲区从服务器接收数据
在=新的BufferedReader(新的InputStreamReader(socket.getInputStream(),ISO-8859-1));
//这一次送
OUT = socket.getOutputStream();
要在从服务器读取行:
,而((缓冲= in.readLine())!= NULL){
//就我而言,缓冲是一个String
...
}
要发送一些东西到服务器:
//的字符集是因为我的服务器是在西班牙:-)
out.write(msg.getBytes(ISO-8859-1));
I have been working on an Android project that will connect to a C# server on another computer. I have tested the server side with a C# client but I need an Android client to connect from an android tablet.
The problem I have found is that the socket is not being instantiated and I cannot figure out why. Any guidance would be appreciated, I am new to Android and want to learn.
First off my permissions in the manifest:
<uses-permission android:name="android.permission.INTERNET" />
<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE"/>
Next in my .java class, a thread is called on a touch event:
new Thread(new ClientThread()).start();
And finally we have the thread:
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");
}
I use the Log's to find where the code stops working, it stops on socket = new Socket(serverAddr, SERVERPORT);
. It also doesn't catch any exception.
EDIT - Solved Solution
I switched from a thread to an AsyncTask
as advised. I instantiated the socket and then connected it. Now my application is able to send a string to the server
First calling the method from a touch event:
getSocket task = new getSocket();
task.execute(new String[] { "PlaceHolder" });
And the method, I took notes from a tutorial on 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;
}
}
My advice is that if you're just beggining with Android, implement that socket within an AsyncTask
. It's basically a Thread
with some improvements you'd need to control by yourself if you used the Thread
class. Once you're clear about that, you may want start experiencing with Thread
s themselves, in my opinion starting learning with an Thread
is a bit 'hardcore'.
Start that socket in your doInBackground()
method, using something like this:
socket = new Socket();
socket.connect(new InetSocketAddress(host, port), timeout);
// This buffer to receive data from your server
in = new BufferedReader(new InputStreamReader(socket.getInputStream(), "ISO-8859-1"));
// This one to send
out = socket.getOutputStream();
To read lines from the server:
while ((buffer = in.readLine()) != null) {
// In my case, buffer is a String
...
}
To send out something to the server:
// The charset is because my server is in spanish :-)
out.write(msg.getBytes("ISO-8859-1"));
这篇关于Android的插座不能被实例化的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!