使用Socket的Android客户端和Java桌面通信
我正在尝试用android创建一个与Java桌面服务器通信(消息和文件)的应用程序,我正在使用套接字编程。我在网上找到了代码。当我尝试运行android客户端时,应用程序中没有错误,它显示UI。我输入了一个字符串,然后单击“提交”按钮,它会显示“不幸的是,应用程序已停止工作”,这是我的源代码: JAVA服务器编码:使用Socket的Android客户端和Java桌面通信,java,android,sockets,Java,Android,Sockets,我正在尝试用android创建一个与Java桌面服务器通信(消息和文件)的应用程序,我正在使用套接字编程。我在网上找到了代码。当我尝试运行android客户端时,应用程序中没有错误,它显示UI。我输入了一个字符串,然后单击“提交”按钮,它会显示“不幸的是,应用程序已停止工作”,这是我的源代码: JAVA服务器编码: import java.io.BufferedReader; import java.io.IOException; import java.io.InputStreamReader
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.net.ServerSocket;
import java.net.Socket;
public class Main {
private static ServerSocket serverSocket;
private static Socket clientSocket;
private static InputStreamReader inputStreamReader;
private static BufferedReader bufferedReader;
private static String message;
public Main(){}
public static void main(String[] args) {
try {
serverSocket = new ServerSocket(7575); //Server socket
} catch (IOException e) {
System.out.println("Could not listen on port: 7575");
}
System.out.println("Server started. Listening to the port 7575");
while (true) {
try {
clientSocket = serverSocket.accept(); //accept the client connection
inputStreamReader = new InputStreamReader(clientSocket.getInputStream());
bufferedReader = new BufferedReader(inputStreamReader); //get the client message
message = bufferedReader.readLine();
System.out.println(message);
inputStreamReader.close();
clientSocket.close();
} catch (IOException ex) {
System.out.println("Problem in message reading");
}
}
}
}
Android编码
activity\u simple\u client.xml
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:paddingBottom="@dimen/activity_vertical_margin"
android:paddingLeft="@dimen/activity_horizontal_margin"
android:paddingRight="@dimen/activity_horizontal_margin"
android:paddingTop="@dimen/activity_vertical_margin"
tools:context=".SimpleClientActivity" >
<EditText
android:id="@+id/editText1"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_alignParentTop="true"
android:layout_centerHorizontal="true"
android:layout_marginTop="83dp"
android:ems="10"
android:hint="@string/clientmsg" >
<requestFocus />
</EditText>
<TextView
android:id="@+id/textView1"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_alignBottom="@+id/editText1"
android:layout_centerHorizontal="true"
android:layout_marginBottom="46dp"
android:text="@string/instrut"
android:textAppearance="?android:attr/textAppearanceLarge" />
<Button
android:id="@+id/button1"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_below="@+id/editText1"
android:layout_centerHorizontal="true"
android:layout_marginTop="34dp"
android:text="@string/send" />
</RelativeLayout>
SimpleClient清单
<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
package="com.andro.SimpleClient"
android:versionCode="1"
android:versionName="1.0" >
<uses-sdk
android:minSdkVersion="8"
android:targetSdkVersion="18" />
<uses-permission android:name="android.permission.INTERNET"></uses-permission>
<application
android:allowBackup="true"
android:icon="@drawable/ic_launcher"
android:label="@string/app_name"
android:theme="@style/AppTheme" >
<activity
android:name="com.andro.SimpleClient.SimpleClientActivity"
android:label="@string/app_name" >
<intent-filter>
<action android:name="android.intent.action.MAIN" />
<category android:name="android.intent.category.LAUNCHER" />
</intent-filter>
</activity>
</application>
</manifest>
我是否需要修改Eclipse中的任何设置?。
有人能帮我吗??提前谢谢
我的LOCCAT文件
01-25 00:51:42.035: W/System.err(920): java.net.SocketException: socket failed: EACCES (Permission denied)
01-25 00:51:42.035: W/System.err(920): at libcore.io.IoBridge.socket(IoBridge.java:576)
01-25 00:51:42.095: W/System.err(920): at java.net.PlainSocketImpl.create(PlainSocketImpl.java:201)
01-25 00:51:42.095: W/System.err(920): at java.net.Socket.startupSocket(Socket.java:560)
01-25 00:51:42.105: W/System.err(920): at java.net.Socket.tryAllAddresses(Socket.java:128)
01-25 00:51:42.105: W/System.err(920): at java.net.Socket.<init>(Socket.java:178)
01-25 00:51:42.105: W/System.err(920): at java.net.Socket.<init>(Socket.java:150)
01-25 00:51:42.105: W/System.err(920): at com.android.homeapp.Sendstring.run(Sendstring.java:17)
01-25 00:51:42.105: W/System.err(920): at java.lang.Thread.run(Thread.java:841)
01-25 00:51:42.105: W/System.err(920): Caused by: libcore.io.ErrnoException: socket failed: EACCES (Permission denied)
01-25 00:51:42.105: W/System.err(920): at libcore.io.Posix.socket(Native Method)
01-25 00:51:42.105: W/System.err(920): at libcore.io.BlockGuardOs.socket(BlockGuardOs.java:181)
01-25 00:51:42.125: W/System.err(920): at libcore.io.IoBridge.socket(IoBridge.java:561)
I changed my Mainactivity.java as follows but it still display "Application has Stopped" and in my logcat "MainThread doing too much of work"
01-25 00:51:42.035:W/System.err(920):java.net.SocketException:socket失败:EACCES(权限被拒绝)
01-25 00:51:42.035:W/System.err(920):位于libcore.io.IoBridge.socket(IoBridge.java:576)
01-25 00:51:42.095:W/System.err(920):位于java.net.PlainSocketImpl.create(PlainSocketImpl.java:201)
01-25 00:51:42.095:W/System.err(920):位于java.net.Socket.startupSocket(Socket.java:560)
01-25 00:51:42.105:W/System.err(920):位于java.net.Socket.tryalladdress(Socket.java:128)
01-25 00:51:42.105:W/System.err(920):位于java.net.Socket(Socket.java:178)
01-25 00:51:42.105:W/System.err(920):位于java.net.Socket(Socket.java:150)
01-25 00:51:42.105:W/System.err(920):位于com.android.homeapp.Sendstring.run(Sendstring.java:17)
01-25 00:51:42.105:W/System.err(920):位于java.lang.Thread.run(Thread.java:841)
01-25 00:51:42.105:W/System.err(920):由以下原因引起:libcore.io.ErrnoException:套接字失败:EACCES(权限被拒绝)
01-25 00:51:42.105:W/System.err(920):位于libcore.io.Posix.socket(本机方法)
01-25 00:51:42.105:W/System.err(920):位于libcore.io.BlockGuardOs.socket(BlockGuardOs.java:181)
01-25 00:51:42.125:W/System.err(920):位于libcore.io.IoBridge.socket(IoBridge.java:561)
我更改了Mainactivity.java,如下所示,但它仍然显示“应用程序已停止”,并且在我的日志猫中显示“MainThread做了太多的工作”
MainActivity.java
package com.andro.asynctask;
import java.io.IOException;
import java.io.PrintWriter;
import java.net.Socket;
import java.net.UnknownHostException;
import android.os.AsyncTask;
import android.os.Bundle;
import android.app.Activity;
import android.view.Menu;
import android.widget.EditText;
import android.widget.Button;
import android.view.*;
public class MainActivity extends Activity {
private String mMsg;
private Socket client;
private PrintWriter writer;
private Asyncclass ac;
private EditText txt;
//private Button btn;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
txt=(EditText)findViewById(R.id.editText1);
//btn=(Button)findViewById(R.id.button1);
}
class Asyncclass extends AsyncTask<String,Void, String>
{
public Asyncclass(String msg)
{
mMsg=msg;
}
@Override
protected String doInBackground(String... params) {
// TODO Auto-generated method stub
try
{
hardtask();
}
catch(IOException i)
{
i.printStackTrace();
}
return null;
}
public void hardtask() throws IOException,UnknownHostException
{
client=new Socket("localhost", 7575);
writer=new PrintWriter(client.getOutputStream(),true);
writer.write(mMsg);
writer.flush();
writer.close();
}
}
public void OnClick(View view)
{
mMsg=txt.getText().toString();
ac=new Asyncclass(mMsg);
ac.execute();
}
@Override
public boolean onCreateOptionsMenu(Menu menu) {
// Inflate the menu; this adds items to the action bar if it is present.
getMenuInflater().inflate(R.menu.main, menu);
return true;
}
}
package com.andro.asynctask;
导入java.io.IOException;
导入java.io.PrintWriter;
导入java.net.Socket;
导入java.net.UnknownHostException;
导入android.os.AsyncTask;
导入android.os.Bundle;
导入android.app.Activity;
导入android.view.Menu;
导入android.widget.EditText;
导入android.widget.Button;
导入android.view.*;
公共类MainActivity扩展了活动{
私有字符串mMsg;
专用套接字客户端;
私人版画作家;
专用异步类ac;
私有编辑文本文本;
//专用按钮btn;
@凌驾
创建时受保护的void(Bundle savedInstanceState){
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
txt=(EditText)findViewById(R.id.editText1);
//btn=(按钮)findViewById(R.id.button1);
}
类Asyncclass扩展了AsyncTask
{
公共异步类(字符串msg)
{
mMsg=msg;
}
@凌驾
受保护的字符串doInBackground(字符串…参数){
//TODO自动生成的方法存根
尝试
{
硬任务();
}
捕获(IOI异常)
{
i、 printStackTrace();
}
返回null;
}
public void hardtask()引发IOException,UnknownHostException
{
client=新套接字(“localhost”,7575);
writer=新的PrintWriter(client.getOutputStream(),true);
writer.write(彩信);
writer.flush();
writer.close();
}
}
公共void OnClick(视图)
{
mMsg=txt.getText().toString();
ac=新的异步类(mMsg);
ac.execute();
}
@凌驾
公共布尔onCreateOptions菜单(菜单){
//为菜单充气;这会将项目添加到操作栏(如果存在)。
getMenuInflater().充气(R.menu.main,menu);
返回true;
}
}
您试图在主线程上进行网络通信,这在Android 4.0+上是不允许的。要解决崩溃问题,只需将代码移动到另一个线程
(例如,您应该看看)
你可以这样做:
private class SendMessage implements Runnable {
private String mMsg;
public SendMessage(String msg) {
mMsg = msg;
}
public void run() {
try {
client = new Socket("localhost", 7575); //connect to server
printwriter = new PrintWriter(client.getOutputStream(),true);
printwriter.write(messsage); //write the message to output stream
printwriter.flush();
printwriter.close();
client.close(); //closing the connection
} catch (UnknownHostException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}
}
}
然后将onClick
更改为:
public void onClick(View v) {
messsage = textField.getText().toString(); //get the text message on the text field
textField.setText(""); //Reset the text field to blank
new Thread(new SendMessage(message)).start(); // start a new thread to make the communication in the background
}
您在Emulator中调试了吗
client = new Socket("localhost", 7575); //connect to server
如果您使用的是Android手机,请使用10.0.0.2并使用计算机IP地址,确保您已连接到wifi(可以连接到计算机IP)您的日志猫将准确地告诉您问题所在。除了@PsHegger建议的以外,请仔细检查。可能你正在尝试访问127.0.0.1而不是10.0.2.2我对android非常陌生,请告诉我怎么做。我尝试粘贴一个新类,它在日志中显示Error,它说权限被拒绝,所以我猜是:你忘了声明Internet权限。将此添加到您的
AndroidManifest.xml
:
谢谢您的指导。我得到了答案,我将localhost更改为10.0.2.2,而且我忘了授予使用Internet的权限。
java.net.SocketException: socket failed: EACCES (Permission denied)
client = new Socket("localhost", 7575); //connect to server