繁体   English   中英

Java + Raspberry Pi + ServerSocket

[英]Java + Raspberry Pi + ServerSocket

您好StackOverflow社区,

我有一个特定的问题在Raspberry Pi Zero上启动java.net.ServerSocket并使用java.net.Socket连接到它。 RPi被配置为无线接入点,因此我可以通过WLAN与多个笔记本电脑/平板电脑相连。 目的是使用RPi作为服务器(不需要单独的网络和在设备上运行的服务器),而将某些设备作为客户端(可以连接到RPi)来启动服务器-客户端游戏。

我尝试了以下四种情况,不止一次地证明它们总是显示相同的结果:

  1. 我使用平板电脑通过WLAN连接到RPi。 然后,我在该平板电脑上启动了ServerSocket。 之后,我在该平板电脑上启动了一个Socket,并将其连接到ServerSocket。 连接正常,数据双向传输。

  2. 我使用平板电脑通过WLAN连接到RPi。 然后,我在该平板电脑上启动了ServerSocket。 之后,我在RPi上启动了一个Socket 并将其连接到平板电脑上运行的ServerSocket。 连接正常,数据双向传输。

  3. 我使用平板电脑通过WLAN连接到RPi。 然后,我在RPi上启动了ServerSocket。 之后,我在平板电脑上启动了一个Socket,并将其连接到RPi上运行的ServerSocket。 第一件奇怪的事是ServerSocket的IP是0.0.0.0,第二个问题是客户端无法连接到RPi,因此无法传输数据。

  4. 我使用平板电脑通过WLAN连接到RPi。 然后,我在RPi上启动ServerSocket并将其绑定到指定的IP地址。 之后,我在平板电脑上启动了一个Socket,并将其连接到RPi上运行的ServerSocket。 ServerSocket无法绑定到给定的IP地址,因此套接字无法连接到服务器,因此没有数据传输。

为什么没有IP绑定(0.0.0.0除外)到ServerSocket? 为什么我无法连接到IP地址0.0.0.0? 如何使用Java在RPi上运行ServerSocket?

这是我在所有三种情况下使用的Java源代码:

服务器:

import java.net.ServerSocket;
import java.net.InetAddress;
import java.net.Socket;
import java.net.InetSocketAddress;

import java.io.BufferedReader;
import java.io.BufferedWriter;
import java.io.InputStreamReader;
import java.io.OutputStreamWriter;

public class Server {
    private     ServerSocket    ss;

    public static void main(String[] args) {
        new Server();       // call the constructor
    }

    public Server() {
        try {
            ss = new ServerSocket(4444);    // create the ServerSocket
            new Thread(new Runnable() {     // create new Thread for listening to new clients
                public void run() {
                    startAccept();          // run the accept-clients method
                }
            }).start();     // don't forget to start the thread
            System.out.println(InetAddress.getLocalHost().getHostAddress());    // print the IP-Address
            System.out.println("4444");     // print the Port
        } catch (Exception e) {
            e.printStackTrace();        // show exceptions
        }
    }

    public void startAccept() {
        while (true) {      // listen to new clients
            try {
                Socket so = ss.accept();    // accept the clients and create reader/writer
                BufferedReader bure = new BufferedReader(new InputStreamReader(so.getInputStream()));
                BufferedWriter buwr = new BufferedWriter(new OutputStreamWriter(so.getOutputStream()));
                new Thread(new Runnable() {     // start new thread for reading from the client
                    public void run() {
                        readSocket(bure, buwr); // run the read/write method of the client
                    }
                }).start();     // don't forget to start the thread
            } catch (Exception e) {
                e.printStackTrace();        // show exceptions
            }
        }
    }

    public void readSocket(BufferedReader bure, BufferedWriter buwr) {
        while (true) {      // listen to all messages sent by the client
            try {
                String l1 = bure.readLine();            // read first line
                System.out.println("Rec1: <"+l1+">");   // show it
                String l2 = bure.readLine();            // read second line
                System.out.println("Rec2: <"+l2+">");   // show it
                buwr.write(l1+" + "+l2+" = "+(Integer.parseInt(l1)+Integer.parseInt(l2))+"\n");
                buwr.flush();       // convert both lines to integers and send the sum of them
            } catch (Exception e) {
                e.printStackTrace();        // show exceptions
            }
        }
    }
}

客户:

import java.net.InetAddress;
import java.net.InetSocketAddress;
import java.net.Socket;

import java.io.BufferedReader;
import java.io.BufferedWriter;
import java.io.InputStreamReader;
import java.io.OutputStreamWriter;

public class Client {
    public static void main(String[] args) {        // start the program
        try {
            Socket so = new Socket();       // create an unbound socket
            so.connect(new InetSocketAddress("0.0.0.0", 4444), 10000);
                // bind socket to the IP-address printed by the Server and create reader/writer
            BufferedReader bure = new BufferedReader(new InputStreamReader(so.getInputStream()));
            BufferedWriter buwr = new BufferedWriter(new OutputStreamWriter(so.getOutputStream()));
            buwr.write("7\n4\n");   // send 7 and 4, both followed by a new line
            buwr.flush();
            System.out.println("Sent: <7\n4\n>");   // show the user what has been sent
            System.out.println("Message from Server: "+bure.readLine());    // sum sent by the server
            so.close();     // close socket
        } catch (Exception e) {
            e.printStackTrace();    // show exception
        }
    }
}

预先感谢您对这个主题的任何帮助。

最终,我自己找到了解决方案。

核心问题是在教程中将RPi设置为WAP(不安装带有bridge-utils的brigde)。 如果没有定义的静态IP地址,则无法访问RPI,因此无法将ServerSocket绑定到任何 IP地址。

将静态IP地址添加到RPi WAP的方式如下:

使用以下命令编辑文件/ etc / network / interfaces

sudo nano /etc/network/interfaces

并将以下行写入文件末尾。

auto wlan0
iface wlan0 inet static
    address 192.168.5.1    #Use own IP address here
    netmask 255.255.255.0

注意:此文件末尾必须有一个空行。 不需要静态IP地址在/etc/dnsmasq.conf定义的范围内,但仅在适合子网掩码的情况下才有效(在我的情况下为192.168.5.xxx)。

下一个问题是我不知道ServerSocket绑定到哪个IP。 我通过致电获得了奇怪的输出(请参阅评论)

System.out.println(InetAddress.getLocalHost().getHostAddress());
System.out.println(ss.getInetAddress().getHostAddress());

并且ss.isBound()的查询始终返回true。 解决此问题的方法是将ServerSocket绑定到特定的IP地址,该地址与RPi上interfaces文件中的上述定义相同。 而不是打电话

ss = new ServerSocket(4444);

我用了

ss = new ServerSocket();
ss.bind(new InetSocketAddress("192.168.5.1", 4444));

因此ServerSocket开始绑定到我定义的静态IP地址。 现在,我可以将消息发送到服务器了,在那里消息被解析,结果被发送回客户端。

暂无
暂无

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

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