我是个新手,语言有错误的地方不要笑我啊,希望大家多给点提示和思路啊...客户端:用户登录后,在客户端上显示服务器的信息,并能接收服务器发送来的信息和传递给服务器信息。服务器:读取sql server数据库中的信息,在更新数据库的同时能将数据传递给客户端,接收传客户端递过来的信息。-----------------
说起来简单,使用异步套接字的方法....服务器:
1.建立Socket
2.将套接字绑定到tcp通讯的本地ip和Point
3.设置套接字处于监听。
4.用BeginAccept接收...
5.设计回调
6.回调中用BeginReceive接收,或用BeginSend方法发送。
7.发送后,在回调方法中调用EndSend完成发送。客户端:
1.建立Socket
2.绑定ip和端口
3.用BeginConnect连接服务器
4.用BeginAccept接收...
5.设计回调
6.回调中用BeginReceive接收,或用BeginSend方法发送。
7.发送后,在回调方法中调用EndSend完成发送。
----------------------我是第一次做,所以没什么模式,希望大大们能给点思路,或一些简单传输事例。比如就说:(假定用户的用户名和密码已经在服务器所连接的数据库中写好了)客户端上用户填写 用户名和密码  然后客户端将用户名、密码这2个数据传输到服务器端,服务器接收到数据,在服务器端通过查询数据库得到验证,服务器再发送验证结果通知客户端,客户端通过验证结合判断用户是否能进入下一个窗体。
----------------------
这只是简单的数据相互传输。当牵涉到dataGirdView中显示的数据相互更新和传递,是不是就比较复杂和麻烦呢?
希望大大们能发点简单的程序和给点扩展的思路,这样我能少走很多弯路....谢谢了....

