繁体   English   中英

当 Java 作为客户端和 Android 作为服务器时 ServerSocket 不工作

[英]ServerSocket not working when Java as Client and Android as server

我想将我的 android 作为服务器,将 PC 上的 Java 作为客户端。这可能吗?我试过但有些错误。我从教程中得到了服务器代码。

注意:我已经在同一路由器上连接了我的电脑和手机。

服务器代码安卓:

public class Server extends Activity {

    private ServerSocket serverSocket;

    Handler updateConversationHandler;

    Thread serverThread = null;

    private TextView text;



    public static final int SERVERPORT = 6000;

    @Override
    public void onCreate(Bundle savedInstanceState) {

        super.onCreate(savedInstanceState);
        setContentView(R.layout.main);

        text = (TextView) findViewById(R.id.text2);

        updateConversationHandler = new Handler();

        this.serverThread = new Thread(new ServerThread());
        this.serverThread.start();

    }

    @Override
    protected void onStop() {
        super.onStop();
        try {
            serverSocket.close();
        } catch (IOException e) {
            e.printStackTrace();
        }
    }

    class ServerThread implements Runnable {

        public void run() {
            Socket socket = null;
            try {
                serverSocket = new ServerSocket(SERVERPORT);
            } catch (IOException e) {
                e.printStackTrace();
            }
            while (!Thread.currentThread().isInterrupted()) {

                try {

                    socket = serverSocket.accept();

                    CommunicationThread commThread = new CommunicationThread(socket);
                    new Thread(commThread).start();

                } catch (IOException e) {
                    e.printStackTrace();
                }
            }
        }
    }

    class CommunicationThread implements Runnable {

        private Socket clientSocket;

        private BufferedReader input;

        public CommunicationThread(Socket clientSocket) {

            this.clientSocket = clientSocket;

            try {

                this.input = new BufferedReader(new InputStreamReader(this.clientSocket.getInputStream()));

            } catch (IOException e) {
                e.printStackTrace();
            }
        }

        public void run() {


            while (!Thread.currentThread().isInterrupted()) {

                try {

                    String read = input.readLine();

                    updateConversationHandler.post(new updateUIThread(read));

                } catch (IOException e) {
                    e.printStackTrace();
                }
            }
        }

    }

    class updateUIThread implements Runnable {
        private String msg;

        public updateUIThread(String str) {
            this.msg = str;
        }

        @Override
        public void run() {
            text.setText(text.getText().toString()+"Client Says: "+ msg + "\n");
        }

    }

}

Java客户端代码:

public class ServerCyb {

    public static void main(String[]arg) throws Exception
    {               
        Socket server1=new Socket("192.168.1.4", 6000);
        OutputStream e=server1.getOutputStream();
        PrintStream ps=new PrintStream(e);
        ps.println("Test");
        server1.close();
    }

}

客户端错误:

Exception in thread "main" java.net.ConnectException: Connection refused: connect
    at java.net.DualStackPlainSocketImpl.connect0(Native Method)
    at java.net.DualStackPlainSocketImpl.socketConnect(Unknown Source)
    at java.net.AbstractPlainSocketImpl.doConnect(Unknown Source)
    at java.net.AbstractPlainSocketImpl.connectToAddress(Unknown Source)
    at java.net.AbstractPlainSocketImpl.connect(Unknown Source)
    at java.net.PlainSocketImpl.connect(Unknown Source)
    at java.net.SocksSocketImpl.connect(Unknown Source)
    at java.net.Socket.connect(Unknown Source)
    at java.net.Socket.connect(Unknown Source)
    at java.net.Socket.<init>(Unknown Source)
    at java.net.Socket.<init>(Unknown Source)
    at ServerCyb.main(ServerCyb.java:20)

编辑:我已经在 AndroidManifest.xml 中包含了所有需要的权限

可能是安卓权限问题。 检查此权限是否存在于您的 AndroidManifest.xml 文件中:

<uses-permission android:name="android.permission.INTERNET" />

我认为 AndroidManifest.xml 的权限是 -

<uses-permission android:name="android.permission.INTERNET"/>
<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE"/>

尝试更换Socket server1=new Socket("192.168.1.4", 6000);

        server1 = new Socket();
        server1.connect(new InetSocketAddress(InetAddress.getByName("192.168.1.4"),6000), 100);

我找到了答案! :)

ServerSocket server;


try{
    String hostname = "yourIpAdress";
    server = new ServerSocket();
    server.bind(new InetSocketAddress(hostname, port)); //you need this
}catch (Exception e){
    e.printStackTrace();
}

while(true){
    try{
        Socket client = server.accept();
        DataInputStream input = new DataInputStream(client.getInputStream());
        String messsage = input.readUTF();
        DataOutputStream output = new DataOutputStream(client.getOutputStream());
        output.writeUTF("Connected!");
        client.close();
    } catch (Exception e){
        e.printStackTrace();
    }
}

你需要这个:

ServerSocket server;
String hostname = "yourIpAdress";
server = new ServerSocket();
server.bind(new InetSocketAddress(hostname, port));

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM