Tag: tcp

文件上传流从哪里获取内容?

我有一个关于文件上传的问题,这与它的工作原理有关,而不是代码问题。 我在互联网上看了,但我找不到合适的答案。 我有一个在tomcat上运行的Web应用程序,它处理文件上传(通过servlet)。 假设我现在要上传大文件(> 1 Gb)。 我的理解是,一旦实际传输了整个文件,HTTP请求的多部分内容就可以在我的servlet中使用。 我的问题是请求的内容实际存储在哪里? 当一个人调用HttpServletRequest.getParts()时, Part对象上有一个InputStream 。 但是,从哪里读取流? Tomcat将它存储在某个地方吗? 我想这可能不够清楚,所以我会根据你的意见更新post,如果有的话。 谢谢

Haproxy + netty:防止连接重置exception的方法?

我们在netty-3.6运行的后端使用haproxy。 我们正在处理大量的连接,其中一些可能是长期存在的。 现在的问题是,当haproxy关闭连接以实现重新平衡时,它会通过发送tcp-RST来实现。 当netty使用的sun.nio.ch-class看到这个时,它会抛出一个IOException:“Connection by peer”。 跟踪: sun.nio.ch.FileDispatcherImpl.read0(Native Method):1 in “” sun.nio.ch.SocketDispatcher.read(SocketDispatcher.java:39):1 in “” sun.nio.ch.IOUtil.readIntoNativeBuffer(IOUtil.java:225):1 in “” sun.nio.ch.IOUtil.read(IOUtil.java:193):1 in “” sun.nio.ch.SocketChannelImpl.read(SocketChannelImpl.java:375):1 in “” org.jboss.netty.channel.socket.nio.NioWorker.read(NioWorker.java:64):1 in “” org.jboss.netty.channel.socket.nio.AbstractNioWorker.process(AbstractNioWorker.java:109):1 in “” org.jboss.netty.channel.socket.nio.AbstractNioSelector.run(AbstractNioSelector.java:312):1 in “” org.jboss.netty.channel.socket.nio.AbstractNioWorker.run(AbstractNioWorker.java:90):1 in “” org.jboss.netty.channel.socket.nio.NioWorker.run(NioWorker.java:178):1 in “” java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1145):1 in “” java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:615):1 in “” java.lang.Thread.run(Thread.java:724):1 in “” 这会导致每个配置出现以下问题: 选项http-pretend-keepalive 这是最好的(因为haproxy似乎关闭了大多数与FIN而不是RST的连接),但仍然每个服务器每秒产生大约3个exception。 此外,它有效地进行了网络负载平衡,因为一些传入连接非常长,并且具有非常高的吞吐量:使用pretend-keepalive,它们永远不会被haproxy重新平衡到另一台服务器。 选项http-keep-alive 由于我们的后端期望保持活动连接真正保持活动(因此不会自行关闭它们),因此此设置相当于每个连接最终会导致一个exception,从而导致我们的服务器崩溃。 我们尝试添加prefer-last-server,但它没有多大帮助。 选项http-server-close […]

动态选择端口号?

在Java中,我需要获取一个端口号,以便在同一程序的多个实例之间进行通信。 现在,我可以简单地选择一些固定数字并继续使用它。 但我想知道是否有一种方法可以动态选择端口号,这样我就不必为设置端口号而烦扰我的用户。 这是我的一个想法,它的工作原理如下: 有一个固定的初始端口号A. 程序’MyApp’启动,试图抓住端口A. 如果成功,那么它就是’MyApp’的第一个实例。 完成。 如果失败,它会通过端口A询问A上的程序是否是“MyApp”的实例。 如果是,请与该实例通信。 完成。 如果没有,请尝试抓住端口A + 1。 如果有另一个使用该端口的程序(也不是’MyApp’的实例),则抓A + 2,然后抓A + 3,依此类推。 这种策略有意义吗? 或者有更好的方法来动态选择端口号吗?

什么可以导致TCP / IP丢弃数据包而不丢弃连接?

我有一个基于Web的应用程序和一个客户端,都是用Java编写的。 对于它的价值,客户端和服务器都在Windows上。 客户端通过Apache HttpClient发出HTTP GET。 服务器阻塞最多一分钟,如果在该分钟内没有消息到达客户端,则服务器返回HTTP 204 No Content。 否则,只要为客户端准备好消息,就会返回HTTP 200正文的正文。 这让我感到困惑:间歇性地为特定的客户端子集 – 总是客户端具有明显不稳定的网络连接 – 客户端发出GET,服务器接收并处理GET,但客户端永远坐着。 启用客户端的调试日志,我看到HttpClient仍在等待响应的第一行。 服务器上没有抛出exception,至少没有任何记录,不是由Tomcat,而是由我的webapp。 根据调试日志,服务器成功响应客户端的每一个迹象都表明。 但是,客户没有显示收到任何东西的迹象。 客户端无限期挂起在HttpClient.executeMethod中 。 在会话超时并且客户端采取导致另一个线程发出HTTP POST的操作后,这变得很明显。 当然,POST失败,因为会话已过期。 在某些情况下,会话到期和客户端发出POST并发现此事实之间已经过了几个小时 。 在整个时间里, executeMethod仍在等待HTTP响应行。 当我使用WireShark查看线路级别的实际情况时,不会发生此故障。 也就是说,对于特定客户端,这种故障将在几个小时内发生,但是当WireShark在两端运行时,这些相同的客户端将在一夜之间运行14小时,而不会出现故障。 还有其他人遇到过这样的事吗? 世界上有什么可以导致它? 我认为即使在短期网络故障中,TCP / IP也可以保证数据包传输。 如果我设置SO_TIMEOUT并在超时后立即重试请求,则重试始终成功。 (当然,我首先中止超时请求并释放连接以确保将使用新的套接字。) 思考? 想法? 是否有一些TCP / IP设置可用于Java或Windows中的注册表设置,以便在丢失的数据包上启用更积极的TCP / IP重试?

