java - C# 套接字编程,接收到的套接字长度不正确
问题描述
我正在 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[] 的大小,这就是问题所在。如何获得从服务器发送的正确套接字?
如果我在服务器端延迟发送每个套接字(如 15 毫秒),则客户端可以一个接一个地获取套接字。但前提是你有一个良好的连接。如果您的连接确实有 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);
}
}
解决方案
推荐阅读
- asp.net - 如何在 javascript 中从我的网页 cshtml 中读取数组?
- python - 使用 python 和 selenium webdriver 创建自动表单填充,但我无法自动填充文本框
- dialogflow-es - 登录事件后调用的默认回退意图
- ansible - 如何从ansible中获取纯字符串中的错误
- c# - C# 内联变量声明未能在 Appveyor 上部署
- react-native - 动态更改背景图像
- android - 如何在我的 YoutubePlayerFragment 下方动态设置按钮?(设置 layoutParams 不起作用)
- amazon-web-services - 如何通过 CLI 为 Lambda 加密环境变量?
- android - setImageUri 将 ImageView 留空
- xamarin - 如何在 Xamarin.Forms 中的按钮上设置图像高度