【发布时间】:2014-01-31 01:35:18
【问题描述】:
大家好,我一直在尝试学习如何使用 TcpListener 和套接字在客户端服务器之间发送一些简单的文本消息。我已经阅读了许多似乎显示如何读取 _Buffer 的线程,比如说一个循环以确保读取整个消息。但是,在收到第一条消息后,我似乎无法弄清楚如何获取第二条消息。我可以很好地连接到服务器,并且可以很好地收到第一条消息。但是,如果我再次点击客户端上的发送按钮,则不会有消息到达服务器。这是我的代码:
// 服务器应用程序: ------------------------------------------ -----命名空间 TCP_Server { 公共部分类Form1:表格 { 公共表格1() { 初始化组件(); }
private void btnStartServer_Click(object sender, EventArgs e) { // Define the TCP Listner: TcpListener _listner = new TcpListener(IPAddress.Parse("127.0.0.1"), 7777); // Start The Listner: _listner.Start(); //Show the server is now listening: listStatus.Items.Add("Server started - Listening on port 7777"); //Create a socket to accept - This is a Blocking Call: Socket _sock = _listner.AcceptSocket(); //When Client Connects show server has accepted the socket: listStatus.Items.Add("User from IP " + _sock.RemoteEndPoint); while (_sock.Connected) { // Create Byte to Receive Data: byte[] _Buffer = new byte[1024]; // Create integer to hold how large the Data Received is: int _DataReceived = _sock.Receive(_Buffer); // Lets Server Know Message is Received: listStatus.Items.Add("Message Received..."); // Convert Buffer to a String: string _Message = Encoding.ASCII.GetString(_Buffer); // Post Message to the Server Window: listStatus.Items.Add(_Message); _sock.Close(); } } }}
// 客户端应用程序: --------------------------------------------------------- -------
命名空间 TCP__Client { 公共部分类Form1:表格 { 公共表格1() { 初始化组件(); }
// 定义 TCP 客户端: TcpClient _Client = new TcpClient(); 私人无效btnConnect_Click(对象发送者,EventArgs e) { // 连接 TCP 客户端: _Client.Connect("127.0.0.1", 7777); // 显示客户端已连接: listStatus.Items.Add("连接到服务器 127.0.0.1"); } 私人无效btnSend_Click(对象发送者,EventArgs e) { 而(_Client.Connected) { // 创建一个流: 流 _Stream = _Client.GetStream(); // 创建编码器的实例: ASCIIEncoding _Asc = new ASCIIEncoding(); 字节[] _Buffer = 新字节[1024]; // 创建缓冲区以发送消息: _Buffer = _Asc.GetBytes(txtMessage.Text); // 显示客户端正在发送消息: listStatus.Items.Add("正在发送消息..."); // 将消息写入流: _Stream.Write(_Buffer, 0, _Buffer.Length); // 关闭流 _Stream.Close(); _Stream.Dispose(); } } }
}
如果有人能解释如何制作这个,我将不胜感激,这样我就可以获得不止一条消息。我在使用任务和线程方面确实有一点经验,这是我需要做的吗?我只是想掌握这一点,这样我就可以开始学习了。如果有人有任何您认为可以帮助的建议或示例,请分享。
【问题讨论】:
-
在循环结束时不关闭套接字将是一个好的开始。如果关闭套接字,您如何期望获得更多字节?另请注意:“字节”不是“消息”。单独的 TCP 不能传输超过一个字节的“消息”。
标签: c# multithreading sockets tcp chat