网络socket编程指南
- 格式:pdf
- 大小:607.51 KB
- 文档页数:5


2019.041概述人类社会的出现尧形成尧发展和进化袁离不得通信的发展袁从远古时代袁人们通过过简单的语言尧手势尧壁画进行原始通信袁到古代社会袁人们通过烽火尧竹简尧书信等方式传递信息袁在近代社会袁人们通过模拟信号进行电报尧电话尧电视等进行通信袁直到数字信号和计算机网络的兴起袁现在人们通过网络来进行更便捷尧更低成本的通信袁在网络通信上也出现各种各样的通信方式院电邮尧QQ尧微信尧短信等极大地加强了人与人之间的交流袁也提高了信息远程流转的效率遥现代计算机通信网络的发展主要经历了4个重要阶段院渊1冤面向终端的计算机网络袁这个阶段的特点是以主机为中心袁通过计算机实现与远程终端的数据通信袁但是主机与主机之间还没有互联遥渊2冤多主机互联的计算机网络院这个阶段的特点是若干台计算机相互连接成一个系统袁即利用通信线路将多台计算机连接起来袁实现了计算机与计算机之间的通信遥在这个阶段诞生了计算机网络上最重要的标准通信协议院TCP/IP协议袁创始人是温顿窑瑟夫和罗伯特卡恩遥渊3冤面向标准化的计算机网络院这个阶段的特点是形成了统一标准的网络体系结构袁进一步降低了更大规模渊不同厂家尧地域冤主机互联的难度和成本遥渊4冤全球互联的计算机网络院这个阶段的特点是全球的主机通过因特网连接在一起袁所有的主机成为网络中的一个节点遥在上面4个发展阶段中袁TCP/IP协议的诞生是现代计算机网络通信飞速发展的基石袁下一章讨论基于TCP/IP协议的Socket编程遥2Socket编程打开浏览器浏览网页时袁用QQ聊天时或者发送电子邮件时袁人们已经在使用基于Socket开发的程序进行网络通信了遥那什么是Socket钥Socket的类型有哪些钥有哪些基本操作钥在Java中Socket编程如何进行钥这些都是下文讨论的主要内容遥渊1冤网络连接院一个网络连接通常包括5个信息院通信协议尧本地协议地址尧本地主机端口尧远端主机地址和远端协议端口遥渊2冤Socket的基本概念院Socket的英文原义是野孔冶或野插座冶遥俗称"套接字"袁用于描述IP地址和端口袁是一个网络连接的句柄袁物理上表现为网络连接袁编程上表现为文件描述符袁通常客户端和服务端都可以得到一个网络连接在本端操作系统分配的一个句柄遥渊3冤Socket类型院根据连接方式的不同袁Socket分为数据报Socket和流式Socket袁数据报Socket是无连接的Socket袁通常基于UDP协议进行通信袁流式Socket是面向连接的Socket袁通常采用TCP协议进行通信袁重点介绍流式Socket通信遥渊4冤Socket操作院在Linux中袁Socket是一种特殊的文件袁既然是文件袁那么Socket的基本操作必然和文件的基本操作类似袁也就是有打开尧关闭尧读写等操作接口袁这些接口也是Socket的核心操作袁除此之外袁对于服务端程序袁还有侦听和绑定端口等操作袁用于指定初始化某个服务端Socket并绑定到对应服务端口进行侦听客户端来的连接请求遥流式Socket通信的基本过程院Socket通信分为3个基本过程院建立连接袁数据通信袁释放连接遥JavaSocket网络编程研究李小林(抚顺市技师学院,辽宁抚顺113123)摘要院介绍了通信发展的历史,重点介绍了网络通信发展的4个阶段,以及网络编程的基石:Socket的基本概念、类型、过程,并重点研究了JavaSocket通信的基本过程,实现了一个客户端-服务端通信程序并对服务端的并发模型进行了优缺点分析。关键词院网络编程;Socket编程;Java语言
file:///C|/Documents and Settings/ITboy/桌面/新建文件夹 (2)/C_Socket网络编程.txt[2010-4-23 0:33:53]1.简单服务器端/*using System.Data;using .Sockets;using ;using System.Threading;private static int port = %%2;private static Thread thThreadRead;private static TcpListener TcpListen;private static bool bListener = true;private static Socket stRead;*/private static void Listen(){ try { TcpListen = new TcpListener(port); TcpListen.Start(); stRead = TcpListen.AcceptSocket(); EndPoint tempRemoteEP = stRead.RemoteEndPoint; IPEndPoint tempRemoteIP = (IPEndPoint)tempRemoteEP; IPHostEntry host = Dns.GetHostByAddress(tempRemoteIP.Address); string sHostName = host.HostName; while (bListener) { stRead.Send(Encoding.ASCII.GetBytes(%%1)); string sTime = DateTime.Now.ToShortTimeString(); Byte[] byRead = new Byte[1024]; int iRead = stRead.ReceiveFrom(byRead, ref tempRemoteEP); Byte[] byText = new Byte[iRead]; Array.Copy(byRead, 0, byText, 0, iRead); string line = System.Text.Encoding.Default.GetString(byRead); } } catch (System.Security.SecurityException) { //监听失败 }}thThreadRead = new Thread(new ThreadStart(Listen));thThreadRead.Start();2.简单客户端/*using System.Data;using .Sockets;using ;private static IPEndPoint dateTimeHost;*/string hostIPString=%%1;string hostPortString=%%2;IPAddress hostIP=IPAddress.Parse(hostIPString);dateTimeHost=new IPEndPoint(hostIP,Int32.Parse(hostPortString));Socket conn=new Socket(AddressFamily.InterNetwork,SocketType.Stream,ProtocolType.Tcp);conn.Connect(dateTimeHost);int bytes=0;file:///C|/Documents and Settings/ITboy/桌面/新建文件夹 (2)/C_Socket网络编程.txt[2010-4-23 0:33:53]Byte[] RecvBytes=new Byte[256];bytes=conn.Receive(RecvBytes,RecvBytes.Length,0);string RecvString=Encoding.ASCII.GetString(RecvBytes,0,bytes);Console.WriteLine(RecvString);conn.Shutdown(SocketShutdown.Both);conn.Close();3.获得本机IP//using ;IPAddress[] addressList = Dns.GetHostByName(Dns.GetHostName()).AddressList;string %%1=null;for (int i = 0; i < addressList.Length; i++){ %%1 += addressList[i].ToString();}4.端对端通信/*using ;using .Sockets;*/UdpClient client=new UdpClient(%%2);IPAddress a=IPAddress.Parse("127001");IPEndPoint receivePoint=new IPEndPoint(a,%%2);IPAddress HostIP=null;byte[] sendData=Encoding.UTF8.GetBytes(%%3);byte[] recData;try{ HostIP=IPAddress.Parse(%%1);}catch { recData=client.Receive(ref receivePoint); %%3=Encoding.UTF8.GetString(recData); client.Send(sendData,sendData.Length,%%4,%%2); client.Close();}IPEndPoint host=new IPEndPoint(HostIP,%%2);recData=client.Receive(ref receivePoint);%%3=Encoding.UTF8.GetString(recData);client.Close();5.点对点通信/*using System.Data;using .Sockets;using ;using System.Threading;*/Thread th;TcpListener tpListen1;bool listenerRun=true;NetworkStream tcpStream;StreamWriter reqStreamW;TcpClient tcpc;Socket skSocket;protected void Listen(){file:///C|/Documents and Settings/ITboy/桌面/新建文件夹 (2)/C_Socket网络编程.txt[2010-4-23 0:33:53] try{ tpListen1=new TcpListener(Int32.Parse(%%2)); tpListen1.Start(); skSocket=tpListen1.AcceptSocket(); EndPoint tempRemoteEP=skSocket.RemoteEndPoint; IPEndPoint tempRemoteIP=(IPEndPoint)tempRemoteEP; IPHostEntry host=Dns.GetHostByAddress(tempRemoteIP.Address); string HostName=host.HostName; while(listenerRun) { Byte[] stream=new Byte[1024]; string time=DateTime.Now.ToString(); int i=skSocket.ReceiveFrom(stream,ref tempRemoteEP); string %%5=Encoding.UTF8.GetString(stream); //指定编码,从缓冲区中解析出内容 //time+" "+HostName+":" } } catch(Security.SecurityException) { //防火墙安全错误! } try{ string sMsg=%%4; string MyName=Dns.GetHostName(); reqStreamW=new StreamWriter(tcpStream); reqStreamW.Write(sMsg); reqStreamW.Flush(); string time=DateTime.Now.ToString(); //显示传送的数据和时间 //time+" "+MyName+":" //sMsg } catch(Exception) { //无法发送信息到目标计算机! } protected override void Dispose(bool disposing) { try{ listenerRun=false; th.Abort(); th=null; tpListen1.Stop(); skSocket.Close(); tcpc.Close(); } catch{} if(disposing && component!=null) { components.Dispose(); } } base.Dispose(disposing);}file:///C|/Documents and Settings/ITboy/桌面/新建文件夹 (2)/C_Socket网络编程.txt[2010-4-23 0:33:53]6.UDP对时服务器端/*using System.Data;using ;using .Sockets;using System.Threading;using System.Text;*/public void start_server(){ while(true) { byte[] recData=server.Receive(ref receivePoint); ASCIIEncoding encode=new ASCIIEncoding(); string Read_str=encode.GetString(recData)); string[] tem=Read_str.Split('/'); byte[] sendData=encode.GetBytes(DataTime.Now.ToString()); server.Send(sendData,sendData.Length,temp[0],Int32.Parse(temp[1])); }}UdpClient server=new UdpClient(%%1);IPEndPoint receivePoint=new IPEndPoint(new IPAddress("127001",%%1);Thread startServer=new Thread(new ThreadStart(start_server));startServer.Start();protected override void Dispose(bool disposing){ try{ startServer.Abort(); server.Close(); } catch{} if(disposing && component!=null) { components.Dispose(); }}base.Dispose(disposing);}7.UDP对时客户端/*using System.Data;using ;using .Sockets;using System.Runtime.InteropServices;*/[DllImport("Kernel32.dll")]private static bool SetSystemTime(SystemTime time);public class SystemTime{ public short year; public short Month; public short DayOfWeek; public short Day; public short Hour; public short Minute;
POCO库中文编程参考指南(7)Poco::Net::DatagramSocket 1 构造函数
创建一个未连接的 IPv4 数据报 Socket: DatagramSocket();
创建一个指定 IP 类型(IPv4 或 IPv6)的数据报 Socket: explicit DatagramSocket(IPAddress::Family family);
创建一个指定 SocketAddress 的数据报 Socket DatagramSocket(const SocketAddress& address, bool reuseAddress = false);
DatagramSocket(const Socket& socket);
/// Creates the DatagramSocket with the SocketImpl
/// from another socket. The SocketImpl must be
/// a DatagramSocketImpl, otherwise an InvalidArgumentException /// will be thrown. 2 重载运算符
DatagramSocket& operator = (const Socket& socket);
/// Assignment operator.
/// /// Releases the socket's SocketImpl and
/// attaches the SocketImpl from the other socket and
/// increments the reference count of the SocketImpl.
3 常用操作
3.1 连接与绑定
void connect(const SocketAddress& address);
C++ socket 编程基础(理论)
对于SOCKET在这里我不想究其历史,我只想说其时它是一种进程通讯的方式,简言之就是调用这个网络库的一些API函数就能实现分布在不同主机的相关进程之间的数据交换.
SOCKET中首先我们要理解如下几个定义概念:
一是IP地址:IP Address我想很容易理解,就是依照TCP/IP协议分配给本地主机的网络地址,就向两个进程要通讯,任一进程要知道通讯对方的位置,位置如何来确定,就用对方的IP
二是端口号:用来标识本地通讯进程,方便OS提交数据.就是说进程指定了对方进程的网络IP,但这个IP只是用来标识进程所在的主机,如何来找到运行在这个主机的这个进程呢,就用端口号.
三是连接:指两个进程间的通讯链路.
四是半相关:网络中用一个三元组可以在全局唯一标志一个进程:
(协议,本地地址,本地端口号)
这样一个三元组,叫做一个半相关,它指定连接的每半部分。
五是全相关
一个完整的网间进程通信需要由两个进程组成,并且只能使用同一种高层协议。也就是说,不可能通信的一端用TCP协议,而另一端用UDP协议。因此一
个完整的网间通信需要一个五元组来标识:
(协议,本地地址,本地端口号,远地地址,远地端口号)
这样一个五元组,叫做一个相关(association),即两个协议相同的半相关才能组合成一个合适的相关,或完全指定组成一连接。
客户/服务器模式
在TCP/IP网络应用中,通信的两个进程间相互作用的主要模式是客户/服务器模式(Client/Server model),即客户向服务器发出服务请求,服务器接收到请求后,提供相应的服务。客户/服务器模式的建立基于以下两点:首先,建立网络的起因是网络中软硬件资源、运算能力和信息不均等,需要共享,从而造就拥有众多资源的主机提供服务,资源较少的客户请求服务这一非对等作用。其次,网间进程通信完全是异步的,相互通信的进程间既不存在父子关系,又不共享内存缓冲区,因此需要一种机制为希望通信的进程间建立联系,为二者的数据交换提供同步,这就是基涌纪纪户/服务器模式的TCP/IP。