关于socket,同一个wifi,为什么电脑局域网能通信,手机就不能??
代码哪里出问题了??真纠结:关键性代码:
服务端:
TcpSocketServer :package hua.tcpsocket;import java.io.ByteArrayInputStream;
import java.io.InputStream;
import java.io.OutputStream;
import java.net.ServerSocket;
import java.net.Socket;public class TcpSocketServer {
public TcpSocketServer(){

}
public void startWifi(int port,String buffer)throws Exception{
//新建ServerSocket对象,端口为传进来的port;
ServerSocket ss = new ServerSocket(port);
//新建Socket通信对象,接受客户端发来的请求accept();
Socket s = ss.accept();
//创建输入流对象InputStream
InputStream bais = new ByteArrayInputStream(buffer.getBytes());
//创建输出流对象OutputStream
OutputStream out = s.getOutputStream();
byte[] buff = new byte[1024];
while(bais.read(buff) > 0){
out.write(buff);
}
s.close();
}
}服务端的:
MainActivity:
package hua.tcpsocket;import android.os.Bundle;
import android.app.Activity;
import android.view.View;
import android.view.View.OnClickListener;
import android.widget.Button;
import android.widget.EditText;
import android.widget.Toast;public class MainActivity extends Activity { protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
Button buttonStartWifi = (Button) this.findViewById(R.id.startWifi);
buttonStartWifi.setOnClickListener(new OnClickListener() { public void onClick(View arg0) {
//获取字符串缓冲区buffer
EditText bufferEditText = (EditText)MainActivity.this.findViewById(R.id.buffer);
String buffer = bufferEditText.getText().toString();
//获取端口port
EditText portEditText = (EditText)MainActivity.this.findViewById(R.id.port);
String port = portEditText.getText().toString();
//建立服务端
TcpSocketServer tss = new TcpSocketServer();
try {
//开始发射wifi信号
tss.startWifi(Integer.parseInt(port),buffer);
} catch (Exception e) {
e.printStackTrace();
}
//提示信息
Toast.makeText(MainActivity.this, "started",Toast.LENGTH_SHORT).show();
}
});
}
class ServerThread extends Thread{
public void run(){ }
}
}
客户端的:
TcpSocketClient :

package hua.temp;
import java.io.InputStream;
import java.net.Socket;public class TcpSocketClient {
public TcpSocketClient(){

}
public String receiveWifi(String ip,int port)throws Exception{
//新建Socket通信对象
Socket s = new Socket(ip,port);
//创建输入流对象InputStream
InputStream is = s.getInputStream();
byte[] buff = new byte[1024];
StringBuffer buffer = new StringBuffer();
while(is.read(buff) > 0){
buffer.append(buff);

s.close();
return buffer.toString();
}
}
客户端的:
MainActivity :

package hua.temp;import android.os.Bundle;
import android.app.Activity;
import android.view.View;
import android.view.View.OnClickListener;
import android.widget.Button;
import android.widget.EditText;
import android.widget.Toast;public class MainActivity extends Activity { protected void onCreate(Bundle savedInstanceState){
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);

Button b = (Button)this.findViewById(R.id.button);
b.setOnClickListener(new OnClickListener() {
public void onClick(View v) {
//获取ip输入地址
EditText ipEditText   = (EditText)MainActivity.this.findViewById(R.id.ip);
//获取port端口
EditText portEditText = (EditText)MainActivity.this.findViewById(R.id.port);
//建立TcpSocketClient对象
TcpSocketClient tsc = new TcpSocketClient();

String ip = ipEditText.getText().toString();
String port = portEditText.getText().toString();
String buffer = new String();

try {
//接收wifi
buffer = tsc.receiveWifi(ip, Integer.parseInt(port));
} catch (Exception e) {
e.printStackTrace();
}

//设置接收来的内容
EditText editText02 = (EditText)MainActivity.this.findViewById(R.id.EditText02);
editText02.setText(buffer);
Toast.makeText(MainActivity.this, "receive",Toast.LENGTH_SHORT).show();
}
});
}
}
搞了三四天都搞不出??哪里出问题了??Wi-Fisocketandroid通信手机

