我试图在java中编写一个简单的Web服务器.
现在我只有一个简单的程序,但id喜欢扩展它,以便它可以通过建立多个TCP连接服务多个浏览器.
我一直在阅读线程.我的理解是你可以创建一个新线程,这将继续完全像另一个程序.因此,使用新线程,可能就像有2个可以为2个浏览器服务的Web服务器,或者可以为x Web浏览器提供服务的x Web服务器.
我有点迷失在如何在java中创建新线程,并给每个新线程一个连接.
我的想法是,我会有一个这样的循环,它获得新的连接并将每个新连接传递给一个新的线程
// make new ServerSocket
while (true) {
Socket newConn = serverSocket.accept();
// make new thread, and pass in newConn
}
Run Code Online (Sandbox Code Playgroud)
谁能给我一些关于如何前进的指导?(如果我在某个地方犯了错误,请指出它.我对线程编程很新,所以它完全可能我没有正确理解它)
抢
编辑:
谢谢所有人.
我去写了一些东西,java教程帮了很多忙.
我现在有了一个新问题
我在新线程的run()方法中添加了一个循环,它包含10秒倒计时(使用Thread.sleep(1000)),只要服务器收到图像请求,所以我可以看到哪些线程正在运行.(index.html里面有4张图片)
所以我请求index.html页面,我的服务器工作正常.然后我打开了大约十几个新标签.我的期望是对index.html页面的请求是即时的,但是将图像发送到浏览器需要10秒钟(因为我放在那里的延迟),此时服务器将收到请求对于下一个index.html页面,依此类推.总的来说,我认为十二个index.html页面会立即提供,而4*12 = 36个图像需要10秒才能在所有标签上提供.
实际发生的是获得前4个图像需要10秒钟,接下来4个图像需要10秒钟等等.因此,我的服务器只是排队请求并一次处理一个页面,而不是服务多个网页.
我认为我的计划有问题.但我觉得我可能无法正确理解浏览器如何与服务器交互.我认为浏览器会在解析html页面时请求新对象.所以如果我打开十几页,我的服务器应该收到几十个请求.我尝试在FF中打开几个选项卡,然后在FF中打开几个窗口,但这没有帮助.
然而,当我打开IE,FF和Chrome时,我在不同的时间(相隔约2秒)要求index.html,看起来每个浏览器同时接收页面,换句话说,有一点,有提供12个不同的图像,每个浏览器4个
所以我想我正在寻找一些确认这是预期的行为?如果是这样,为什么我只能在打开3个不同的浏览器时看到这种行为,而不是在我打开多个标签时?
(对于那些问过的人,我计划明年参加一个网络课程,但我现在尝试做一些基本的东西.所以半自学,半个小时)
这是我目前在我的程序中所做的事情
@array = split /\n/, $longstring;
$data = $array[14];
Run Code Online (Sandbox Code Playgroud)
我真的只想将数组中的元素从数组中取出并使用它,字符串中的其他内容对我没用.我知道用java这样的语言我可以做这样的事情
$data = (split /\n/, $longstring)[14];
Run Code Online (Sandbox Code Playgroud)
这是我想做的,但在perl.
那么如何在不必先将数组赋值给变量的情况下访问数组元素呢?
编辑:嗯,好吧,这个怎么样
漫漫长路
my $data = "abc\nd^e^f\nghi";
my @a = split (/\^/, (split /\n/, $data)[1]);
print $a[2];
__OUTPUT__
f
Run Code Online (Sandbox Code Playgroud)
简短的路
my $data = "abc\nd^e^f\nghi";
my $a = split (/\^/, (split /\n/, $data)[1])[2]; # line 60
print $a;
__OUTPUT__
syntax error at script.pl line 60, near ")["
Execution of script.pl aborted due to compilation errors.
Run Code Online (Sandbox Code Playgroud)
这比平常更让我困惑,因为它适用于内部分裂,而不是外部分裂
编辑2:
我有点困惑为什么这两条线不同
my $a = (split /\^/, (split /\n/, …Run Code Online (Sandbox Code Playgroud)