回 帖 发 新 帖 刷新版面

主题:高手来改个  套接字程序

using System;
using System.IO;
using System.Net.Sockets;
using System.Collections.Generic;
using System.Text;

namespace QTCPClient1
{
    class QClient1
    {
        [STAThread]
        static void Main(string[] args)
        {
            
              // string input = Console.ReadLine();
         //  args = Console.ReadLine();

            //判断命令行是否准确,应当是:
            //服务器IP 端口(60000) 选项(0或1) [姓名](如果选项为1)
          if(args.GetLength(0) !=3 && args.GetLength(0) != 4)
            {
                Console.WriteLine("参数出错");
                return ;
            }
            QClient1 qClient = new QClient1();
            //记录服务端IP和端口
            string strHost = args[0];
            ushort uiPort = Convert.ToUInt16(args[1]);
            String command;
            //生成通信指令字符串
            if(args.GetLength(0)==3)
                command="GET"+args[2]+"\r\n";
            else
                command="GET"+args[2]+" "+args[3]+"\r\n";
            Console.WriteLine("initializing client....");
            Console.WriteLine("connect to "+strHost+":"+uiPort+"...");
            // 连接到服务端
            try
            {
                qClient.client = new TcpClient(strHost, uiPort);
             }
            catch
            {
                Console.WriteLine("不能连接到服务端!");
                return;
            }
 
            //初始化网络输入输出流
            qClient.outStream = qClient.client.GetStream();
            qClient.inStream = new StreamReader(qClient.outStream);
            Console.WriteLine ( "connected to " + strHost + ":" +
                uiPort );
            string result;
            Console.WriteLine ( command);
            Byte[] cmd = System.Text.Encoding.ASCII.GetBytes (
                command.ToCharArray () );
            //发送请求通信指令
            qClient.outStream.Write ( cmd, 0, cmd.Length );
            // get response
            Console.WriteLine ("Result is:");
            while(true)
            {
                //接收结果
                result = qClient.inStream.ReadLine();
                if(result.Equals(""))
                    break;
                Console.WriteLine (  result );
            }
            Console.WriteLine ( "closing connection..." );
            //断开连接
            qClient.client.Close();
            Console.Write ( "press return to exit" );
            Console.ReadLine ();               


        }

        //TCP客户端对象
        private TcpClient client = null;
        //输入输出流对象
       
        private NetworkStream outStream = null;
        private StreamReader inStream = null;
    }
}

回复列表 (共7个回复)

沙发

using System;
using System.IO;
using System.Net.Sockets;
using System.Collections.Generic;
using System.Text;

