点点滴滴 访问量:
posts - 84,comments - 115,trackbacks - 6
 

说明:此示例在.net2005\xp下运行通过

示例程序是同步套接字程序,功能很简单,只是客户端发给服务器一条信息,服务器向客户端返回一条信息;这里只是一个简单的示例,是一个最基本的socket编程流程,在接下来的文章中,会依次记录套接字的同步和异步,以及它们的区别。

 

下面是示例程序的简单步骤说明

服务器端:

第一步:用指定的端口号和服务器的ip建立一个EndPoint对像;

第二步:建立一个Socket对像;

第三步:用socket对像的Bind()方法绑定EndPoint

第四步:用socket对像的Listen()方法开始监听;

第五步:接受到客户端的连接,用socket对像的Accept()方法创建新的socket对像用于和请求的客户端进行通信;

第六步:通信结束后一定记得关闭socket;

代码:
using System;
using System.Collections.Generic;
using System.Text;
using System.Net;
using System.Net.Sockets;

namespace server
{
    
class Program
    
{
        
static void Main(string[] args)
        
{
            
int port = 2000;
            
string host = "127.0.0.1";


            
///创建终结点(EndPoint)
            IPAddress ip  = IPAddress.Parse(host);//把ip地址字符串转换为IPAddress类型的实例
            IPEndPoint ipe = new IPEndPoint(ip, port);//用指定的端口和ip初始化IPEndPoint类的新实例


            
///创建socket并开始监听
            Socket s = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);//创建一个socket对像,如果用udp协议,则要用SocketType.Dgram类型的套接字
            s.Bind(ipe);//绑定EndPoint对像(2000端口和ip地址)
            s.Listen(0);//开始监听
            Console.WriteLine("等待客户端连接");


            
///接受到client连接,为此连接建立新的socket,并接受信息
            Socket temp = s.Accept();//为新建连接创建新的socket
            Console.WriteLine("建立连接");
            
string recvStr = "";
            
byte[] recvBytes = new byte[1024];
            
int bytes;
            bytes 
= temp.Receive(recvBytes, recvBytes.Length, 0);//从客户端接受信息
            recvStr += Encoding.ASCII.GetString(recvBytes, 0, bytes);


            
///给client端返回信息
            Console.WriteLine("server get message:{0}", recvStr);//把客户端传来的信息显示出来
            string sendStr = "ok!Client send message successful!";
            
byte[] bs = Encoding.ASCII.GetBytes(sendStr);
            temp.Send(bs, bs.Length, 
0);//返回信息给客户端
            temp.Close();
            s.Close();
            Console.ReadLine();
        }

       
    }

}


server结果:


客户端:

第一步:用指定的端口号和服务器的ip建立一个EndPoint对像;

第二步:建立一个Socket对像;

第三步:用socket对像的Connect()方法以上面建立的EndPoint对像做为参数,向服务器发出连接请求;

第四步:如果连接成功,就用socket对像的Send()方法向服务器发送信息;

第五步:用socket对像的Receive()方法接受服务器发来的信息 ;

第六步:通信结束后一定记得关闭socket

代码:
using System;
using System.Collections.Generic;
using System.Text;
using System.Net;
using System.Net.Sockets;

namespace Client
{
    
class Program
    
{
        
static void Main(string[] args)
        
{
            
try
            
{
                
int port = 2000;
                
string host = "127.0.0.1";

                
///创建终结点EndPoint
                IPAddress ip = IPAddress.Parse(host);
                
//IPAddress ipp = new IPAddress("127.0.0.1");
                IPEndPoint ipe = new IPEndPoint(ip, port);//把ip和端口转化为IPEndpoint实例


                
///创建socket并连接到服务器
                Socket c = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);//创建Socket
                Console.WriteLine("Conneting…");
                c.Connect(ipe);
//连接到服务器


                
///向服务器发送信息
                string sendStr = "hello!This is a socket test";
                
byte[] bs = Encoding.ASCII.GetBytes(sendStr);//把字符串编码为字节
                Console.WriteLine("Send Message");
                c.Send(bs, bs.Length, 
0);//发送信息


                
///接受从服务器返回的信息
                string recvStr = "";
                
byte[] recvBytes = new byte[1024];
                
int bytes;
                bytes 
= c.Receive(recvBytes, recvBytes.Length, 0);//从服务器端接受返回信息
                recvStr += Encoding.ASCII.GetString(recvBytes, 0, bytes);
                Console.WriteLine(
"client get message:{0}", recvStr);//显示服务器返回信息

                
///一定记着用完socket后要关闭
                c.Close();

            }

            
catch (ArgumentNullException e)
            
{
                Console.WriteLine(
"argumentNullException: {0}", e);
            }

            
catch (SocketException e)
            
{
                Console.WriteLine(
"SocketException:{0}", e);
            }


            Console.WriteLine(
"Press Enter to Exit");
        }

    }

}


Client端结果:
posted on 2007-01-23 14:25 sopper 阅读(1769) 评论(14)  编辑 收藏

FeedBack:
2007-09-09 13:31 | Jiang-JIngzhen [未注册用户]
成功运行,很有帮助!谢谢!
  回复  引用    
