我正在C#客户端和Java服务器之间进行聊天。
当他连接时,我需要从服务器向客户端发送很多套接字。我想发送当天的日志。因此,我将所有日志保存在file.txt中,并将它们发送到新连接的客户端。
要发送它们,我有一个for循环,直到发送完所有日志为止。这是循环:
for (String item : Logs) {
client.send("log:" + item);
}
对于发送方法:
public void send(String text) {
//'os' is the: Socket.getOutputStream();
//What the server will send to the client
PrintWriter Out = new PrintWriter(os);
// 0 is the offset, not needed
Out.write(text, 0, text.length());
Out.flush();
System.out.println(text.length());
}
所以直到那里,一切都很好。
现在我的问题是:输出流发送字节长度,例如'30','100','399',即'text.length()',C#客户端接收所有套接字,但是粘贴2或3个插槽合在一起。
例如:如果我使用分开的套接字发送(每行都是out.write()和out.flush(),因为我为每一行调用send方法) (服务器端)
log:abcdefghijklmnopqrstuvwxyz123456789101112131415
log:abcdefghijklmnopqrstuvwxyz
log:abcdefghijklmnopqrstuvwxyz123456789101
log:abcdefghijklmnopqrstuvwxyz1234567891011121314151617
log:abcdefghijklmnopqrst
log:abcdefghijklmnopqrstuvwxyzyxwvu
插座将在结尾: (客户端)
log:abcdefghijklmnopqrstuvwxyz123456789101112131415log:abcdefghijklmnopqrstuvwxyzlog:abcdefghijklmnopqrstuvwxyz123456789101
log:abcdefghijklmnopqrstuvwxyz1234567891011121314151617log:abcdefghijklmnopqrst
log:abcdefghijklmnopqrstuvwxyzyxwvu
如果我在服务器端中检查套接字长度,我会得到;
20
12
15
17
20
但是在客户端;
32
15
37
多个插座的总和。.(有时是3个插座,有时是2个,有时是4个...)我不明白为什么...
这是我的异步方法,用于从服务器接收套接字;
private void callBack(IAsyncResult aResult)
{
String message = "";
try
{
int size = sck.EndReceiveFrom(aResult, ref ip);
if (size > 0)
{
byte[] receive = new byte[size];
receive = (byte[])aResult.AsyncState;
message = Encoding.Default.GetString(receive, 0, size);
Debug.WriteLine(message.Length);
}
byte[] buffer = new byte[1024];
//restart the async task
sck.BeginReceiveFrom(buffer, 0, buffer.Length, SocketFlags.None, ref ip, new AsyncCallback(callBack), buffer);
}
catch (Exception) { }
}
其中int'size'包含接收到的byte []的大小,这就是问题所在。如何获得从服务器发送的正确套接字?
如果我在服务器端延迟发送了每个套接字(例如15ms),则客户端可以一个个地获取套接字。但是只有在您拥有良好的人脉关系时。如果您的连接确实需要200毫秒的延迟,则会将套接字分组... 所以问题出在客户端(我认为...)。服务器端(java)正常工作,flush方法总是发送套接字!
更新:
这是我的插座;
//Global var
EndPoint ip;
public Socket sck;
//How I connect my sockets
private void connect()
{
ip = new IPEndPoint(IPAddress.Parse("127.0.0.1"), mysql.selectPort());
sck = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);
try
{
sck.Connect(ip);
}catch(Exception e) {
Debug.WriteLine(e.Message);
}
}