Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/sockets/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 套接字服务器只接受第一次调用_C#_Sockets - Fatal编程技术网

C# 套接字服务器只接受第一次调用

C# 套接字服务器只接受第一次调用,c#,sockets,C#,Sockets,我用c#编写了一个简单的客户机-服务器应用程序。一切正常,但服务器只接受客户端的第一次调用,不再接受。我也尝试将receive方法放入循环中(作为acceptTcpSocket方法),但它仍然是一样的 简化服务器代码: public class XMLServer { public void start() { server = new TcpListener(_serverIP, _serverPort); try {

我用c#编写了一个简单的客户机-服务器应用程序。一切正常,但服务器只接受客户端的第一次调用,不再接受。我也尝试将receive方法放入循环中(作为acceptTcpSocket方法),但它仍然是一样的

简化服务器代码:

public class XMLServer
{
    public void start()
    {
        server = new TcpListener(_serverIP, _serverPort);

        try
        {
            server.Start();
        }
        catch (SocketException socketError)
        {
            Console.WriteLine(socketError.Message);
        }
    }
    public void listen()
    {
        try
        {
            client = server.AcceptTcpClient();

            while (true)
            {
                receiveFromClient();
            }
        }
        catch (SocketException error)
        {
            Console.WriteLine(error.Message);
        }
    }

    public void receiveFromClient()
    {
        byte[] bytes = new byte[client.ReceiveBufferSize];
        byte[] send;
        int readed;

        stream = client.GetStream();
        readed = stream.Read(bytes, 0, client.ReceiveBufferSize);

        if (readed > 0)
        {
            string[] request = Encoding.UTF8.GetString(bytes).Split(':');

            Console.WriteLine(request[0]);
            switch (request[0])
            {
                case "getFileList":
                    send = encode(XMLFile.getFileList());

                    if (stream.CanWrite)
                    {
                        stream.Write(send, 0, send.Length);
                    }
                    break;
                case "getFile":
                    send = encode(XMLFile.getFile(request[1]));

                    if (stream.CanWrite)
                    {
                        stream.Write(send, 0, send.Length);
                        stream.Flush();
                    }
                    break;
            }
        }
    }
}
XMLServer server = new XMLServer("10.0.0.5", "7777");
server.start();

while (true)
{
    server.listen();
}
public partial class Client : Form
{
    private TcpClient client;
    private NetworkStream stream;

    public Client(TcpClient parentClient)
    {
        InitializeComponent();
        client = parentClient;
        getFileList();
    }

    private void getFileList()
    {
        byte[] fileList = Encoding.UTF8.GetBytes("getFileList:null");
        byte[] fileListResponse;
        string[] files;
        int Y = 30;

        stream = client.GetStream();
        stream.Write(fileList, 0, fileList.Length);

        fileListResponse = new byte[client.ReceiveBufferSize];
        stream.Read(fileListResponse, 0, client.ReceiveBufferSize);
        files = Encoding.UTF8.GetString(fileListResponse).Split(';');

        foreach (string file in files)
        {
            RadioButton radioButton = new RadioButton();
            radioButton.Text = file;
            radioButton.Location = new Point(10, Y);

            groupBoxFiles.Controls.Add(radioButton);
            Y += 30;
        }
    }

    private void buttonOpenFile_Click(object sender, EventArgs e)
    {
        String fileName = groupBoxFiles.Controls.OfType<RadioButton>().FirstOrDefault(x => x.Checked).Text;
        byte[] getFile = Encoding.UTF8.GetBytes("getFile:" + fileName);
        byte[] getFileResponse;
        string fileContent;

        stream = client.GetStream();
        stream.Write(getFile, 0, getFile.Length);

        getFileResponse = new byte[client.ReceiveBufferSize];
        stream.Read(getFileResponse, 0, client.ReceiveBufferSize);
        fileContent = Encoding.UTF8.GetString(getFileResponse);

        textBoxEditor.Enabled = true;
        textBoxEditor.Text = fileContent;
    }
}
使用服务器代码:

public class XMLServer
{
    public void start()
    {
        server = new TcpListener(_serverIP, _serverPort);

        try
        {
            server.Start();
        }
        catch (SocketException socketError)
        {
            Console.WriteLine(socketError.Message);
        }
    }
    public void listen()
    {
        try
        {
            client = server.AcceptTcpClient();

            while (true)
            {
                receiveFromClient();
            }
        }
        catch (SocketException error)
        {
            Console.WriteLine(error.Message);
        }
    }

