学习Socket通信,首先创建了一个Java Project的服务端,代码如下://Server
package lin.server;import java.io.IOException;
import java.io.OutputStream;
import java.net.ServerSocket;
import java.net.Socket;public class MyServer
{ public static void main(String[] args)
{
try
{
System.out.println("Server Started...");
ServerSocket server = new ServerSocket(8888);
while(true)
{
Socket client = server.accept();
OutputStream out = client.getOutputStream();
String msg = "Hello Android";
out.write(msg.getBytes());
out.flush();
client.close();
}
} catch (IOException e)
{
e.printStackTrace();
} }}然后创建一个Android Project客户端
代码如下:package lin.client;import java.io.IOException;
import java.io.InputStream;
import java.net.InetAddress;
import java.net.Socket;
import java.net.UnknownHostException;import android.app.Activity;
import android.os.Bundle;
import android.widget.TextView;public class ClientActivity extends Activity {
    /** Called when the activity is first created. */
private TextView msgTextView = null;
    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.socket);
        msgTextView = (TextView)findViewById(R.id.textview_msg);
        try
{
Socket server = new Socket(InetAddress.getLocalHost(),8888);
InputStream in = server.getInputStream();
byte[] buffer = new byte[in.available()];
in.read(buffer);
String msg = new String(buffer);
msgTextView.setText(msg);

} catch (UnknownHostException e)
{
e.printStackTrace();
}
catch (IOException e) {
System.out.println("郁闷的地方");
e.printStackTrace();
}
    }
}
我的布局文件如下:<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:orientation="vertical"
    android:layout_width="fill_parent"
    android:layout_height="fill_parent"
    >
<TextView  
    android:id="@+id/textview_msg"
    android:layout_width="fill_parent" 
    android:layout_height="wrap_content" 
    android:text="等待接收服务器的信息......"
    />
</LinearLayout>我先运行服务器端,再运行客户端,可是在客户端的TextView并不能显示从服务器端得来的消息,经过调试,发现,客户端捕捉到了异常,我已经用.printStackTrace();打印异常了,可是不知道在哪里得到这些打印出来的信息,求指教!
顺便请教我的代码哪个地方出粗咯。谢谢各位!

解决方案 »

  1.   

    把localhost 改成127.0.0.1
      

  2.   

    两个问题:
    1.权限:<uses-permission android:name="android.permission.INTERNET"/>
    2.应该是Server发送 Client接收 你应该是写反了。
      

  3.   

    我知道错在什么地方了,我调试报的错误是这样的:
    java.net.SocketException: Permission denied
    网上查了之后,解释如下:
    这是一个经典错误, Socket不能对外连接,错误不会被报出,调试的时候,能看到Exception,  一般是抛出 java.net.socketexception permission denied这个异常。
    只要你的程序想联网,就会抛出这个异常,最终联网失败。 
    原因是: 需要访问到网络必须要有权限,
    在AndroidManifest.xml中,需要进行如下配置: 
    <uses-permission android:name="android.permission.INTERNET" />但是我在AndroidManifest.xml添加上<uses-permission android:name="android.permission.INTERNET" />
    之后,运行程序,又报出这样的错误,说这句
    Socket server = new Socket(InetAddress.getLocalHost(),8888);
    抛出异常
    java.net.ConnectionException -----Connection Refused
    郁闷了,这个问题该怎么解决啊!
      

  4.   

    我试了,改成“127.0.0.1“之后仍然报错是
    java.net.ConnectionException -----Connection Refused回复2楼:
    感谢你的回答,但是我是照着书上敲的代码,服务器发送,客户端接收,应该没有写反吧
      

  5.   

    发现网上一位朋友和我遇到了同样的问题,解决方法如下:
    最近学习Android时,创建Socket对象进行网络连接发现两个问题问题一:连接时System.err,报java.net.SocketException:Permission denied解决方法:          在AndroidManifest.xml文件中进行相关配置          <uses-permission android:name="android.permission.INTERNET" />问题二:在xml文件中配置完成之后再次连接,这时报了另一个异常,System.err     java.net.ConnectException:localhost/127.0.0.1:8888-Connection refused解决方法:         将Socket中的本地地址改成10.0.2.2(原因是模拟器将127.0.0.1或localhost作为自己的地址了)
      

  6.   

    发现你的问题了 把Socket(InetAddress.getLocalHost(),8888);IP 改成你的本地IP  或者是把模拟器和本机IP邦定 
      

  7.   

    手机和pc通讯,你用usb还是wifi
      

  8.   

    多打一些LOG出来。或者DEBUG一下,就能确定问题出在哪里了。