Java Android Socket(客户端 - 服务器)
声明:本页面是StackOverFlow热门问题的中英对照翻译,遵循CC BY-SA 4.0协议,如果您需要使用它,必须同样遵循CC BY-SA许可,注明原文地址和作者信息,同时你必须将它归于原作者(不是我):StackOverFlow
原文地址: http://stackoverflow.com/questions/20290387/
Warning: these are provided under cc-by-sa 4.0 license. You are free to use/share it, But you must attribute it to the original authors (not me):
StackOverFlow
Android Socket (Client - Server)
提问by user3050103
Hello dear programmers I need to your help.
你好亲爱的程序员我需要你的帮助。
I made a very very very simple java socket (client - server) project, what worked well. But when I used that client code to make it for android, it is not working, but I am making only client code for android, the server code is in Java again(may be I should make the server code in android too?)
我做了一个非常非常简单的java socket(客户端-服务器)项目,效果很好。但是当我使用该客户端代码为 android 制作它时,它不起作用,但我只为 android 制作客户端代码,服务器代码再次使用 Java(也许我也应该在 android 中制作服务器代码?)
Server(in Java)
服务器(Java)
public class DailyAdviceServer{
public void go() {
try {
ServerSocket serverSock = new ServerSocket(16242, 50);
while (true)
{
Socket sock = serverSock.accept();
PrintWriter writer = new PrintWriter(sock.getOutputStream());
String advice = getAdvice();
writer.println(advice);
writer.close();
System.out.println("smth");
}
} catch (IOException ex)
{
ex.printStackTrace();
}
}
public static void main(String[] args)
{
DailyAdviceServer server = new DailyAdviceServer();
server.go();
}
}
}
Client(in Android)
客户端(在Android中)
public class MainActivity extends Activity {
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
try {
TextView tv = (TextView) findViewById(R.id.tv);
Socket s = new Socket("127.0.0.1", 4242);
InputStreamReader streamReader = new InputStreamReader(s.getInputStream());
BufferedReader reader = new BufferedReader(streamReader);
String advice = reader.readLine();
tv.setText("Today you should: " + advice);
reader.close();
}
catch (IOException ex)
{
ex.printStackTrace();
}
}
采纳答案by Simon Xu
You should not connect network in "onCreate()", and can use "AsyncTask"
您不应该在“onCreate()”中连接网络,并且可以使用“AsyncTask”
String advice = "";
class MySyncTask extends AsyncTask<Integer, Integer, String>{
@Override
protected String doInBackground(Integer... params) {
try{
Socket s = new Socket("127.0.0.1", 4242);
InputStreamReader streamReader = new InputStreamReader(s.getInputStream());
BufferedReader reader = new BufferedReader(streamReader);
advice = reader.readLine();
reader.close();
}catch(Exception ex)
ex.printStackTrace();
}
return advice;
}
protected void onPostExecute(String result) {
tv.setText("Today you should: " + advice);
}
protected void onPreExecute() {
log.i("start");
}
}
and add this code in you onCreate:
并在您的 onCreate 中添加此代码:
MySyncTask asyncTask=new MySyncTask (tv,pbar);
asyncTask.execute(1000);
My codes may have some error, you should check;
我的代码可能有一些错误,你应该检查;
You can search "AsyncTask" on google, and have much information for it. It may be useful for you.
你可以在谷歌上搜索“AsyncTask”,并有很多关于它的信息。它可能对你有用。
The works what need many time to do can not put in UI thread , mast put in background.
需要很多时间做的工作不能放在UI线程中,桅杆放在后台。
I am sorry for my bad english
我很抱歉我的英语不好
I am sorry I have modfied my codes again
对不起,我又修改了我的代码
回答by user2652394
You need to flush
after writing the data to make sure the data is sent. You can make the server on Android or Java, both works fine.Try this:
您需要flush
在写入数据后确保数据已发送。您可以在 Android 或 Java 上制作服务器,两者都可以正常工作。试试这个:
writer.println(advice);
writer.flush();
And dont forget the EOF for each and every data you send so the whole thing would be:
并且不要忘记您发送的每个数据的EOF,所以整个事情将是:
writer.println(advice + System.getProperty("line.separator"));
writer.flush();
Hope this helps.
希望这可以帮助。