namespace QTCPServer1
{
  class QServer1
    {
        //二个数组用来存储学生姓名和成绩。这里为了示例,比较简单,
        //实际使用时,应当用数据库来替代。
        //注意二个数组的大小一定要一致。
        public string[] strName ={   "qiugufeng",
                                    "qiuyuanfeng",
                                    "xiaoli  ",
                                    "xiaowang "
                                };
        public string[] strGrade ={   "100",
                                     "90",
                                     "95",
                                     "80"   
                                 };
        [STAThread]   
        static void Main(string[] args)
        {
            QServer1 qServer = new QServer1();
            Console.WriteLine("initializing server...");
            //监听断口60000
            TcpListener listener;
            try
            {
                listener = new TcpListener(60000);
            }
            catch
            {
                Console.WriteLine("创建监听断口失败");
                return;
            }
        
            //开始监听
            listener.Start();
            Console.WriteLine("server inintialized ,writing for" + " "+"incoming connections..");
            bool loop = true;
            //服务器一单启动,就进入监听循环中,不退出
            //虽然,由于没有创建单独的线城来处理用户连接,不能支持并发的客户访问
            //但支持用户多次访问和不同用户的顺序访问
            while(loop)
            {
                //监听客户端的连接。线程阻塞,值到有客户端连接为止
                Socket s = listener.AcceptSocket();
                //创建一个新的网络流对象,用于处理客户端的连接
                NetworkStream ns = new NetworkStream(s);
               //为了处理方便,创立一个网络流对象,用它,可一次读一行
                StreamReader r = new StreamReader(ns);
               
                String command = r.ReadLine();
                char split =' ';
                String [] strRec;

板凳

//解析命令字符,strRec[0]应当是GET
                // strRec[1] 应当是1或0  如果strRec[1]为1 则strRec[2]为学生的姓名
                strRec = command.Split(split);                
                int parameternum = strRec.GetLength(0);
                strRec[0]=strRec[0].ToUpper();
                //分析命令有效性,及把请求数据发回客户端
                if(strRec[1].Equals("GET"))
                {
                    if(strRec[1].Equals("0"))
                    {
                        for(int i=0;i<qServer.strName.GetLength(0);i++)    
                        {
                         String str = qServer.strName[i]+" "+qServer.strGrade[i]+"\r\n";
                         Byte [] res = System.Text.Encoding.ASCII.GetBytes(str.ToCharArray());
                            s.Send(res);
                        }
                    }
                 else if(strRec[1].Equals("1"))
                    {
                        
                        if(strRec.GetLength(0)!=3)
                        {
                            String str = "the command is error ,not include name"+"\r\n";
                             Byte [] res = System.Text.Encoding.ASCII.GetBytes(str.ToCharArray());
                        s.Send(res);
                        }
                    
                   

    

3 楼

else
                    {
                        int i;
                        for(i=0;i<qServer.strName.GetLength(0);i++)
                        {
                            strRec[2] = strRec[2].Trim();
                            qServer.strName[i] = qServer.strName[i].Trim();
                            if(qServer.strName[i].Equals(strRec[2]))
                            {
                                String str = qServer.strName[i]+" "+qServer.strGrade[i]+"\r\n";
                                Byte [] res = System.Text.Encoding.ASCII.GetBytes(str.ToCharArray());
                         s.Send(res);
                         break;
                            }
                        }
                     if(i == qServer.strName.GetLength(0))
                     {
                         String str ="the name is not find"+"\r\n";
                          Byte [] res = System.Text.Encoding.ASCII.GetBytes(str.ToCharArray());
                         s.Send(res);
                     }
                 }
                }
                else
                {
                    String str="The Command is Error,Head is "+strRec[0]+
                            ",is should be GET"+"\r\n";
                        Byte[] res = System.Text.Encoding.ASCII.
                            GetBytes(str.ToCharArray());
                        s.Send(res);
                    Console.WriteLine("The Command is Error,Head is {0},is should be GET",strRec[0]);
                }
            }
            //处理完后发一个空行,客户端依此来确定,数据接收完毕。
                //必须有,否则客户端不会退出。
                String str1="\r\n";
                Byte[] res1 = System.Text.Encoding.ASCII.
                    GetBytes(str1.ToCharArray());
                s.Send(res1);
            }
        }
        
       
  }
}
    

4 楼


高手门 给我改改  我实在是找不出来错误  新键控制台应用程序  就可直接运行

5 楼

说明程序的功能,把源码以过来,这样才好调试

6 楼

本工程中,假想:在大学校园中,每次考试之后,学生都迫切希望知道成绩,本例 就是为了解决这一问题
1 。服务器端存储学生成绩的信息,并且提供通信端口让客户端访问查询
2 。客户端主要负责与服务器端的连接,并把服务器端单会的信息显示在屏幕上,供学生阅览


  定义通信指令 GET X [Name]
GET 是指令头,表示请求学生成绩
 X  可以是0或1   0表示学生请求的所有的学生成绩 这时后面中括号的名字就为空
                 1表示请求单个学生成绩,这时括号中的Name是必须的,指明请求谁的成绩,
      注意:中括号表示 可选项,实际指令中并不包含

7 楼


你好 , 
Server一侧 看 ****** 一行 :               
                String command = r.ReadLine();
                char split =' ';
                String [] strRec;
//解析命令字符,strRec[0]应当是GET
                // strRec[1] 应当是1或0  如果strRec[1]为1 则strRec[2]为学生的姓名
                strRec = command.Split(split);                
                int parameternum = strRec.GetLength(0);
      *****     strRec[0]=strRec[0].ToUpper();
                //分析命令有效性,及把请求数据发回客户端
                if(strRec[0].Equals("GET"))

Client 一侧 看 GET 后面 的 空格,
在 server 是以 空格作为 分隔符 的 。

            String command;
            //生成通信指令字符串
            if(args.GetLength(0)==3)
                command="GET "+args[2]+"\r\n";
            else
                command="GET "+args[2]+" "+args[3]+"\r\n";

我来回复

您尚未登录,请登录后再回复。点此登录或注册