我正在努力提高套接字传输信息的速度,但我不确定如何这样做。代码的目的是传输一个数字,日期和一个以字符串形式发送的短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();
}
}
}
我已经完成了对母校的一些阅读,似乎可行的解决方案是使用缓冲区或swich来处理数据报。但是我使用套接字的经验相当有限,我不确定哪种情况最好用于这种情况,或者我还有其他选择尚未考虑过。这段代码将移动许多交易,我希望在尽可能短的时间内完成。 提前谢谢
PS。抱歉我的英文不好,这不是我的第一语言
答案 0 :(得分:1)
数据报意味着UDP,这是一种不可靠的传送协议,因此您无法保证获得所有内容。这可能不是你想要的;我会使用普通套接字(使用TCP,它具有可靠的传送)。
同一个客户端是否会重复调用send()并且每次都连接到同一个服务器?也就是说,是否会有多条消息通过单个连接,或者每条消息是否会发送到不同的服务器,只有一条消息(或只有少数消息)发送到多个服务器中的每一个?如果客户端将只连接一台服务器,并且给定客户端要发送大量消息,则应该在send()调用之间保持Socket打开;设置和拆卸套接字是很昂贵的,所以每次建立新连接都要付出高昂的代价。
此外,您的服务器似乎一次只能处理一个连接:您接受连接,从中读取,然后关闭它并接受一个新连接。因此,为了使这个功能适用于多个客户端,您需要将用于接受连接的逻辑与读取数据的逻辑分离到不同的线程。如果您一次只有几个客户端,则可以在为新客户端创建时从每个套接字启动一个新线程来读取;如果你有很多客户端(数千个),你可能需要看一下NIO能否从一个线程服务多个套接字。但我怀疑你遇到这个问题还有很长的路要走,如果你做的话,我只会为每个套接字生成一个新的线程。