所以我试图绑定并监听我学校服务器上的一个端口,以便在我的网络类中进行分配。我遇到的是当我在java中创建ServerSocket时,我经常会遇到IOException,即使我尝试绑定到高频段的端口。
我最初尝试绑定到端口1088(或多或少出于盼望),但如果不成功,我将尝试绑定到1024以上的随机端口(服务器上保留的更低)。
这是我得到的:
import java.io.IOException;
import java.net.InetAddress;
import java.net.ServerSocket;
import java.net.UnknownHostException;
import java.util.Random;
public class main
{
/**
* @param args
*/
public static void main(String[] args)
{
Random r = new Random();
boolean connected = true;
ServerSocket serverSocket = null;
int welcomePortNum = new Integer(args[0]);
if(welcomePortNum >= 65536)
{
System.out.println("Invalid welcome port number, terminating execution.");
System.exit(0);
}
do
{
connected = true;
System.out.println(welcomePortNum);
try
{
serverSocket = new ServerSocket(welcomePortNum, 5, InetAddress.getByName("loki.ist.unomaha.edu"));
} catch(UnknownHostException e)
{
System.err.println("Could not connect to 'loki.ist.unomaha.edu'.");
connected = false;
//System.exit(1);
}catch(IOException e)
{
System.err.println("Could not get the I/O for the connection to loki.ist.unomaha.edu.");
connected = false;
//System.exit(1);
}
if(connected == false)
welcomePortNum = r.nextInt(64512) + 1024;
System.out.println(connected);
}
while(connected == false);
// TODO Auto-generated method stub
}
}
有什么想法吗?
答案 0 :(得分:2)
Java ServerSockets
不“连接到远程主机”。它们可以绑定到本地 IP地址,这就是您正在使用的构造函数。
修改强> 对作业的评论。
第2步的“关联IP地址”部分既错误又不必要,使您无法在家中进行测试。除非您的服务器实际上在该主机上运行,否则他给您的指令无法工作,并且无论如何通常不会在服务器中完成。只需为IP地址参数传递null,它允许套接字接受来自任何本地IP地址的连接,并添加链接到此答案的注释。正确的词不是'关联'而是'绑定'。如果作业使用了正确的术语,则不会出现“连接”和“绑定”之间的混淆。
我也不明白第3步。没有客户端初始化 of ,直到其中一个连接,然后是初始化其状态的时间。我不知道他的意思是'将连接标记为非活动'。您所要做的就是为该客户端关闭已接受的Socket。
如果您按照建议使用线程,则步骤4“等待事件”无法作为离散步骤实现。该函数分布在连接接受线程和所有连接处理线程上。
我不认为您应该在此阶段选择使用select()。我本来会做出一个后续的任务,部分是出于教学原因,部分原因是为了确保你学习两者。