为什么SOCKET客户端一次连接,只能发一次消息?

pedkk 2013-11-30 10:08:40
客户端Connect后,send发送消息 服务端可以收到。
但是Connect后,我将连接后的的SOCKET保存在全局变量,再发送消息就不行。但是可以接收到服务器端的消息。我用的是同步。
...全文
1191 11 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
11 条回复
切换为时间正序
请发表友善的回复…
发表回复
frdking 2013-12-02
  • 打赏
  • 举报
回复
服务端要单独建立接受消息线程
pedkk 2013-12-01
  • 打赏
  • 举报
回复
没人了吗??
pedkk 2013-11-30
  • 打赏
  • 举报
回复
而且线程没有结束啊?一直在运行接收消息。可以接收到服务器消息
pedkk 2013-11-30
  • 打赏
  • 举报
回复
引用 5 楼 bdmh 的回复:
BeginSend这个方法在县城中,其中new了socket,当线程结束后线程中new的对象会被销毁

        private void button2_Click(object sender, EventArgs e)//发送消息
        {
            IPEndPoint ipp = (IPEndPoint)serverSocket.RemoteEndPoint;
            string IP=ipp.Address.ToString();//这样可以获取保存的SOCKET的IP和端口啊
            string PORT = ipp.Port.ToString();//为什么呢?
            MyClient.send_msg(serverSocket, MyClient.TCP_msg + textBox6.Text);//这里是单独发送消息  但是发送不过去?
        }
pedkk 2013-11-30
  • 打赏
  • 举报
回复
引用 5 楼 bdmh 的回复:
BeginSend这个方法在县城中,其中new了socket,当线程结束后线程中new的对象会被销毁
那我该怎么解决呢?求助啊
bdmh 2013-11-30
  • 打赏
  • 举报
回复
BeginSend这个方法在县城中,其中new了socket,当线程结束后线程中new的对象会被销毁
pedkk 2013-11-30
  • 打赏
  • 举报
回复
引用 2 楼 caozhy 的回复:
http://stackoverflow.com/questions/9406466/sending-data-multiple-times-over-a-single-socket
服务端代码没问题,我贴下客户端代码吧。 主窗体

namespace Client
{
    public partial class Form1 : Form
    {
        CClient MyClient = new Client.CClient();
       public Socket serverSocket;
        public Form1()
        {
            InitializeComponent();
        }
        private void button1_Click(object sender, EventArgs e)
        {
            MyClient.StartThread(textBox1.Text,Convert.ToInt32(textBox2.Text));//开启连接
        }
        private void Form1_Load(object sender, EventArgs e)
        {
            CheckForIllegalCrossThreadCalls = false;
            MyClient.showMsg += showMsg;//显示消息委托代理
            MyClient.showClientMsg += showClientMsg;//显示连接状态
        }
        public void showMsg(string s)
        {
            textBox3.AppendText( "\r\n"+ s  );
        }
        public void showClientMsg(string s)
        {
            label1.Text = "连接状态:" + s;
        }
        private void button2_Click(object sender, EventArgs e)//发送消息
        {
            MyClient.send_msg(serverSocket, MyClient.TCP_msg + textBox6.Text);//这里是单独发送消息  但是发送不过去?
        }
    }
}
新类

namespace Client
{
    class CClient
    {
        Thread Client_thread;
        public delegate void listenMessage(string msg);//委托显示消息
        public listenMessage showMsg,showClientMsg;
        public string serverIP;//服务器IP
        public int serverPort;//服务器端口
        public int TCP_LengTh = 6;//协议长度
        public string TCP_client = "TCP-01";//连接协议
        public string TCP_client_OK = "TCP-02";
        public string TCP_msg = "TCP-03";//消息协议
        public string TCP_close = "TCP-04";//关闭连接协议
        
        public void BeginSend()
        {
            Form1 fm1 = System.Windows.Forms.Application.OpenForms[0] as Form1;//访问和修改主窗体控件属性
 
            IPEndPoint iep = new IPEndPoint(IPAddress.Parse(serverIP), serverPort);
            Socket socket = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);
            socket.Connect(iep);

            byte[] byClent = new byte[1024];
            byClent = Encoding.Default.GetBytes(TCP_client);//发送消息
            socket.Send(byClent);
            fm1.serverSocket = socket;//保存创建后的socket
            beginListen(socket); //开始监听
        }
        public void beginListen(Socket s)//接收数据
        {
            Form1 fm1 = System.Windows.Forms.Application.OpenForms[0] as Form1;//访问和修改主窗体控件属性
            while (true)
            {
                byte[] recMsg = new byte[1024];
                int rec = s.Receive(recMsg);
                if (rec > 0)
                {
                    string recS=Encoding.Default.GetString(recMsg);//接收的消息
                    string recSub = recS.Substring(0,TCP_LengTh);//截取协议头部消息
                   
                    if (recSub == TCP_client_OK)
                    {
                        showClientMsg("服务器连接成功!");//委托显示状态
                        fm1.serverSocket = s;//全局保存连接后的SOCKET
                    }
                    if (recSub == TCP_msg)
                    {
                        showMsg(recS.Remove(0,TCP_LengTh));//委托显示消息
                    }
                }
            }
        }
        public void send_msg( Socket s, string msg)//发送消息
        {
            byte[] bf = new byte[1024];
            bf = Encoding.Default.GetBytes(msg);
            s.Send(bf);
        }

        public void StartThread(string serIP,int serPort)//开启线程
        {
            serverIP = serIP; //赋值IP和端口
            serverPort = serPort;
            Client_thread = new Thread(new ThreadStart(BeginSend));
            Client_thread.Start();
        }
    }
}
木子李1212 2013-11-30
  • 打赏
  • 举报
回复
http://stackoverflow.com/questions/9406466/sending-data-multiple-times-over-a-single-socket
threenewbee 2013-11-30
  • 打赏
  • 举报
回复
http://stackoverflow.com/questions/9406466/sending-data-multiple-times-over-a-single-socket
threenewbee 2013-11-30
  • 打赏
  • 举报
回复
可以多次send的,你代码怎么写的。

111,093

社区成员

发帖
与我相关
我的任务
社区描述
.NET技术 C#
社区管理员
  • C#
  • AIGC Browser
  • by_封爱
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

让您成为最强悍的C#开发者

试试用AI创作助手写篇文章吧