[Socket]两个外网ip通过socket通信失败的问题
我想做一个手机P2P通信的app,手机既做客户端也做服务端,服务端A有一个ServerSocket,它比如说在监听8192端口,ip是49.74.79.155,然后又有一个手机B,比如说B的ip为210.52.23.14,它作为客户端去连接A的8192端口。理论上是不是这样就是一个P2P程序?但是我的app客户端一直无法成功连接服务端,代码如下:
然后监听的代码如下:
然后一些调试信息:
我想请教各位老师,为什么会出现这样的问题?如何正确实现一个公网下可以p2p通信的app,比如说移动版的QQ?
//发送消息的异步类
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?
...全文
相关推荐
易语言源码2行代码获取外网IP
易语言源码2行代码获取外网IP
易语言编程:如何获取外网IP
本文还有配套的精品资源,点击获取 简介:在IT行业中,获取外网IP对于网络编程和服务器通信至关重要。本文介绍了一个易语言编写的程序,该程序使得用户能够获取他们的公共互联网IP地址。易语言,一种中文编程环境,以其面向对象的特性和简单的编程语法降低了编程门槛。程序中包含了两个关键事件处理函数:"__启动窗口_创建完毕"和" _按钮1_被单击",分别用于初始化网络连接和触发获取外...
C#的Socket实现UDP协议通信
C#的Socket实现UDP协议通信 CSharp
VC++ 轻松获取外网IP地址
内容索引:VC/C++源码,其它分类,外网,IP VC++ 轻松获取外网IP地址,测试本机的外网IP,程序启动之前,请确定已经连接外网。
C++获得本机外网ip
获得外网ip,里面只是小函数,使用时还请详细参考自己函数


