Android客户端,PC服务器插槽的3G D'ONT工作 [英] Android Client, Pc Server Socket d'ont work over 3g

查看:128
本文介绍了Android客户端,PC服务器插槽的3G D'ONT工作的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我尝试创建一个客户端服务器套接字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屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