    public void receiveFromClient()
    {
        byte[] bytes = new byte[client.ReceiveBufferSize];
        byte[] send;
        int readed;

        stream = client.GetStream();
        readed = stream.Read(bytes, 0, client.ReceiveBufferSize);

        if (readed > 0)
        {
            string[] request = Encoding.UTF8.GetString(bytes).Split(':');

            Console.WriteLine(request[0]);
            switch (request[0])
            {
                case "getFileList":
                    send = encode(XMLFile.getFileList());

                    if (stream.CanWrite)
                    {
                        stream.Write(send, 0, send.Length);
                    }
                    break;
                case "getFile":
                    send = encode(XMLFile.getFile(request[1]));

                    if (stream.CanWrite)
                    {
                        stream.Write(send, 0, send.Length);
                        stream.Flush();
                    }
                    break;
            }
        }
    }
}
XMLServer server = new XMLServer("10.0.0.5", "7777");
server.start();

while (true)
{
    server.listen();
}
public partial class Client : Form
{
    private TcpClient client;
    private NetworkStream stream;

    public Client(TcpClient parentClient)
    {
        InitializeComponent();
        client = parentClient;
        getFileList();
    }

    private void getFileList()
    {
        byte[] fileList = Encoding.UTF8.GetBytes("getFileList:null");
        byte[] fileListResponse;
        string[] files;
        int Y = 30;

        stream = client.GetStream();
        stream.Write(fileList, 0, fileList.Length);

        fileListResponse = new byte[client.ReceiveBufferSize];
        stream.Read(fileListResponse, 0, client.ReceiveBufferSize);
        files = Encoding.UTF8.GetString(fileListResponse).Split(';');

        foreach (string file in files)
        {
            RadioButton radioButton = new RadioButton();
            radioButton.Text = file;
            radioButton.Location = new Point(10, Y);

            groupBoxFiles.Controls.Add(radioButton);
            Y += 30;
        }
    }

    private void buttonOpenFile_Click(object sender, EventArgs e)
    {
        String fileName = groupBoxFiles.Controls.OfType<RadioButton>().FirstOrDefault(x => x.Checked).Text;
        byte[] getFile = Encoding.UTF8.GetBytes("getFile:" + fileName);
        byte[] getFileResponse;
        string fileContent;

        stream = client.GetStream();
        stream.Write(getFile, 0, getFile.Length);

        getFileResponse = new byte[client.ReceiveBufferSize];
        stream.Read(getFileResponse, 0, client.ReceiveBufferSize);
        fileContent = Encoding.UTF8.GetString(getFileResponse);

        textBoxEditor.Enabled = true;
        textBoxEditor.Text = fileContent;
    }
}
客户端代码:

public class XMLServer
{
    public void start()
    {
        server = new TcpListener(_serverIP, _serverPort);

        try
        {
            server.Start();
        }
        catch (SocketException socketError)
        {
            Console.WriteLine(socketError.Message);
        }
    }
    public void listen()
    {
        try
        {
            client = server.AcceptTcpClient();

            while (true)
            {
                receiveFromClient();
            }
        }
        catch (SocketException error)
        {
            Console.WriteLine(error.Message);
        }
    }

    public void receiveFromClient()
    {
        byte[] bytes = new byte[client.ReceiveBufferSize];
        byte[] send;
        int readed;

        stream = client.GetStream();
        readed = stream.Read(bytes, 0, client.ReceiveBufferSize);

        if (readed > 0)
        {
            string[] request = Encoding.UTF8.GetString(bytes).Split(':');

            Console.WriteLine(request[0]);
            switch (request[0])
            {
                case "getFileList":
                    send = encode(XMLFile.getFileList());

                    if (stream.CanWrite)
                    {
                        stream.Write(send, 0, send.Length);
                    }
                    break;
                case "getFile":
                    send = encode(XMLFile.getFile(request[1]));

                    if (stream.CanWrite)
                    {
                        stream.Write(send, 0, send.Length);
                        stream.Flush();
                    }
                    break;
            }
        }
    }
}
XMLServer server = new XMLServer("10.0.0.5", "7777");
server.start();

while (true)
{
    server.listen();
}
public partial class Client : Form
{
    private TcpClient client;
    private NetworkStream stream;