什么是STUN,是否需要端口转发服务器?

我已经对没有基本服务器的p2p通信做了一些研究,并且通过了STUN。 从我所读到的,STUN是NAT“打孔”的一种方式,它不需要将对等端口转发连接到。 这是正确的,打孔究竟是什么意思? 如果它不需要端口转发,它似乎非常脆弱,因为它越过防火墙,我不完全理解STUN的作用。 STUN可以用于Java中的p2p程序或其他语言,例如聊天客户端,它通过TCP / UDP端口向没有基本服务器的对等端发送消息,或者不要求用户端口转发?

使用套接字通过TCP从服务器端向客户端发送ArrayList ?

我正在尝试通过TCP将一个对象从服务器端套接字发送到客户端套接字。 我无法找出问题所在。 这是我在客户端遇到的错误: java.io.EOFException at java.io.ObjectInputStream$PeekInputStream.readFully(ObjectInputStream.java:2280) at java.io.ObjectInputStream$BlockDataInputStream.readShort(ObjectInputStream.java:2749) at java.io.ObjectInputStream.readStreamHeader(ObjectInputStream.java:779) at java.io.ObjectInputStream.(ObjectInputStream.java:279) at ClientSide.main(ClientSide.java:16) 服务器端代码: import java.io.*; import java.net.*; import java.util.ArrayList; public class ServerSide { public static void main(String[] args) { try { ServerSocket myServerSocket = new ServerSocket(9999); Socket skt = myServerSocket.accept(); ArrayList my = new ArrayList(); my.set(0,”Bernard”); my.set(1, “Grey”); try { ObjectOutputStream objectOutput = […]

由于从boss线程传递给工作线程的请求导致的netty延迟?

我有一些关于Netty(服务器端),TCP / IP应用程序的问题; 我想知道在将boss请求从boss线程传递给工作线程时是否会因为netty(由于缺少配置等)而存在延迟? 我在用 : new OrderedMemoryAwareThreadPoolExecutor(350, 0, 0, 1, TimeUnit.SECONDS); 实际上,我设置最大线程数350因为我不确定最佳数字。 我每分钟记录同时工作的线程数,似乎平均值太低(几乎不超过10 )。 所以我会减少这个数字,因为它不是必需的。 有没有其他参数,重要的一点,我应该知道,以获得最佳性能? bootstrap.setOption(“tcpNoDelay”, true); – 设置此参数有什么缺点吗? 考虑到交货时间非常重要。 线程池执行器: OrderedMemoryAwareThreadPoolExecutor executor = new OrderedMemoryAwareThreadPoolExecutor(48, 0, 0, 1, TimeUnit.SECONDS); 这是我的管道工厂: ChannelPipeline pipeline = pipeline(); pipeline.addLast(“frameDecoder”, new DelimiterBasedFrameDecoder(GProperties.getIntProperty(“decoder.maxFrameLength”, 8000 * 1024), Delimiters.nulDelimiter())); pipeline.addLast(“stringDecoder”, new StringDecoder( CharsetUtil.UTF_8 )); pipeline.addLast(“frameEncoder”, new NullTermMessageEncoder()); pipeline.addLast(“stringEncoder”, new JSONEncoder( […]

什么是TCP窗口更新?

我正在为Java游戏制作我自己的自定义服务器软件(游戏和原始服务器软件是用Java编写的)。 没有任何协议文档可用,因此我不得不使用Wireshark读取数据包。 当客户端连接服务器时,它会以Gzip格式向其发送级别文件。 在发送级别的大约94个数据包中,我的服务器使用ArrayIndexOutOfBoundsException崩溃客户端。 根据原始服务器的捕获文件,它会在该点发送TCP窗口更新。 什么是TCP窗口更新,以及如何使用SocketChannel发送?

TCP客户端和服务器,使用objectstreams的cmd提示符

我有一个客户端文件clientRPC.java和服务器文件serverRPC.java。 两者都使用TCP协议进行通信,并使用objectinput和输出流来传输数据。 我的客户档案: public class clientRPC { public static void main(String args[]) { Socket s = null; try { int serverPort = 8888; s = new Socket(“localhost”, serverPort);// server name is local host //initializing input and output streams object and referencing them to get input and output ObjectInputStream in = null; ObjectOutputStream out = null; […]

在java服务器中发送edittext时出错。 看代码

这是我的工作代码。 但是,当我尝试单击将我的客户端连接到端口的按钮时,我的应用程序崩溃了。 看我的代码。 public class Order extends Activity { Button GoBackHome; private Button button1, button3; private EditText txtbox1,txtbox2,txtbox3,txtbox4,textField; private TextView tv; Button PayNow; CheckBox chxbx1, chxbx2, chxbx3,chxbx4; @Override public void onBackPressed() { } @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.order); GoBackHome = (Button) findViewById(R.id.gohomebutton); PayNow = (Button) findViewById(R.id.button2); txtbox1= (EditText) findViewById(R.id.editText1); button1 = (Button) […]