[Socket]两个外网ip通过socket通信失败的问题

Legend94Rz 2015-03-06 08:00:56
我想做一个手机P2P通信的app,手机既做客户端也做服务端,服务端A有一个ServerSocket,它比如说在监听8192端口,ip是49.74.79.155,然后又有一个手机B,比如说B的ip为210.52.23.14,它作为客户端去连接A的8192端口。理论上是不是这样就是一个P2P程序?但是我的app客户端一直无法成功连接服务端,代码如下:

//发送消息的异步类
public class SendTask extends AsyncTask<UserInfo,Void,Boolean>
{

@Override
protected void onPostExecute(Boolean aBoolean)
{
if(aBoolean)
Toast.makeText(MainActivity.this,"SendAccessed",Toast.LENGTH_SHORT).show();
else
Toast.makeText(MainActivity.this,"SendFailed",Toast.LENGTH_SHORT).show();
}

@Override
protected Boolean doInBackground(UserInfo... model)
{
//建立连接
Socket socket=new Socket();
try
{
InetAddress addr = InetAddress.getByName(model[0].ip); //这是服务端的ip,外网ip。
SocketAddress remoteAddr=new InetSocketAddress(addr,model[0].port);

socket.connect(remoteAddr,5000); // <--------------- 就是这句,一直连接失败。
//发送消息
PrintStream outStream=new PrintStream(socket.getOutputStream());
outStream.println( ebMsg.getText().toString() );

outStream.close();
socket.close();
return true;
}
catch (IOException e)
{
e.printStackTrace();
return false;
}


}
}

然后监听的代码如下:

public class SocketListener implements Runnable
{
Socket socket;
ServerSocket serverSocket;
BufferedReader br;
public SocketListener(ServerSocket serverSocket)
{
this.serverSocket = serverSocket;
}

public String ReadLine()
{
try
{
return br.readLine();
}
catch (IOException e)
{
e.printStackTrace();
}
return null;
}
@Override
public void run()
{
while (true)
{
try
{
socket = serverSocket.accept();
//------------读出消息---------------------
br = new BufferedReader(new InputStreamReader(socket.getInputStream()));
String temp = ReadLine();
String content = "";
while (temp != null)
{
content += temp;
temp = ReadLine();
}
//--------------------------------------------------
//回送给主线程以显示
Message msg = new Message();
msg.what = Global.MessageTag.MSG_NEW_MESSAGE;
Bundle bundle = new Bundle();
bundle.putString("Content", content);
msg.setData(bundle);
handler.sendMessage(msg);
}
catch (IOException e)
{
e.printStackTrace();
}
}
}
}

然后一些调试信息:

03-06 19:30:52.837 12482-12600/org.helloworld W/System.err﹕ java.net.ConnectException: failed to connect to /49.74.79.155 (port 8192) after 5000ms: isConnected failed: ECONNREFUSED (Connection refused)
03-06 19:30:52.838 12482-12600/org.helloworld W/System.err﹕ at libcore.io.IoBridge.isConnected(IoBridge.java:249)
03-06 19:30:52.840 12482-12600/org.helloworld W/System.err﹕ at libcore.io.IoBridge.connectErrno(IoBridge.java:181)
03-06 19:30:52.841 12482-12600/org.helloworld W/System.err﹕ at libcore.io.IoBridge.connect(IoBridge.java:112)
03-06 19:30:52.843 12482-12600/org.helloworld W/System.err﹕ at java.net.PlainSocketImpl.connect(PlainSocketImpl.java:192)
03-06 19:30:52.845 12482-12600/org.helloworld W/System.err﹕ at java.net.PlainSocketImpl.connect(PlainSocketImpl.java:459)
03-06 19:30:52.846 12482-12600/org.helloworld W/System.err﹕ at java.net.Socket.connect(Socket.java:851)
03-06 19:30:52.848 12482-12600/org.helloworld W/System.err﹕ at org.helloworld.MainActivity$SendTask.doInBackground(MainActivity.java:112)
03-06 19:30:52.848 12482-12600/org.helloworld W/System.err﹕ at org.helloworld.MainActivity$SendTask.doInBackground(MainActivity.java:90)
03-06 19:30:52.848 12482-12600/org.helloworld W/System.err﹕ at android.os.AsyncTask$2.call(AsyncTask.java:264)
03-06 19:30:52.849 12482-12600/org.helloworld W/System.err﹕ at java.util.concurrent.FutureTask$Sync.innerRun(FutureTask.java:305)
03-06 19:30:52.849 12482-12600/org.helloworld W/System.err﹕ at java.util.concurrent.FutureTask.run(FutureTask.java:137)
03-06 19:30:52.850 12482-12600/org.helloworld W/System.err﹕ at android.os.AsyncTask$SerialExecutor$1.run(AsyncTask.java:208)
03-06 19:30:52.852 12482-12600/org.helloworld W/System.err﹕ at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1076)
03-06 19:30:52.853 12482-12600/org.helloworld W/System.err﹕ at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:569)
03-06 19:30:52.854 12482-12600/org.helloworld W/System.err﹕ at java.lang.Thread.run(Thread.java:856)
03-06 19:30:52.855 12482-12600/org.helloworld W/System.err﹕ Caused by: libcore.io.ErrnoException: isConnected failed: ECONNREFUSED (Connection refused)
03-06 19:30:52.857 12482-12600/org.helloworld W/System.err﹕ at libcore.io.IoBridge.isConnected(IoBridge.java:236)
03-06 19:30:52.858 12482-12600/org.helloworld W/System.err﹕ ... 14 more
03-06 19:31:06.676 12665-12665/org.helloworld W/ActivityThread﹕ Application org.helloworld is waiting for the debugger on port 8100...

我想请教各位老师,为什么会出现这样的问题?如何正确实现一个公网下可以p2p通信的app,比如说移动版的QQ?
...全文
233 2 打赏 收藏 转发到动态 举报
写回复
用AI写文章
2 条回复
切换为时间正序
请发表友善的回复…
发表回复
Legend94Rz 2015-03-06
  • 打赏
  • 举报
回复
自己顶。。。。。。。。。。。

80,362

社区成员

发帖
与我相关
我的任务
社区描述
移动平台 Android
androidandroid-studioandroidx 技术论坛(原bbs)
社区管理员
  • Android
  • yechaoa
  • 失落夏天
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