| 编程中国 | 业界新闻 | 技术文章 | 视频教程 | 下载频道 | 程序源码 | 个人空间 | 编程论坛
全能ASP/PHP/ASP.NET主机,支持月付专业 MSSQL 数据库空间,支持月付专业 MySQL 数据库空间,支持月付赛孚耐:软件保护加密专家
身份认证令牌USB KEY   
共有 762 人关注过本帖
标题:[求助]关于Tcp通讯方面的问题
收藏  订阅  推荐  打印 
天使不落泪
Rank: 2
等级:注册会员
帖子:100
积分:1166
注册:2007-7-24
[求助]关于Tcp通讯方面的问题

服务端对一个 客户端的功能 我实现了
可是有2个 客户端同时连接 服务端的时候 就只有一个客户端 能收到服务端发来的信息, 想问下怎么实现 2个同时收信息啊,谢谢拉
搜索更多相关主题的帖子: Tcp  通讯  
2007-12-13 09:29
梦心
Rank: 12Rank: 12Rank: 12
来自:福建平和
等级:版主
威望:6
帖子:1570
积分:15040
注册:2007-5-11

.............
网络通信不专业啊我

我清高和我骄傲的倔强,在风中大声的唱:我不听,我不听~~做我自己最特别,呼呼~~啦啦~~~
我的博客园地址: [url]http://mengxin523.cnblogs.com[/url]
2007-12-13 09:41
xcclgl001
Rank: 1
等级:新手上路
帖子:1
积分:112
注册:2007-12-13

用多线程不能解决吗
2007-12-13 17:54
quanercao
Rank: 2
等级:注册会员
帖子:54
积分:766
注册:2007-10-16

把当前在线的客户端的IP和PORT列表保存,服务器端根据列表即时建立TCP连接,分别发送
当然如楼上所说,建立多个线程,每个线程为一个客户端服务(特定的IP和PORT)也是可行的,不过不建议采用。把你的线程数降到最少
2007-12-13 20:12
yangglemu
Rank: 2
等级:注册会员
帖子:78
积分:890
注册:2006-9-15

这是网络通信并发连接处理的问题,用线程解决,每遇到一个连接请求,单独创建一个线程完成,互不干扰
2007-12-14 11:47
tanxiaolin
Rank: 2
等级:注册会员
帖子:71
积分:908
注册:2007-12-12

你这样写试试,我是VS2005调试通过了的。
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Text;
using System.Windows.Forms;
using System.Net;
using System.Net.Sockets;
using System.IO;
using System.Threading;
using System.Collections;

namespace TCPtest
{
    public partial class Form1 : Form
    {
        public Form1()
        {
            InitializeComponent();
        }
        private string RFileName = "ChatRecord.Txt";


        public void Wfile(string filename, string filecont)
        {
            FileStream fs = new FileStream(filename, FileMode.OpenOrCreate, FileAccess.Write);
            StreamWriter wfile = new StreamWriter(fs);
            wfile.BaseStream.Seek(0, SeekOrigin.End);
            wfile.WriteLine(filecont);
            wfile.Flush();
            wfile.Close();
        }//写纪录
        private void CloseWin_Click(object sender, EventArgs e)
        {
            this.Close();
            Application.Exit();
        }

        private void ViewText_Click(object sender, EventArgs e)
        {
            System.Diagnostics.Process.Start(RFileName);
        }

        private void Form1_Load(object sender, EventArgs e)
        {

        }
        private TcpListener Ilistener;
        private Thread Iprocessor;
        private Socket Iclientsocket2;
        private Thread Iclientservice;
        private void ExitBtn_Click(object sender, EventArgs e)
        {
            if (Iprocessor.IsAlive) Iprocessor.Abort();
            Ilistener.Stop();
            RevStr.Text = "[" + System.DateTime.Now + "]:终止服务\n";
            OpenBtn.Enabled = true;//启动键有效
            ExitBtn.Enabled = false;//停止键无效
            ViewText.Enabled = false;//纪录有效
            SendBtn.Enabled = false;//发送有效
        }

