在开发移动设备应用时,经常需要使用Web服务来实现数据的交互。然而,如果尝试在本地主机上运行Web服务,并且移动设备应用试图连接到这个服务,可能会发现一个问题:Web服务仅监听127.0.0.1这个IP地址,这意味着无法从移动设备模拟器连接到该服务,因为设备模拟器的内部地址是127.0.0.21。微软可能不希望开发者使用他们的开发环境进行商业用途,因此从网络访问被阻止了。
如果移动设备应用需要使用Web服务,而又没有IIS或其他Web服务器来运行服务,可能会在网上寻找解决方案,但可能一无所获。
构建一个小型软件中继(IPRelay),它能够将任何网络地址上的套接字连接中继到本地主机。
IPRelay具有非常简单且最小的图形用户界面(GUI),它允许更改“监听”和“转发到”的IP地址和端口。注意,“监听”地址将是计算机的外部地址(或名称),而“转发到”将指向Web服务。当勾选“跟踪”复选框时,它将在左侧打印来自设备的所有数据,在右侧打印所有发送回的数据。“清除”按钮用于清除两个文本框中的跟踪数据,“开始”按钮用于启动和停止路由。所有捕获的异常都被记录在右侧的文本框中。
IPRelay在“监听”IP和端口上监听传入的套接字连接。对于每个新连接,都会创建一个新的Relay类。这个类创建一个套接字连接到“转发到”的IP和端口,然后创建两个线程,分别监听来自两个套接字的传入套接字数据。每当每个套接字接收到数据时,它立即将其转发到另一个套接字。
日期:2011年3月16日
评论:第一稿
以下是构建IPRelay的伪代码示例:
class Relay {
public void start() {
// 创建监听套接字
socket = new Socket(listenIP, listenPort);
while (true) {
// 接受连接
Socket clientSocket = socket.accept();
// 创建转发到套接字
Socket forwardSocket = new Socket(forwardIP, forwardPort);
// 创建两个线程监听数据
Thread listenerThread = new Thread(() => listenForData(clientSocket));
Thread forwarderThread = new Thread(() => listenForData(forwardSocket));
listenerThread.start();
forwarderThread.start();
}
}
private void listenForData(Socket socket) {
while (true) {
byte[] buffer = new byte[1024];
int bytesRead = socket.Receive(buffer);
if (bytesRead > 0) {
// 转发数据
forwardSocket.Send(buffer, bytesRead, 0);
}
}
}
}