    public Client(TcpClient parentClient)
    {
        InitializeComponent();
        client = parentClient;
        getFileList();
    }

    private void getFileList()
    {
        byte[] fileList = Encoding.UTF8.GetBytes("getFileList:null");
        byte[] fileListResponse;
        string[] files;
        int Y = 30;

        stream = client.GetStream();
        stream.Write(fileList, 0, fileList.Length);

        fileListResponse = new byte[client.ReceiveBufferSize];
        stream.Read(fileListResponse, 0, client.ReceiveBufferSize);
        files = Encoding.UTF8.GetString(fileListResponse).Split(';');

        foreach (string file in files)
        {
            RadioButton radioButton = new RadioButton();
            radioButton.Text = file;
            radioButton.Location = new Point(10, Y);

            groupBoxFiles.Controls.Add(radioButton);
            Y += 30;
        }
    }

    private void buttonOpenFile_Click(object sender, EventArgs e)
    {
        String fileName = groupBoxFiles.Controls.OfType<RadioButton>().FirstOrDefault(x => x.Checked).Text;
        byte[] getFile = Encoding.UTF8.GetBytes("getFile:" + fileName);
        byte[] getFileResponse;
        string fileContent;

        stream = client.GetStream();
        stream.Write(getFile, 0, getFile.Length);

        getFileResponse = new byte[client.ReceiveBufferSize];
        stream.Read(getFileResponse, 0, client.ReceiveBufferSize);
        fileContent = Encoding.UTF8.GetString(getFileResponse);

        textBoxEditor.Enabled = true;
        textBoxEditor.Text = fileContent;
    }
}
公共部分类客户端:表单
{
私人TCP客户;
专用网络流;
公共客户端(TcpClient parentClient)
{
初始化组件();
客户=家长客户;
getFileList();
}
私有void getFileList()
{
byte[]fileList=Encoding.UTF8.GetBytes(“getFileList:null”);
字节[]fileListResponse;
字符串[]文件;
int Y=30;
stream=client.GetStream();
stream.Write(fileList,0,fileList.Length);
fileListResponse=新字节[client.ReceiveBufferSize];
读取(fileListResponse,0,client.ReceiveBufferSize);
files=Encoding.UTF8.GetString(fileListResponse.Split(“;”);
foreach(文件中的字符串文件)
{
RadioButton RadioButton=新RadioButton();
radioButton.Text=文件;
单选按钮。位置=新点(10,Y);
groupBoxFiles.Controls.Add(radioButton);
Y+=30;
}
}
私有无效按钮打开文件\单击(对象发送者,事件参数e)
{
字符串fileName=groupBoxFiles.Controls.OfType().FirstOrDefault(x=>x.Checked).Text;
byte[]getFile=Encoding.UTF8.GetBytes(“getFile:+fileName”);
字节[]getFileResponse;
字符串文件内容;
stream=client.GetStream();
stream.Write(getFile,0,getFile.Length);
getFileResponse=新字节[client.ReceiveBufferSize];
读取(getFileResponse,0,client.ReceiveBufferSize);
fileContent=Encoding.UTF8.GetString(getFileResponse);
textBoxEditor.Enabled=true;
textBoxEditor.Text=文件内容;
}
}
首先,我调用
XMLFile.getFileList
,Iít工作正常。然后我想调用
XMLFile.getFile
,然后应用程序停止


怎么了?

很难说出单一的根本原因,但至少有一个概念上的问题:调用的结果,即实际读取的字节数,被忽略了

socket的发送/接收功能不能保证您提供的所有数据在一次呼叫中发送/接收。这些函数返回实际发送/接收的字节数

--

此外,请注意:

发送和接收数据时,必须关闭NetworkStream。关闭TcpClient不会释放NetworkStream

--


还可以发布(至少是相关部分)客户端代码吗?添加了客户端代码。还有一个问题:
XMLFile.getFileList()
如何返回文件(以何种形式)?换句话说,您可以发布文件名吗?您为获取其内容而选择的
单选按钮的标签?它以字符串形式返回目录“D:\xmlFiles”中的所有文件。每个文件都用分号分隔。例如,“Test1.xml;test2.xml”。我认为问题出在服务器上。它的实现是错误的,但我不知道在哪里。愚蠢的问题…在
listen()
中,当
循环时,它是如何脱离
的?它只接受第一个连接,因为代码执行永远不会返回外部
while
循环。