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

pedkk 2013-11-30 10:08:40
客户端Connect后,send发送消息 服务端可以收到。
但是Connect后,我将连接后的的SOCKET保存在全局变量,再发送消息就不行。但是可以接收到服务器端的消息。我用的是同步。
...全文
1065 11 打赏 收藏 转发到动态 举报
写回复
用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的,你代码怎么写的。
1、本课程是一个干货课程,主要讲解如何封装服务器底层,使用Tcp/ip长连接,IDE使用vs2019 c++开以及使用c++11的一些标准,跨平台windows和linux,服务器性能高效,单服务器压力测试上万无压力,服务器框架是经历过上线产品的验证,框架简单明了,不熟悉底层封装的人,半个小时就能完全掌握服务器框架上手写业务逻辑。2、本课程是一个底层服务器框架教程,主要是教会学员在windows或linux下如何封装一个高效的,避免踩坑的商业级框架,服务器底层使用初始化即开辟内存的技术,使用内存池,服务器运行期间内存不会溢出,非常稳定,同时服务器使用自定义哈希hashContainer,在处理新的连接,新的数据,新的封包,以及解包,包,粘包的过程,哈希容器性能非常高效,增、删、查、改永远不会随着连接人数的上升而降低性能,增、删、查、改的复杂度永远都是恒定的O(1)。3、服务器底层封装没有使用任何第三方网络库以及任何第三方插件,自由度非常的高,出了任何BUG,你都有办法去修改,查找问题也非常方便,在windows下使用iocp,linux下使用epoll.4、讲解c++纯客户端,主要用于服务器之间通信,也就是说你想搭建多层结构的服务器,服务器与服务器之间使用socket通信。还可以使用c++客户端做压力测试,开辟多线程连接服务器,教程提供了压力测试,学员可以自己做压力测试服务器性能。5、赠送ue4和unity3d通信底层框架以及多人交互demo,登录,注册,玩家离开,同步主要是教会学员服务器与客户端如何交互。6、赠送c++连接mysql数据库框架demo,登录,注册,玩家离开数据持久化.7、服务器教程使用自定义通信协议,同时也支持protobuf,选择权在开者自己手里,想用什么协议都可以,自由度高。8、服务器教程使用手动敲代码逐句讲解的方式开展教学课程。非喜勿喷,谢谢大家。9、服务器教程提供源码,大家可以在平台提供的地址下载或者联系我,服务器使用c++11部分标准,std::thread,条件变量,线程锁,智能指针等,需要学员具备一定c++知识,购买前请慎重考虑。

110,537

社区成员

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

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

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