gpt4 book ai didi

java - 提高java套接字的通信速度

转载 作者:行者123 更新时间:2023-12-01 12:45:58 25 4
gpt4 key购买 nike

我正在尝试提高套接字传输信息的速度,但我不确定如何做到这一点。代码的目的是传输一个数字、日期和一个以字符串形式发送的简短 xml。

这是服务器代码

import java.net.*;
import java.io.*;

public class SSocket extends Thread
{
private ServerSocket serverSocket;
public SSocket(int port) throws IOException

{
serverSocket = new ServerSocket(port);
serverSocket.setSoTimeout(100000);
}

public void run()
{
System.out.println("Waiting for client on port " + serverSocket.getLocalPort() + "...");
while(true)
{
try
{

Socket server = serverSocket.accept();

DataInputStream in = new DataInputStream(server.getInputStream());
int cor=in.readInt();
int i=0;
String transaccion = in.readUTF();
String fecha = in.readUTF();

System.out.println(cor);
System.out.println(transaccion);
System.out.println(fecha);

DataOutputStream out =
new DataOutputStream(server.getOutputStream());
if(transaccion!=null && fecha != null && cor>0){
out.writeInt(cor);
}
else {
out.writeInt(-1);
}
if (i==100){
out.flush();
i=0;
}
i++;
server.close();


}catch(SocketTimeoutException s)
{
System.out.println("Socket timed out!");
break;
}catch(IOException e)
{
e.printStackTrace();
break;
}
}
}
public static void main(String [] args)
{
int port = 1337;
try
{
Thread t = new SSocket(port);
t.start();
}catch(IOException e)
{
e.printStackTrace();
}
}
}

客户端的代码是

import java.net.*;
import java.io.*;

public class ClientSocket
{
public static void send(int correl, String transaccion, String fecha)
{
String serverName = "localhost";
int port = 1337;

try
{

Socket client = new Socket(serverName, port);
int i=0;
OutputStream outToServer = client.getOutputStream();
DataOutputStream out =
new DataOutputStream(outToServer);



out.writeInt(correl);
out.writeUTF(transaccion);
out.writeUTF(fecha);

InputStream inFromServer = client.getInputStream();
DataInputStream in =
new DataInputStream(inFromServer);

int corin=in.readInt();

if(corin>0){
Envio.updater(corin);
}

else {

}
if (i==100){
out.flush();
i=0;
}
i++;
client.close();
}catch(IOException e)
{
e.printStackTrace();
}
}
}

我已经阅读了一些 Material ,似乎可能的解决方案是使用缓冲区或切换到数据报。然而,我使用套接字的经验相当有限,我不确定哪种情况最适合这种情况,或者是否还有我尚未考虑的其他选择。该代码将移动许多交易,我希望在尽可能短的时间内完成。提前致谢

ps。抱歉我的英语不好,这不是我的母语

最佳答案

数据报意味着 UDP,这是一种不可靠的传输协议(protocol),因此不能保证您获得所有内容。这可能不是您想要的;我会继续使用普通套接字(它使用 TCP,具有可靠的传输)。

同一个客户端会重复调用send()并每次连接到同一个服务器吗?也就是说,是否会有许多消息通过单个连接,或者每条消息是否会发送到不同的服务器,而只有一条消息(或只有几条)发送到许多服务器中的每一个?如果客户端要连接到一台服务器,并且给定的客户端要发送大量消息,则应该在 send() 调用之间保持 Socket 处于打开状态;设置和拆除套接字的成本很高,因此每次建立新连接都需要付出高昂的代价。

此外,您的服务器似乎一次只能处理一个连接:您接受一个连接,从中读取内容,然后关闭它并接受一个新连接。因此,为了使这项工作适用于多个客户端,您需要将接受连接到不同线程的逻辑与读取数据的逻辑分开。如果一次只有几个客户端,则可以在为新客户端创建套接字时启动一个新线程来从每个套接字读取数据;如果您有很多客户端(数千个),您可能需要考虑 NIO,因为它能够从单个线程为多个套接字提供服务。但我怀疑你距离遇到这个问题还有很长的路要走,如果你曾经遇到过,所以我只是为每个套接字生成一个新线程。

关于java - 提高java套接字的通信速度,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24706748/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com