        private void OpenBtn_Click(object sender, EventArgs e)
        {
            Iprocessor = new Thread(new ThreadStart(IStartListening));
            Iprocessor.Start();
            RevStr.Text = "[" + System.DateTime.Now + "]:启动服务\n";
            if (File.Exists(RFileName)) File.Delete(RFileName);
            Wfile(RFileName, RevStr.Text);
            OpenBtn.Enabled = false;//启动键无效
            ExitBtn.Enabled = true;//停止键有效
            ViewText.Enabled = true;//纪录有效
            SendBtn.Enabled = true;//发送有效
        }
        private NetworkStream ns;
        private TcpClient clientsocket;
        private System.Net.IPAddress UserIP=new System.Net.IPAddress(System.Net.Dns.GetHostByName(System.Net.Dns.GetHostName()).AddressList[0].Address);
        private void SendBtn_Click(object sender, EventArgs e)
        {
            int ToPortStr=6886;
            
            if(PortStr.Text.ToString().Trim()!="")ToPortStr=int.Parse(PortStr.Text.ToString());
            string ToIpStr=IPStr.Text;
            string ToCont=SendStr.Text.ToString();
            string ToContentStr=UserIP.ToString()+ToCont;
            SendStr.Text="";
            try
            {
                clientsocket = new TcpClient(ToIpStr,ToPortStr);
                clientsocket.SendTimeout=1000;
                clientsocket.ReceiveTimeout=1000;
                clientsocket.ReceiveBufferSize=256;
                ns = clientsocket.GetStream();
                //
                Byte[] outbytes = System.Text.Encoding.Unicode.GetBytes(ToContentStr.ToCharArray());
                int WriteLength=(int)clientsocket.ReceiveBufferSize;
                if(outbytes.Length<WriteLength)WriteLength=outbytes.Length;
                ns.Write(outbytes,0,outbytes.Length);
                RevStr.Text = "["+System.DateTime.Now+"]发:"+ToContentStr;
                Wfile(RFileName,RevStr.Text);
                clientsocket.Close();
            }
            catch(Exception ex)
            {
                if(ex!=null)MessageBox.Show("无法连接对方机器或者未启动服务","Error",MessageBoxButtons.OK, MessageBoxIcon.Exclamation);
            }
        }//发送
        private void IServiceClient()
        {
            bool Ikeepalive=true;
            int RCharNum=256;
            string ReceiveMsg ="";
            if ((Iclientsocket2.Connected)&&(Ikeepalive))
            {
                try
                {
                    Byte[] buffer = new Byte[RCharNum];
                    Iclientsocket2.Receive(buffer,0,RCharNum,SocketFlags.None);
                    string Iclientcommand = System.Text.Encoding.Unicode.GetString(buffer);
                    ReceiveMsg = Iclientcommand;

                }
                catch(Exception e)
                {
                    if(e!=null)MessageBox.Show("传输出错"+e.ToString());
                    Ikeepalive=false;
                }
            }
            RevStr.Text = "["+System.DateTime.Now+"]\n收:"+ReceiveMsg;
            Wfile(RFileName,RevStr.Text);
            Iclientsocket2.Shutdown(SocketShutdown.Both);
            Iclientsocket2.Close();
        }//接收
        private void IStartListening()
        {
            int PortNumber = 8998;
            if (PortStr.Text.ToString().Trim() != "") PortNumber = int.Parse(PortStr.Text.ToString());
            Ilistener = new TcpListener(PortNumber);
            try
            {
                Ilistener.Start();
            }
            catch (Exception e)
            {
                if (e != null)
                {
                    MessageBox.Show("无法打开端口", "Error", MessageBoxButtons.OK, MessageBoxIcon.Exclamation);
                    ExitBtn_Click(null, null);
                }
            }
            while (Iprocessor.IsAlive)
            {
                try
                {
                    Iclientsocket2 = Ilistener.AcceptSocket();
                    Iclientservice = new Thread(new ThreadStart(IServiceClient));
                    Iclientservice.Start();
                }
                catch (Exception e)
                {
                    if (e != null)
                    {
                        MessageBox.Show("无法建立端口服务,服务终止", "Error", MessageBoxButtons.OK, MessageBoxIcon.Exclamation);
                        if (Iclientservice.IsAlive) Iclientservice.Abort();
                        break;
                    }
                }
            }
        }

        private void RevStr_TextChanged(object sender, EventArgs e)
        {

        }
    }
}
2007-12-14 16:12
白菜粉条
Rank: 2
等级:注册会员
帖子:76
积分:750
注册:2007-5-25

多线程!!

我不是不想不郁闷,台湾问题没有解决啊!
2007-12-15 10:55
caiyakang
Rank: 6Rank: 6
等级:金牌会员
威望:5
帖子:2109
积分:21464
注册:2005-3-24

多线程+同步
或者用异步

中国人的财富网:http://www.i2w.com.cn/
2007-12-15 23:20
cheng7xicx_jsp
Rank: 1
等级:新手上路
帖子:13
积分:250
注册:2007-12-24

楼上 每个人连到服务器上 每个人都有一条线程在服务器上跑起来了 人多了 服务器会不会瘫了
2007-12-26 12:34
关于我们 | 广告合作 | 编程中国 | 清除Cookies | Archiver | WAP | TOP

编程中国 版权所有,并保留所有权利。鲁ICP备08000592号
Powered by Discuz, Processed in 0.084431 second(s), 9 queries.
Copyright©2004-2008, BCCN.NET, All Rights Reserved