C# 如何能够在不遵循顺序和冻结的情况下继续从客户端发送到服务器?
我目前正在做一个服务器和客户端之间聊天的应用程序。它可以工作,但只能按照[client send to server]->[server send to client Reach]的顺序启动。若服务器并没有将其发送回客户端,客户端将保持冻结状态。实际上,我想让我的客户机能够继续发送到服务器,而不需要这些序列。有什么建议我可以用吗?像背景工人还是什么?我试过按键,但效果不好。我会尝试任何建议,谢谢。C# 如何能够在不遵循顺序和冻结的情况下继续从客户端发送到服务器?,c#,winforms,client,console-application,system.net.sockets,C#,Winforms,Client,Console Application,System.net.sockets,我目前正在做一个服务器和客户端之间聊天的应用程序。它可以工作,但只能按照[client send to server]->[server send to client Reach]的顺序启动。若服务器并没有将其发送回客户端,客户端将保持冻结状态。实际上,我想让我的客户机能够继续发送到服务器,而不需要这些序列。有什么建议我可以用吗?像背景工人还是什么?我试过按键,但效果不好。我会尝试任何建议,谢谢。 第一个代码是控制台应用程序中的服务器代码,第二个代码是windows窗体应用程序中的客户端代码
第一个代码是控制台应用程序中的服务器代码,第二个代码是windows窗体应用程序中的客户端代码
namespace TcpIpNewServer
{
class Program
{
static void Main(string[] args)
{
TcpListener serverSocket = new TcpListener(8888);
TcpClient clientSocket = default(TcpClient);
serverSocket.Start();
Console.WriteLine(">> Server started...");
clientSocket = serverSocket.AcceptTcpClient();
Console.WriteLine(">> Accepted connection from client...");
while ((true))
{
NetworkStream networkStream = clientSocket.GetStream();
byte[] bytesFrom = new byte[10025];
networkStream.Read(bytesFrom, 0, (int)clientSocket.ReceiveBufferSize);
if (bytesFrom[0].ToString() != "0") //listen from client
{
string dataFromClient = System.Text.Encoding.ASCII.GetString(bytesFrom);
dataFromClient = dataFromClient.Substring(0, dataFromClient.IndexOf("$^$~~)(")); //hardcode
Console.WriteLine("<< Client : " + dataFromClient);
}
//var cki = Console.ReadKey(true);
//if (cki.KeyChar == 't')
//{
string serverResponse = Console.ReadLine();
if (serverResponse != null) //write to client
{
Byte[] sendBytes = Encoding.ASCII.GetBytes(serverResponse);
networkStream.Write(sendBytes, 0, sendBytes.Length);
networkStream.Flush();
}
//}
}
}
}
}
命名空间TcpIpNewServer
{
班级计划
{
静态void Main(字符串[]参数)
{
TcpListener serverSocket=新的TcpListener(8888);
TcpClient clientSocket=默认值(TcpClient);
serverSocket.Start();
Console.WriteLine(“>>服务器已启动…”);
clientSocket=serverSocket.AcceptTcpClient();
Console.WriteLine(“>>接受来自客户端的连接…”);
而((对))
{
NetworkStream NetworkStream=clientSocket.GetStream();
byte[]bytesFrom=新字节[10025];
networkStream.Read(bytesFrom,0,(int)clientSocket.ReceiveBufferSize);
if(bytesFrom[0].ToString()!=“0”)//从客户端侦听
{
string dataFromClient=System.Text.Encoding.ASCII.GetString(bytesFrom);
dataFromClient=dataFromClient.Substring(0,dataFromClient.IndexOf(“$^$~~)(”);//硬代码
控制台写入线(“>”+mesg;
}
私有void Msg2(字符串mesg)
{
richTextBox1.Text=richTextBox1.Text+Environment.NewLine+“您需要切换到异步读/写ie.NetworkStream.BeginRead()
@steve是的,这会阻塞并使我的程序冻结
public partial class Form1 : Form
{
public Form1()
{
InitializeComponent();
}
private void Form1_Load(object sender, EventArgs e)
{
Msg("Client started...");
try
{
clientSocket.Connect("127.0.0.1", 8888);
NetworkStream serverStream = clientSocket.GetStream();
label1.Text = "Client Socket Program - Server connected...";
}
catch (Exception ex)
{
label1.Text = "Client Socket Program - Server connection failed... Please try again...Make sure server is on...";
}
}
System.Net.Sockets.TcpClient clientSocket = new System.Net.Sockets.TcpClient();
private void button1_Click(object sender, EventArgs e)
{
NetworkStream serverStream = clientSocket.GetStream();
if (textBox1.Text != "" && textBox1.Text != null) //write to the server
{
//string trimDataText = Regex.Replace(textBox1.Text, @"s", "");
string cloneTextbox = textBox1.Text + "$^$~~)(";
Msg("Me: " + textBox1.Text);
textBox1.Text = "";
byte[] outStream = System.Text.Encoding.ASCII.GetBytes(cloneTextbox);
serverStream.Write(outStream, 0, outStream.Length);
serverStream.Flush();
}
byte[] inStream = new byte[10025]; //read from the server
//if (inStream[0].ToString() != "0")
//{
serverStream.Read(inStream, 0, (int)clientSocket.ReceiveBufferSize);
string returndata = System.Text.Encoding.ASCII.GetString(inStream);
Msg2("Server: " + returndata);
//}
}
private void Msg(string mesg)
{
richTextBox1.Text = richTextBox1.Text + Environment.NewLine + ">> " + mesg;
}
private void Msg2(string mesg)
{
richTextBox1.Text = richTextBox1.Text + Environment.NewLine + "<< " + mesg;
}