解决方案 »

  1.   

    我电脑和其它电脑的局域网通信可行的代码和上面的差不多,
    但是电脑之间的就行,手机和电脑的就不行,好神奇啊
    我晕了求指教哪里错了
    经测试可行的
    服务端代码:import java.net.*;
    import java.io.*;
    class TcpDemo 
    {
    public static void main(String[] args)throws Exception 
    {
    ServerSocket ss = new ServerSocket(115);
    Socket s = ss.accept();
    InputStream bais = new ByteArrayInputStream("ha ha ha ha ".getBytes());
    OutputStream out = s.getOutputStream();
    byte[] buff = new byte[1024];
    int len = 0;
    while((len = bais.read(buff)) > 0){
    out.write(buff);
    }
    s.close();
    System.out.println("TcpDemo:finish");
    }
    }服务端代码:import java.net.*;
    import java.io.*;
    class TcpClientDemo 
    {
    public static void main(String[] args)throws Exception
    {
    Socket s = new Socket("169.254.205.180",220);
    InputStream is = s.getInputStream();
    byte[] buff = new byte[1024];
    while(is.read(buff) > 0){
    System.out.println(new String(buff,0,buff.length));
    }
    s.close();
    }
    }
      

  2.   

    这个能查到的我是用电脑做服务端的
    cmd命令能查到电脑服务端的局域网的IP地址。。
    没有报错信息
      

  3.   


    06-18 17:40:15.861: W/System.err(16619): android.os.NetworkOnMainThreadException访问网络的方法不可以在主线程里进行。需要起一个线程去链接socket,或则用AsyncTask。
      

  4.   

    谢谢回复,根据你的提示,我改了代码,可是还是不行
    当我启动线程运行的时候出现:
    很抱歉,“xxxxx”已停止运行
    运行不了代码更改以下:package hua.test.tcpsocketclient;import android.os.Bundle;
    import android.app.Activity;
    import android.view.View;
    import android.view.View.OnClickListener;
    import android.widget.Button;
    import android.widget.EditText;
    import android.widget.Toast;public class MainActivity extends Activity {
    protected void onCreate(Bundle savedInstanceState){
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);

    Button b = (Button)this.findViewById(R.id.button);
    b.setOnClickListener(new OnClickListener() {
    public void onClick(View v) {
    new SocketClientThread().start();
    }
    });
    }
    class SocketClientThread extends Thread{
    public void run(){
    String buffer = new String();
    TcpSocketClient tsc = new TcpSocketClient();
    try {
    //接收wifi
    buffer = tsc.receiveWifi("192.168.226.56", 115);
    } catch (Exception e) {
    e.printStackTrace();
    }
    //设置接收来的内容
    EditText editText02 = (EditText)MainActivity.this.findViewById(R.id.EditText02);
    editText02.setText(buffer.toString()+"1111");
    Toast.makeText(MainActivity.this, "receive",Toast.LENGTH_SHORT).show();
    }
    }
    }我已经先把ip地址和端口固定了,服务端一直都在开着
      

  5.   

    谢谢回复,根据你的提示,我改了代码,可是还是不行
    当我启动线程运行的时候出现:
    很抱歉,“xxxxx”已停止运行
    运行不了代码更改以下:package hua.test.tcpsocketclient;import android.os.Bundle;
    import android.app.Activity;
    import android.view.View;
    import android.view.View.OnClickListener;
    import android.widget.Button;
    import android.widget.EditText;
    import android.widget.Toast;public class MainActivity extends Activity {
    protected void onCreate(Bundle savedInstanceState){
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);

    Button b = (Button)this.findViewById(R.id.button);
    b.setOnClickListener(new OnClickListener() {
    public void onClick(View v) {
    new SocketClientThread().start();
    }
    });
    }
    class SocketClientThread extends Thread{
    public void run(){
    String buffer = new String();
    TcpSocketClient tsc = new TcpSocketClient();
    try {
    //接收wifi
    buffer = tsc.receiveWifi("192.168.226.56", 115);
    } catch (Exception e) {
    e.printStackTrace();
    }
    //设置接收来的内容
    EditText editText02 = (EditText)MainActivity.this.findViewById(R.id.EditText02);
    editText02.setText(buffer.toString()+"1111");
    Toast.makeText(MainActivity.this, "receive",Toast.LENGTH_SHORT).show();
    }
    }
    }我已经先把ip地址和端口固定了,服务端一直都在开着报错在eclipse的logcat可以看到日志。根据你的代码,我觉得socket通讯应该没问题。
    但是你不可以在socket线程中去操作view对象。你需要用handler去处理。当然,如果你仅仅是测试socket,
    你可以把结果打印到logcat,而不是放到EditText中。
      

  6.   

    谢谢回复,根据你的提示,我改了代码,可是还是不行
    当我启动线程运行的时候出现:
    很抱歉,“xxxxx”已停止运行
    运行不了代码更改以下:package hua.test.tcpsocketclient;import android.os.Bundle;
    import android.app.Activity;
    import android.view.View;
    import android.view.View.OnClickListener;
    import android.widget.Button;
    import android.widget.EditText;
    import android.widget.Toast;public class MainActivity extends Activity {
    protected void onCreate(Bundle savedInstanceState){
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);

    Button b = (Button)this.findViewById(R.id.button);
    b.setOnClickListener(new OnClickListener() {
    public void onClick(View v) {
    new SocketClientThread().start();
    }
    });
    }
    class SocketClientThread extends Thread{
    public void run(){
    String buffer = new String();
    TcpSocketClient tsc = new TcpSocketClient();
    try {
    //接收wifi
    buffer = tsc.receiveWifi("192.168.226.56", 115);
    } catch (Exception e) {
    e.printStackTrace();
    }
    //设置接收来的内容
    EditText editText02 = (EditText)MainActivity.this.findViewById(R.id.EditText02);
    editText02.setText(buffer.toString()+"1111");
    Toast.makeText(MainActivity.this, "receive",Toast.LENGTH_SHORT).show();
    }
    }
    }我已经先把ip地址和端口固定了,服务端一直都在开着报错在eclipse的logcat可以看到日志。根据你的代码,我觉得socket通讯应该没问题。
    但是你不可以在socket线程中去操作view对象。你需要用handler去处理。当然,如果你仅仅是测试socket,
    你可以把结果打印到logcat,而不是放到EditText中。
    +1。如果你想在SocketClientThread 里更新view,加一个looper吧
      

  7.   

    谢谢回复,根据你的提示,我改了代码,可是还是不行
    当我启动线程运行的时候出现:
    很抱歉,“xxxxx”已停止运行
    运行不了代码更改以下:package hua.test.tcpsocketclient;import android.os.Bundle;
    import android.app.Activity;
    import android.view.View;
    import android.view.View.OnClickListener;
    import android.widget.Button;
    import android.widget.EditText;
    import android.widget.Toast;public class MainActivity extends Activity {
    protected void onCreate(Bundle savedInstanceState){
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);

    Button b = (Button)this.findViewById(R.id.button);
    b.setOnClickListener(new OnClickListener() {
    public void onClick(View v) {
    new SocketClientThread().start();
    }
    });
    }
    class SocketClientThread extends Thread{
    public void run(){
    String buffer = new String();
    TcpSocketClient tsc = new TcpSocketClient();
    try {
    //接收wifi
    buffer = tsc.receiveWifi("192.168.226.56", 115);
    } catch (Exception e) {
    e.printStackTrace();
    }
    //设置接收来的内容
    EditText editText02 = (EditText)MainActivity.this.findViewById(R.id.EditText02);
    editText02.setText(buffer.toString()+"1111");
    Toast.makeText(MainActivity.this, "receive",Toast.LENGTH_SHORT).show();
    }
    }
    }我已经先把ip地址和端口固定了,服务端一直都在开着报错在eclipse的logcat可以看到日志。根据你的代码,我觉得socket通讯应该没问题。
    但是你不可以在socket线程中去操作view对象。你需要用handler去处理。当然,如果你仅仅是测试socket,
    你可以把结果打印到logcat,而不是放到EditText中。
    +1。如果你想在SocketClientThread 里更新view,加一个looper吧
    谢谢提醒回复,上面之所以不行,只要是我权限没有设置,
    但是现在又出问题了我用android做服务端,电脑做客户端
    电脑收不到服务端发来的数据,电脑的那个客户端经测试这个是可以的package hua.tcpsocket;
    import android.os.Bundle;
    import android.app.Activity;
    import android.view.View;
    import android.view.View.OnClickListener;
    public class MainActivity extends Activity {
    protected void onCreate(Bundle savedInstanceState) {
      super.onCreate(savedInstanceState);
      setContentView(R.layout.activity_main);
      Button buttonStartWifi = (Button) this.findViewById(R.id.startWifi);
      buttonStartWifi.setOnClickListener(new OnClickListener() {
      public void onClick(View arg0) {
       new ServerThread().start();
      }
    }
    class ServerThread extends Thread{
      public void run(){
       //建立服务端
       TcpSocketServer tss = new TcpSocketServer();
       try {
        tss.startWifi(221,"dsaaaa");
       } catch (Exception e) {
        // TODO Auto-generated catch block
        e.printStackTrace();
       }
      }
    }
    }