#2楼 [楼主]
2007-09-30 10:49 | sopper      
不客气
有用就好
互想学习
共同进步
  回复  引用  查看    
2007-11-02 15:48 | lastgame_1 [未注册用户]
谢谢 !
  回复  引用    
2007-11-16 09:00 | caoyi [未注册用户]
很有帮助
谢谢!
  回复  引用    
2008-01-25 21:17 | sgb [未注册用户]
非常感谢楼主,我最近正做一个TCP通信接口,不过是客户端向服务器发送一个指令(停掉一个具体的process),如果楼 主,有兴趣的话,请帮我思考一下,好吗?我 会常常“回来”,留意你的留言。
  回复  引用    
#6楼 [楼主]
2008-01-26 10:05 | sopper      
@sgb
你好
对你的留言的理解是:通过客户端去操作服务器上的process
不知道这样的理解是否正确

如果理解正确的话,我觉得就比较好实现了

例如:
客户端通过2个不同的指令去关闭服务器上2个不同的进程

客户端发指令到服务器
服务器接到指令后根据指令的不同去关闭不同的进程
完成

这两个步骤都不难,总觉得我对你的理解是错误的
汗一个
  回复  引用  查看    
#7楼 [楼主]
2008-01-26 10:07 | sopper      
@caoyi
@lastgame_1
不客气
一起学习
共同进步
  回复  引用  查看    
#8楼 [楼主]
2008-01-26 10:35 | sopper      
@sgb
如果可以的话,把你的需求写出来,我们一起商量着来做,希望我可以帮上你的忙
  回复  引用  查看    
2008-01-26 23:49 | sgb [未注册用户]
谢谢楼主,你对我所提的问题,理解的完全正确,我也想通了。我把我的方案讲出来,你帮我审审;
一、客户端
1、启用服务器端的 TCPserver.exe
2、下发 一个指令(关闭具体的一个进程,然后再启动同一个进程)
3、等待服务器返回“关闭”/“启动” 成功与否的消息
4、如失败,将重复2~3,如成功,就关闭TCPclient.exe

二、服务端
1、接受到指令,查看具体的进程是否已经启动,如没有,直接启动
如有,先关闭,然后启动
2、ManagementEventWatcher watcher,同步监测具体的进程,
"__InstanceCreationEvent"/"__InstanceDeletionEvent",
触发事件委托(向客户端返回消息)
3、启动成功,关闭TCPclient.exe,如失败,等待客户端再次发指令,
失败次数可以做个限制,满了限制, 也要做关闭CPclient.exe;
如客户端关闭时,它也要立刻关闭;
  回复  引用    
#10楼 [楼主]
2008-01-29 18:21 | sopper      
@sgb
不好意思,这两天比较忙,所以回复的晚了

基本上就是你说的这样子了
把客户端的第一条写在外面,我觉得看起来思路会更清晰些
  回复  引用  查看    
2008-02-02 19:15 | sgb [未注册用户]
今天,程序大体下来了,拿 notepad.exe实验成功,
但对具体要执行的程序(caishu.exe 采数程序)却不成功;当然,我在环境变量里,已经打通了;而我预先在服务器端手动把SERVERAPP.exe启动了,然后在客户端启用CLIENAPP.exe,在这个程序里对服务器下发指令,这时,服务器完全达到了正确 结果; 现在的问题 是:我在 客户端CLIENAPP.exe里,远程起用了SERVERAPP.exe,而后下发指令,SERVERAPP.exe受到重起的指令后,就将caishu.exe 采数程序先停止,然后立刻启动;caishu,在任务管理器里能看到,但它却不能正常 运行,请 楼 主,能 给指导一下, 是什么原因造成的?
我 先谢了!!!
  回复  引用    
2008-02-02 19:25 | sgb [未注册用户]
补充说明
SERVERAPP.exe 与caishu.exe 采数程序 在同一个文件夹里,
caishu.exe 采数程序,在启动时,要在APPLICATION。PATH里 读取 .XML配置文档。
现在,我能想到的就是:手动起用时,用的SESSION_ID
与远程起用时,用的SESSION_ID, 不同;
但它不是 真正的原因?请楼主能在空闲时间 给予 认真思考

  回复  引用    
#13楼 [楼主]
2008-02-20 15:19 | sopper      
@sgb
你好
首先祝你新年快乐

你的caishu.exe 采数程序具体做什么处理?

我想你的问题可能出在 “SERVERAPP.exe受到重起的指令后,就将caishu.exe 采数程序先停止,然后立刻启动;caishu,” 这句话里了

你可以这样试试,先把SERVERAPP.exe里启动caishu的代码注释掉,用手动的方式来启动,试试可否行得通
  回复  引用  查看    

标题  
姓名  
主页
Email (博主才能看到) 
验证码 *  看不清,换一张 [登录][注册]
内容(请不要发表任何与政治相关的内容)  
博客园首页

新闻频道

社区

小组

博问

网摘

闪存

  登录  使用高级评论  新用户注册  返回页首  恢复上次提交      
该文被作者在 2007-01-23 14:30 编辑过
成果网帮您增加网站收入


相关链接: