Tag: tcp

Erlang服务器,Java客户端 – TCP消息被拆分?

正如标题所说,我有一个用Erlang编写的服务器,一个用Java编写的客户端,他们通过TCP进行通信。 我面临的问题是gen_tcp:recv显然不知道何时收到来自客户端的“完整”消息,因此在多个消息中“拆分”它。 这是我正在做的一个例子(不完整的代码,试图只将其保留到相关部分): 码 Erlang服务器 -module(server). -export([start/1]). -define(TCP_OPTIONS, [list, {packet, 0}, {active, false}, {reuseaddr, true}]. start(Port) -> {ok, ListenSocket} = gen_tcp:listen(Port, ?TCP_OPTIONS), accept(ListenSocket). accept(ListenSocket) -> {ok, Socket} = gen_tcp:accept(ListenSocket), spawn(fun() -> loop(Socket) end), accept(ListenSocket). loop(Socket) -> case gen_tcp:recv(Socket, 0) of {ok, Data} -> io:format(“Recieved: ~s~n”, [Data]), loop(Socket); {error, closed} -> ok end. Java客户端 public class […]

Android TCP客户端。 服务器仅在进程停止后接收消息

我有简单的用Java编写的TCP服务器,我正在尝试为Android编写一个简单的TCP客户端,它将与本地机器上运行的TCP服务器通信。 我可以让服务器接收消息,但奇怪的是它只是在我通过Eclipse中的“设备”窗口停止应用程序进程后才收到消息。 在Android客户端上,我有主UI线程,其中包含输入IP地址和端口号的字段(这一切都正常,所以我不包括它的代码)。 单击连接按钮时,它会启动一个新的ASyncTask来执行TCP套接字工作。 这是ConnectionTask类的doInBackground方法的代码: protected Void doInBackground(Void… params) { String authMessage = “Authorize”; boolean connected=false; try { Socket clientSocket = new Socket(); SocketAddress serverAddress = new InetSocketAddress(address,port); Log.v(“Connection Thread”, serverAddress.toString()); clientSocket.connect(serverAddress, 15); if(clientSocket.isConnected()) { connected = true; Log.v(“Connection Thread”, “Connection Successful”); DataOutputStream outToServer = new DataOutputStream(clientSocket.getOutputStream()); BufferedReader inFromServer = new BufferedReader(new InputStreamReader(clientSocket.getInputStream())); outToServer.writeBytes(authMessage); Log.v(“Connection […]

Java文件传输文件到服务器

我是Java网络的新手,现在已经为我的问题寻找解决方案了一段时间,我想为什么不在这个问题上向一些更有资格的人提出一些建议呢? 我目前已经制作了一个管理我的服务器的小工具,以及另一个小客户端工具。 我的目标是使该工具能够从客户端向服务器计算机发送命令。 这样我就可以从另一台机器在服务器计算机上执行某些操作,包括发送带有更新文件的zip存档。 我有基本设置:从客户端向服务器发送命令的TCP连接(服务器回复确认)然后我希望发生所谓的操作。 我现在的问题是: 从客户端向服务器发送文件(.zip)时,我应该通过TCP发送还是使用类似FTP的东西? 我不仅希望将文件发送到服务器,还要将其发送到提取和替换现有文件。 亲切的问候,Alex 编辑:这是我用于将文件从客户端传输到服务器,但文件没有达到完整大小的目的地.. D: 服务器 package server.control.net.impl; import java.io.BufferedInputStream; import java.io.File; import java.io.FileInputStream; import java.io.IOException; import java.io.OutputStream; import java.net.ServerSocket; import java.net.Socket; public class Update implements Runnable { private final static int serverPort = 5555; private final static String fileInput = “C:\\Users\\Alexander\\Documents\\update.zip”; public static void main(String args[]) throws IOException{ […]

Java SQL Server 2012无法打开数据库错误

我似乎遇到了错误: Cannot open database requested by the login. The login failed. Cannot open database requested by the login. The login failed. 将我的SQL Server数据库连接到用netbeans编写的Java应用程序时。 我读了很多文章并做了以下工作: 在UDP和TCP下允许1433端口到防火墙 将SQL Server配置管理器TCP / IP端口设置为1433 将SQL Server Management Studio中的服务器身份validation更改为混合身份validation SQL Server Management Studio中允许的远程连接 我的连接字符串如下: jdbc:sqlserver://localhost\\SQLEXPRESS:1433;DatabaseName = SASS; IntegratedSecurity=true; Trusted_Connection=true; 我仍然收到以下错误: Cannot open database “SASS” requested by the login. The login failed. […]

套接字:BufferedOutputStream还是只是OutputStream?

为了在Java中获得最快的TCP传输速度,这是更好的: 选项A: InputStream in = socket.getInputStream(); OutputStream out = socket.getOutputStream(); 选项B: BufferedInputStream in = new BufferedInputStream(socket.getInputStream()); BufferedOutputStream out = new BufferedOutputStream(socket.getOutputStream()); 我已经读过,当将8 KiB写入OutputStream时,性能会受到影响,建议它一次性写入小块,而不是写入8 KiB。 8 KiB是BufferedOutputStream的默认缓冲区大小。 但是我还读到,当通过网络传输数据时,尽可能快地清除字节是很好的。 这意味着使用缓冲区并以小块写入会增加不必要的开销。 那么,选项A还是选项B? 哪个效果最好? 现在我猜测选项A提供了最高的传输速度,同时消耗了比选项B更多的CPU。选项B可能更好,因为它没有那么慢,但节省了大量的CPU。 – 奖金问题:触摸TCP窗口大小是个好主意吗? 例如,将其设置为64 KiB: socket.setReceiveBufferSize(65536); socket.setSendBufferSize(65536); 我尝试在测试机器上将其设置为128 KiB,因为我读到它可以提高速度但是当服务器有几个连接时,CPU是100%而不是2%,就像我单独离开时一样。 我猜128 KiB太高了,除非你有一台能够处理流量急流的好服务器,但将它设置为32 KiB是否明智? 我认为我的默认值是8 KiB。 (“socket”是“java.net.Socket”)

TCP_NODELAY如何影响连续的write()调用?

TCP_NODELAY是一个选项,可以快速发送TCP数据包,无论其大小如何。 当速度很重要时,这是非常有用的选项,但是,我很好奇它会对此做些什么: Socket socket = [some socket]; socket.setTcpNoDelay(true); OutputStream out = socket.getOutputStream(); out.write(byteArray1); out.write(byteArray2); out.write(byteArray3); out.flush(); 我试图在SocketOutputStream上找到flush实际上做了SocketOutputStream ,但据我所知,它什么也没做。 我曾希望它会告诉套接字“现在发送所有缓冲的数据”,但不幸的是,不,它没有。 我的问题是:这些3字节数组是在一个数据包中发送的吗? 我知道你对TCP构造网络数据包的方式没有多少控制权,但有没有办法告诉套接字(至少尝试)打包这些字节数组,这样可以避免网络开销? 可以手动打包字节数组并在一次调用中发送它们来write帮助吗?

在同一端口上侦听TCP和UDP请求

我正在编写一组Client / Server程序 根据客户端请求的操作,我使用make TCP或UDP请求。 实现客户端是直截了当的,因为我可以轻松地打开与任何协议的连接并将请求发送到服务器端。 另一方面,在服务器端,我想在同一端口上同时监听UDP和TCP连接。 而且,我喜欢服务器为每个连接请求打开新线程。 我采用了以下解释的方法: 链接文本 我通过为每个TCP / UDP请求创建新线程来扩展此代码示例。 如果我只使用TCP,这可以正常工作,但是当我尝试进行UDP绑定时它会失败。 请给我任何建议如何纠正这个问题。 TNX 这是服务器代码: public class Server { public static void main(String args[]) { try { int port = 4444; if (args.length > 0) port = Integer.parseInt(args[0]); SocketAddress localport = new InetSocketAddress(port); // Create and bind a tcp channel to listen for […]

如何通过TCP连接发送字节数组(java编程)

有人可以演示如何通过TCP连接从发送器程序向Java中的接收器程序发送字节数组。 byte[] myByteArray (我是Java编程的新手,似乎无法找到如何执行此操作的示例,显示连接的两端(发送方和接收方)。如果您知道现有示例,也许您可​​以发布链接(不需要重新发明轮子。)PS这不是功课!:-)

客户端/服务器不接受ObjectInput和Output流

我有一个程序有两个服务器端进程。 一台服务器只是向客户端发送一个ArrayList。 另一台服务器首先从客户端获取一个字符串,然后找到与该ID对应的正确记录并将该记录发回。 我遇到了第二个服务器进程的问题。 请参阅下面的println语句,其中显示“卡在这里”。 这就是程序挂起的地方。 import java.io.IOException; import java.io.ObjectInputStream; import java.io.ObjectOutputStream; import java.net.ServerSocket; import java.net.Socket; import java.sql.Connection; import java.sql.DriverManager; import java.sql.ResultSet; import java.sql.Statement; import java.util.ArrayList; public class CustServer{ public static void main(String args[]) throws IOException, ClassNotFoundException{ ServerSocket serverSocket1 = null; ServerSocket serverSocket2 = null; ArrayList list = null; String driverName = “sun.jdbc.odbc.JdbcOdbcDriver”; String connectionURL […]

Java,Netty,TCP和UDP连接集成:没有可用于UDP连接的缓冲区空间

我有使用TCP和UDP协议的应用程序。 主要假设是客户端通过TCP协议连接到服务器,并且在建立连接时,正在发送UDP数据报。 我必须支持两种连接服务器的方案: – 客户端在服务器运行时连接 – 客户端在服务器关闭时连接并重试连接直到服务器再次启动 对于第一个场景,一切都很好:我连接两个工作。 问题出在第二种情况。 当客户端尝试几次通过TCP连接并最终连接时,UDP连接函数会抛出exception: java.net.SocketException: No buffer space available (maximum connections reached?): bind at sun.nio.ch.Net.bind0(Native Method) at sun.nio.ch.Net.bind(Net.java:344) at sun.nio.ch.DatagramChannelImpl.bind(DatagramChannelImpl.java:684) at sun.nio.ch.DatagramSocketAdaptor.bind(DatagramSocketAdaptor.java:91) at io.netty.channel.socket.nio.NioDatagramChannel.doBind(NioDatagramChannel.java:192) at io.netty.channel.AbstractChannel$AbstractUnsafe.bind(AbstractChannel.java:484) at io.netty.channel.DefaultChannelPipeline$HeadContext.bind(DefaultChannelPipeline.java:1080) at io.netty.channel.AbstractChannelHandlerContext.invokeBind(AbstractChannelHandlerContext.java:430) at io.netty.channel.AbstractChannelHandlerContext.bind(AbstractChannelHandlerContext.java:415) at io.netty.channel.DefaultChannelPipeline.bind(DefaultChannelPipeline.java:903) at io.netty.channel.AbstractChannel.bind(AbstractChannel.java:197) at io.netty.bootstrap.AbstractBootstrap$2.run(AbstractBootstrap.java:350) at io.netty.util.concurrent.SingleThreadEventExecutor.runAllTasks(SingleThreadEventExecutor.java:380) at io.netty.channel.nio.NioEventLoop.run(NioEventLoop.java:357) at io.netty.util.concurrent.SingleThreadEventExecutor$2.run(SingleThreadEventExecutor.java:116) at io.netty.util.concurrent.DefaultThreadFactory$DefaultRunnableDecorator.run(DefaultThreadFactory.java:137) at java.lang.Thread.run(Thread.java:722) 当我重新启动客户端应用程序而不对服务器做任何事情时,客户端将连接任何问题 […]