小编Rob*_*ner的帖子

java服务器来处理多个tcp连接

我试图在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个不同的浏览器时看到这种行为,而不是在我打开多个标签时?

(对于那些问过的人,我计划明年参加一个网络课程,但我现在尝试做一些基本的东西.所以半自学,半个小时)

java sockets networking multithreading

2
推荐指数
1
解决办法
2万
查看次数

perl,如何使用数组而不先将其赋值给变量?

这是我目前在我的程序中所做的事情

@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)

arrays perl dynamic

1
推荐指数
1
解决办法
213
查看次数

标签 统计

arrays ×1

dynamic ×1

java ×1

multithreading ×1

networking ×1

perl ×1

sockets ×1