嗨,我是 C# 的新手,正在做服务器和客户端,通过 TCP/IP 套接字连接共享文本文件。我使用BinaryReader/BinaryWriter从客户端上传到服务器,但卡在服务器到客户端:从客户端到服务器:
Socket clientSock = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);
var stream = new MemoryStream();
var writer = new BinaryWriter(stream);
writer.Write(fileName);
writer.Write(authorName);
writer.Write(fileContent);
var data = stream.ToArray(); // send this data array to server
clientSock.Connect("192.168.7.48", 9050); // targets machine ip add and port num
clientSock.Send(data);
writer.Dispose();
stream.Dispose();
clientSock.Close();
在服务器中:
public void ReadCallBack(IAsyncResult ar) {
String content = String.Empty;
StateObject state = (StateObject)ar.AsyncState;
Socket handler = state.workSocket;
bytesRead = handler.EndReceive(ar);
System.Diagnostics.Debug.WriteLine("Error asshole-0");
if (bytesRead > 0)
{
if (flag == 0)
{
var stream = new MemoryStream(state.buffer);
var reader = new BinaryReader(stream);
fileName = reader.ReadString();
authorName = reader.ReadString();
fileContent = reader.ReadString();
reader.Dispose();
stream.Dispose();
flag++;
Console.Write(fileName + authorName);
Console.Write(fileContent);
}
string path = @"C:"+fileName;
StreamWriter sw = new StreamWriter(path);
sw.Write(fileContent);
sw.Close();
sw.Dispose();
SqlCmd();
}
else
{
Invoke(new MyDelegate(LabelWrite));
}
}
流。处置();
现在我尝试从服务器到客户端使用相同的方式,但出现错误
var stream = new MemoryStream(state.buffer);
var reader = new BinaryReader(stream);
状态对象是错误?
问题:可能是由于套接字在缓冲区中接收数据,因此无法一次读取整个数据。解决方案:你有没有想过调用handler.EndReceive(ar)
时字节读取有什么用。它告诉您读取的数据,但这意味着您必须检查是否已收到整个数据,如果是,则继续将其转换为字符串。
Public Class State
Public CLient As Net.Sockets.Socket
Public Const BufferConst As Integer = 100
Public TmpBuffer(BufferConst) As Byte
Public sb As New System.Text.StringBuilder
End Class
Public Sub SendText(txt As String, socket As Net.Sockets.Socket)
socket.Send(System.Text.Encoding.UTF32.GetBytes(txt + "•"))
End Sub
Public Sub ReadData(ar As IAsyncResult)
Dim state As State = ar.AsyncState
Try
Dim read As Integer = state.CLient.EndReceive(ar)
If read > 0 Then
state.sb.Append(System.Text.Encoding.UTF32.GetChars(state.TmpBuffer))
If state.sb.ToString.IndexOf("•") > 0 Then
'All data have been recived
Console.WriteLine(state.sb.ToString())
Else
' Not Complete Start it again
state.CLient.BeginReceive(state.TmpBuffer, 0, state.BufferConst, Net.Sockets.SocketFlags.None, New AsyncCallback(AddressOf ReadData), state)
End If
End If
Catch ex As Exception
Console.Write("Read Error")
End Try
End Sub
编写流后Flush
它们。从您到目前为止共享的代码片段来看,看起来没有同花顺。
查看流刷新文档