[英]Java + Raspberry Pi + ServerSocket
您好StackOverflow社区,
我有一个特定的问题在Raspberry Pi Zero上启动java.net.ServerSocket并使用java.net.Socket连接到它。 RPi被配置为无线接入点,因此我可以通过WLAN与多个笔记本电脑/平板电脑相连。 目的是使用RPi作为服务器(不需要单独的网络和在设备上运行的服务器),而将某些设备作为客户端(可以连接到RPi)来启动服务器-客户端游戏。
我尝试了以下四种情况,不止一次地证明它们总是显示相同的结果:
我使用平板电脑通过WLAN连接到RPi。 然后,我在该平板电脑上启动了ServerSocket。 之后,我在该平板电脑上启动了一个Socket,并将其连接到ServerSocket。 连接正常,数据双向传输。
我使用平板电脑通过WLAN连接到RPi。 然后,我在该平板电脑上启动了ServerSocket。 之后,我在RPi上启动了一个Socket ,并将其连接到平板电脑上运行的ServerSocket。 连接正常,数据双向传输。
我使用平板电脑通过WLAN连接到RPi。 然后,我在RPi上启动了ServerSocket。 之后,我在平板电脑上启动了一个Socket,并将其连接到RPi上运行的ServerSocket。 第一件奇怪的事是ServerSocket的IP是0.0.0.0,第二个问题是客户端无法连接到RPi,因此无法传输数据。
我使用平板电脑通过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.