Android客户端,PC服务器插槽的3G D'ONT工作 [英] Android Client, Pc Server Socket d'ont work over 3g
问题描述
我尝试创建一个客户端服务器套接字beetwen我的机器人(客户端)和我的电脑(服务器),当我在本地(通过WiFi),它的工作perfectely,但是当IL尝试通过3G我的服务器时出现此异常试图让clientsocket.getOutputStream()
在java.lang.Thread.run(来源不明)
java.net.SocketException异常:连接复位
在java.net.SocketInputStream.read(来源不明)
在java.net.SocketInputStream.read(来源不明)
在java.io.DataInputStream.readUnsignedShort(来源不明)
在java.io.DataInputStream.readUTF(来源不明)
在java.io.DataInputStream.readUTF(来源不明)
什么是probleme,也ENY人知道这该如何解决? 请帮助: - (
服务器
公共类服务器{
ServerSocket的ServerSocket的;
公众的LinkedBlockingQueue< CDRecCourseDisplay> recCours;
公共链表< ClientMail> clientMails;
静态Server服务器;
公共静态服务器的getInstance(){
如果(服务器== NULL){
服务器=新服务器();
}
返回服务器;
}
服务器() {
// TODO自动生成构造函数存根
尝试 {
ServerSocket的=新的ServerSocket(54444);
recCours =新的LinkedBlockingQueue&其中; CDRecCourseDisplay>(10);
clientMails =新的LinkedList< ClientMail>();
}赶上(IOException异常E){
// TODO自动生成的catch块
e.printStackTrace();
}
this.start();
}
私人无效的start(){
新主题(新的Runnable(){
@覆盖
公共无效的run(){
// TODO自动生成方法存根
而(真){
尝试 {
Socket套接字的ServerSocket.accept =();
新主题(新的客户端(插座))启动()。
}赶上(IOException异常E){
// TODO自动生成的catch块
e.printStackTrace();
}
}
}
})。开始();
}
一流的客户端实现Runnable {
Socket套接字;
在的DataInputStream;
DataOutputStream类出;
公共客户端(Socket套接字){
// TODO自动生成构造函数存根
this.socket =插座;
如果(插座== NULL)回报;
尝试 {
InputStream的I = socket.getInputStream();
OutputStream的O = socket.getOutputStream();
在=新的DataInputStream(ⅰ);
OUT =新DataOutputStream类(O);
}赶上(IOException异常E){
// TODO自动生成的catch块
e.printStackTrace();
}
}
@覆盖
公共无效的run(){
// TODO自动生成方法存根
新主题(新的Runnable(){
@覆盖
公共无效的run(){
// TODO自动生成方法存根
而(真){
尝试 {
out.writeUTF(测试信息);
}赶上(InterruptedException异常E){
// TODO自动生成的catch块
e.printStackTrace();
}赶上(IOException异常E){
// TODO自动生成的catch块
e.printStackTrace();
}
}
}
})。开始();
新主题(新的Runnable(){
@覆盖
公共无效的run(){
// TODO自动生成方法存根
而(真){
尝试 {
串的buf = in.readUTF();
Log.d(消息,BUF);
}赶上(IOException异常E){
// TODO自动生成的catch块
e.printStackTrace();
}
}
}
})。开始();
}
}
}
和客户端
类客户端实现Runnable {
Socket套接字;
在的DataInputStream;
DataOutputStream类出;
公共无效的run(){
// TODO自动生成方法存根
布尔conected = FALSE;
而(!conected){
尝试 {
视频下载(500);
插座=新的Socket(213.233.216.25,54444);
在=新的DataInputStream(socket.getInputStream());
OUT =新DataOutputStream类(socket.getOutputStream());
conected = TRUE;
}赶上(UnknownHostException异常E){
// TODO自动生成的catch块
Log.e(错误:e.getMessage());
}赶上(IOException异常E){
// TODO自动生成的catch块
Log.e(错误:e.getMessage());
}赶上(InterruptedException异常E){
// TODO自动生成的catch块
Log.e(错误:e.getMessage());
}
}
新主题(新的Runnable(){
公共无效的run(){
// TODO自动生成方法存根
而(真){
尝试 {
串的buf = in.readUTF();
log.d(消息,BUF);
}
}赶上(IOException异常E){
// TODO自动生成的catch块
e.printStackTrace();
}
}
}
})。开始();
新主题(新的Runnable(){
公共无效的run(){
// TODO自动生成方法存根
而(真){
尝试 {
out.writeUTF(测试从手机信息);
}赶上(InterruptedException异常E){
// TODO自动生成的catch块
e.printStackTrace();
}赶上(IOException异常E){
// TODO自动生成的catch块
e.printStackTrace();
}
}
}
})。开始();
}
}
大多数网络(WiFi和3G)使用 NAT 的。 NAT允许出站连接,但prevents入站(互联网设备)的连接。
当您的服务器和设备都在同一个网络上,在你的情况,那么这个工程,你没有穿越NAT网关。
理由:你正在尝试做的(从互联网到设备连接)究竟会不会在大多数网络工作
I try to create a client server socket beetwen my droid(client) and my PC(server), when i am in local(over wifi) it work perfectely, but when il try over 3G i get this exception when the server try to get clientsocket.getOutputStream()
at java.lang.Thread.run(Unknown Source)
java.net.SocketException: Connection reset
at java.net.SocketInputStream.read(Unknown Source)
at java.net.SocketInputStream.read(Unknown Source)
at java.io.DataInputStream.readUnsignedShort(Unknown Source)
at java.io.DataInputStream.readUTF(Unknown Source)
at java.io.DataInputStream.readUTF(Unknown Source)
What's the probleme, do eny one know the solution of this? help please :-(
The Server
public class Server {
ServerSocket serverSocket;
public LinkedBlockingQueue<CDRecCourseDisplay> recCours;
public LinkedList<ClientMail> clientMails;
static Server server;
public static Server getInstance(){
if(server == null){
server = new Server();
}
return server;
}
Server() {
// TODO Auto-generated constructor stub
try {
serverSocket = new ServerSocket(54444);
recCours = new LinkedBlockingQueue<CDRecCourseDisplay>(10);
clientMails = new LinkedList<ClientMail>();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
this.start();
}
private void start(){
new Thread(new Runnable() {
@Override
public void run() {
// TODO Auto-generated method stub
while (true){
try {
Socket socket = serverSocket.accept();
new Thread(new Client(socket)).start();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
}).start();
}
class Client implements Runnable{
Socket socket;
DataInputStream in;
DataOutputStream out;
public Client(Socket socket) {
// TODO Auto-generated constructor stub
this.socket = socket;
if(socket == null) return;
try {
InputStream i = socket.getInputStream();
OutputStream o = socket.getOutputStream();
in = new DataInputStream(i);
out = new DataOutputStream(o);
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
@Override
public void run() {
// TODO Auto-generated method stub
new Thread(new Runnable() {
@Override
public void run() {
// TODO Auto-generated method stub
while(true){
try {
out.writeUTF("Test Message");
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
}).start();
new Thread(new Runnable() {
@Override
public void run() {
// TODO Auto-generated method stub
while(true){
try {
String buf = in.readUTF();
Log.d("MESSAGE", buf);
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
}).start();
}
}
}
and the client
class Client implements Runnable{
Socket socket;
DataInputStream in;
DataOutputStream out;
public void run() {
// TODO Auto-generated method stub
boolean conected = false;
while(!conected){
try {
Thread.sleep(500);
socket = new Socket("213.233.216.25", 54444);
in = new DataInputStream(socket.getInputStream());
out = new DataOutputStream(socket.getOutputStream());
conected = true;
} catch (UnknownHostException e) {
// TODO Auto-generated catch block
Log.e("ERROR :", e.getMessage());
} catch (IOException e) {
// TODO Auto-generated catch block
Log.e("ERROR :", e.getMessage());
} catch (InterruptedException e) {
// TODO Auto-generated catch block
Log.e("ERROR :", e.getMessage());
}
}
new Thread(new Runnable() {
public void run() {
// TODO Auto-generated method stub
while(true){
try {
String buf = in.readUTF();
log.d("MESSAGE", buf);
}
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
}).start();
new Thread(new Runnable() {
public void run() {
// TODO Auto-generated method stub
while(true){
try {
out.writeUTF("Test message from the phone");
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
}).start();
}
}
Most networks (Wifi and 3G) use NAT. NAT allows outbound connections, but prevents inbound (internet to device) connections.
When your server and device are both on the same network, as in your case, then this works as you are not traversing NAT gateway.
Rationale: what you are trying to do (connecting from internet to device) will not work in most networks.
这篇关于Android客户端,PC服务器插槽的3G D'ONT工作的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!