解决方案 »

  1.   

    推荐你看看Programming C#第四版,有控制台范例程序
      

  2.   

    先将客户端的 登录:代码:namespace openjjkh
    {
        public partial class enter : Form
        {
            public enter()
            {
                InitializeComponent();
            }        private StateObject state;        private void enter_Load(object sender, EventArgs e)
            {
                try
                {
                    IPAddress ipAddress = IPAddress.Parse("127.0.0.1");
                    IPEndPoint remoteEP = new IPEndPoint(ipAddress, 5555);
                    Socket clientSocket = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);
                    clientSocket.BeginConnect(remoteEP, new AsyncCallback(ConnectCallback), clientSocket);
                }
                catch (Exception ee)
                {
                    Console.WriteLine(ee.ToString());
                }
            }
            private void button1_Click(object sender, EventArgs e)
            {
                Send(textBox1.Text);
                Send(textBox2.Text);
            }
            private void ConnectCallback(IAsyncResult ar)
            {
                try
                {
                    Socket clientSocket = (Socket)ar.AsyncState;
                    clientSocket.EndConnect(ar);
                    state = new StateObject();
                    state.workSocket = clientSocket;
                    clientSocket.BeginReceive(state.buffer, 0, StateObject.BufferSize, 0, new AsyncCallback(ReadCallback), state);
                }
                catch (Exception e)
                {
                    Console.WriteLine(e.ToString());
                }
            }
            public void ReadCallback(IAsyncResult ar)
            {
                StateObject state = (StateObject)ar.AsyncState;
                Socket clientSocket = state.workSocket;
                int bytesRead = clientSocket.EndReceive(ar);
                if (bytesRead = 1)  //这里是当信息被传送回来
                {
                    khwindow khzct = new khwindow();
                    khzct.Show();
                    this.Hide();
                }
                else
                {
                    MessageBox.Show("用户名或密码输入错误!!!");
                    textBox1.Text = "";
                    textBox2.Text = "";
                }
                clientSocket.BeginReceive(state.buffer, 0, StateObject.BufferSize, 0, new AsyncCallback(ReadCallback), state);
            }
            private void Send(string data)
            {
                /*是否要给Send()在加个参数n,用来传递发送的是哪一类数据,服务器接收后根据这个参数执行相应的处理方法
                  比如现在是Send(string date,int n)
                 * 但传递的是 用户名和密码...我是不是要写成Send(string date1,string date2,int n)
                 * 这样下面就是:
                 * byte[] byteData1 = Encoding.Unicode.GetBytes(data1);
                   state.workSocket.BeginSend(byteData1, 0, byteData1.Length, 0, new AsyncCallback(SendCallback), state);
                 * byte[] byteData2 = Encoding.Unicode.GetBytes(data2);
                   state.workSocket.BeginSend(byteData2, 0, byteData2.Length, 0, new AsyncCallback(SendCallback), state);
                 * byte[] byteData3 = Encoding.Unicode.GetBytes(n);
                   state.workSocket.BeginSend(n, 0, n.Length, 0, new AsyncCallback(SendCallback), state);
                 * 这样写行不行,是不是太麻烦了,要是要同时发送10几个textBox里的数据启不是要写10几个参数吗,能不能写到一起啊?
                 */
                byte[] byteData = Encoding.Unicode.GetBytes(data);
                state.workSocket.BeginSend(byteData, 0, byteData.Length, 0, new AsyncCallback(SendCallback), state);
            }
            private void SendCallback(IAsyncResult ar)
            {
                try
                {
                    Socket clientSocket = (Socket)ar.AsyncState;
                    int bytesSent = clientSocket.EndSend(ar);
                }
                catch (Exception e)
                {
                    Console.WriteLine(e.ToString());
                }
            }        private void label4_Click(object sender, EventArgs e)
            {
                /*此处点击这个label是弹出个新窗体,让客户端用户进行注册,
                 此时新窗体打开后,是否还需要进行连接?
                 * 假如在入口函数中采用判断,比如服务器发送来用户的用户名和密码被验证正确,登录了主窗体(而不是注册弹出的窗体),登录窗体Close(),
                 * 那在主窗体中是否要重新在进行连接?如果登录窗体时Hide(),是不是就不用了? 
                 */
            }    }
        public class StateObject
        {
            public Socket workSocket = null;
            public const int BufferSize = 1024;
            public byte[] buffer = new byte[BufferSize];
        }
    }
      

  3.   

    在服务器端 主窗体:代码:namespace openjjsys
    {
        public partial class fwzwindow : Form
        {
            public fwzwindow()
            {
                InitializeComponent();
            }        private  StateObject state;        private void fwzwindow_Load(object sender, EventArgs e)
            {
                System.Windows.Forms.Control.CheckForIllegalCrossThreadCalls = false;            IPAddress ipAddress = IPAddress.Parse("127.0.0.1");
                IPEndPoint localEndPoint = new IPEndPoint(ipAddress, 5555);
                Socket serverSocket = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);
                try
                {
                    serverSocket.Bind(localEndPoint);
                    serverSocket.Listen(100);
                    serverSocket.BeginAccept(new AsyncCallback(AcceptCallback), serverSocket);
                }
                catch (Exception ee)
                {
                    Console.WriteLine(ee.ToString());
                }
            }
            public void AcceptCallback(IAsyncResult ar)
            {
                Socket serverSocket = (Socket)ar.AsyncState;
                Socket clientSocket = serverSocket.EndAccept(ar);
                state = new StateObject();
                state.workSocket = clientSocket;
                clientSocket.BeginReceive(state.buffer, 0, StateObject.BufferSize, 0, new AsyncCallback(ReadCallback), state);
            }
            private void Send(string data)
            {
                byte[] byteData = Encoding.Unicode.GetBytes(data);
                state.workSocket.BeginSend(byteData, 0, byteData.Length, 0, new AsyncCallback(SendCallback), state);
            }
            private void SendCallback(IAsyncResult ar)
            {
                try
                {
                    Socket clientSocket = (Socket)ar.AsyncState;
                    int bytesSent = clientSocket.EndSend(ar);
                }
                catch (Exception e)
                {
                    Console.WriteLine(e.ToString());
                }
            }
            public void ReadCallback(IAsyncResult ar)
            {
                StateObject state = (StateObject)ar.AsyncState;
                Socket clientSocket = state.workSocket;
                int bytesRead = clientSocket.EndReceive(ar);
                
                /*这里需要判断 用户发送来的信息是哪一类的。
                 * 比如当bytesRead=1的时候表示:客户端上用户点击了登录,发送的是用户名和密码,此刻要执行查询数据库,返回验证结果。
                   如果当bytesRead=2时表示:客户端上用户点击注册,发送了个人的相关信息,服务器要将这些数据添加到数据库,返回注册结果。
                   当bytesRead=3时表示:用户以进入客户端主程序后点击一个button,弹出一个新窗体,发送的是要在新窗体的dataGirdView控件中显示他个人信息的请求,
                 * 服务器查询数据库,将相应的信息发回去...
                 * bytesRead=4 ......等等.......
                 * 
                 * 在这里是不是这么写? 写起来是不是多了? 还是把各个方法写在不同的函数体里调用? 还是把整个放在一个类里?
                 * 
                 */            clientSocket.BeginReceive(state.buffer, 0, StateObject.BufferSize, 0, new AsyncCallback(ReadCallback), state);
            }        private void fwzwindow_FormClosing(object sender, FormClosingEventArgs e)
            {
                try
                {
                    state.workSocket.Shutdown(SocketShutdown.Both);
                    state.workSocket.Close();
                }
                catch (Exception) { }
            }        private void button1_Click(object sender, EventArgs e)
            {
                
            }
        }
        public class StateObject
        {
            public Socket workSocket = null;
            public const int BufferSize = 1024;
            public byte[] buffer = new byte[BufferSize];
        }
    }-------------------------我很多不会写的地方在代码中注着。其实最头痛的地方简单说就是:服务器如何判断客户端的不同请求,做出相应的处理。还有1.是不是我们日常用的都是:服务器数据的发送都是基于客户端的请求。2.客户端和服务器都定义了一个 StateObject类,
    public class StateObject
        {
            public Socket workSocket = null; //客户套接字
            public const int BufferSize = 1024; //缓冲区大小
            public byte[] buffer = new byte[BufferSize]; //缓冲区
        }
    那么这个StateObject类所创建的对象 state 是不是可以理解为即将接收到的信息开辟一个空间,用来存储将要传递来的信息?
    我是个新手有很多问得莫名其妙的地方大家海涵啊 ...还请大家多多关照,帮助我解决问题...谢谢了...
      

  4.   

    我贴了啊...客户端登录窗体的代码,服务器端主窗体的代码,2个代码中那些不理解,不知道怎么去写的地方我都注释上了,并在里面写出了自己的困惑。希望大家能帮我,给我指点啊....难度我说的不明确吗?????????
    大家帮帮我啊 ...............(呐喊ing)
      

  5.   

    哦,还有尊敬的大侠们,我做的是一个完全的C#窗体程序,不是ASP.NET网页程序...没有asp.net所包含的内置对象:session去存储个人信息, 也没有cookie去存储信息。
      

  6.   

    byte[] byteData = Encoding.Unicode.GetBytes(data);
    这样写不是会出现乱码吗?
      

  7.   

    支持你,我也刚刚接触到Socket学习
      

  8.   

    为什么说命名空间已经包含了StateObject类??出错
      

  9.   

    有没有用java写的捏?也是套接字Socket的使用求救了!
      

  10.   

    我是像这样写的,但是遇到一个问题,就是我有一台电脑一方面要监听局域网的客户机,一方面还要连接公网(外网  连接成功的),这时候局域网的客户机就连接不到这台监听的机器了。但如果是没有连接到外网的时候,局域网的客户机可以连接到这台监听的机器???有人可以告诉我为什么吗?我用的是C#编写的。我想是连接和监听共同占用某个东西,可是我不知道是什么?希望大家知道的帮帮忙,O(∩_∩)O谢谢
      

  11.   

    网络核心编程这边书的作者搜集的代码到底自己亲测了麽,尼玛坑爹有木有。线程中文本框是被占用的,书上写ricktextbox1.Text="与客户端建立连接...",直接报错。后来百度才知道进程中richtextbox1.Invoke(new MyDelete(chgs),"与客户端建立连接...");