基本概念
lIP地址
  每台联网的电脑都有一个唯一的IP地址。
  长度32位,分为四段,每段8位,用十进制数字表示,每段范围 0 ~ 255
  特殊IP:127.0.0.1 用户本地网卡测试
  版本:V4(32位) 和 V6(128位,分为8段,每段16位)
l端口
  在网络上有很多电脑,这些电脑一般运行了多个网络程序。每种网络程序都打开一个Socket,并绑定到一个端口上,不同的端口对应于不同的网络程序。
  常用端口:21 FTP  ,25 SMTP  ,110 POP3  ,80 HTTP , 443 HTTPS
  有两种常用Socket类型:
流式Socket(STREAM):
  是一种面向连接的Socket,针对于面向连接的TCP服务应用,安全,但是效率低
数据报式Socket(DATAGRAM):
  是一种无连接的Socket,对应于无连接的UDP服务应用.不安全(丢失,顺序混乱,在接收端要分析重排及要求重发),但效率高.
 
Socket流式

1.服务端welcoming socket 开始监听端口(负责监听客户端连接信息)
2.客户端client socket连接服务端指定端口(负责接收和发送服务端消息)
3.服务端welcoming socket 监听到客户端连接,创建connection socket。(负责和客户端通信)

l服务器端的Socket(至少需要两个)
  一个负责接收客户端连接请求(但不负责与客户端通信)
  每成功接收到一个客户端的连接便在服务端产生一个对应的负责通信的Socket
  在接收到客户端连接时创建.
  为每个连接成功的客户端请求在服务端都创建一个对应的Socket(负责和客户端通信).
客户端的Socket
  客户端Socket
  必须指定要连接的服务端IP地址和端口。
  通过创建一个Socket对象来初始化一个到服务器端的TCP连接

Socket的通讯过程:

服务器端:
  申请一个socket
  绑定到一个IP地址和一个端口上
  开启侦听,等待接授连接
客户端:
  申请一个socket
  连接服务器(指明IP地址和端口号)
  服务器端接到连接请求后,产生一个新的socket(端口大于1024)与客户端建立连接并进行通讯,原监听socket继续监听。
Socket的方法:
相关类
  IPAddress类:包含了一个IP地址
  IPEndPoint类:包含了一对IP地址和端口号
方法
  Socket (): 创建一个Socket
  Bind(): 绑定一个本地的IP和端口号(IPEndPoint)
  Listen(): 让Socket侦听传入的连接尝试,并指定侦听队列容量
  Connect(): 初始化与另一个Socket的连接
  Accept(): 接收连接并返回一个新的socket
  Send(): 输出数据到Socket
  Receive(): 从Socket中读取数据
  Close(): 关闭Socket (销毁连接)
 
 
Socket简单代码示例《聊天室》:
服务端:
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms; using System.Net.Sockets;
using System.Net;
using System.Threading; namespace C03聊天室服务端
{
public partial class Form1 : Form
{
public Form1()
{
InitializeComponent();
//在多线程程序中,新创建的线程不能访问UI线程创建的窗口控件,如果需要访问窗口中的控件,可以在窗口构造函数中将CheckForIllegalCrossThreadCalls设置为 false
TextBox.CheckForIllegalCrossThreadCalls = false;
} //服务端 监听套接字
Socket sokWatch = null;
//服务端 监听线程
Thread thrWatch = null;
//字典集合:保存 通信套接字
Dictionary<string, Socket> dictCon = new Dictionary<string, Socket>(); private void btnStartListen_Click(object sender, EventArgs e)
{
//1.创建监听套接字 使用 ip4协议,流式传输,TCP连接
sokWatch = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);
//2.绑定端口
//2.1获取网络节点对象
IPAddress address = IPAddress.Parse(txtIP.Text);
IPEndPoint endPoint = new IPEndPoint(address, int.Parse(txtPort.Text));
//2.2绑定端口(其实内部 就向系统的 端口表中 注册 了一个端口,并指定了当前程序句柄)
sokWatch.Bind(endPoint);
//2.3设置监听队列
sokWatch.Listen();
//2.4开始监听,调用监听线程 执行 监听套接字的 监听方法 注:因为监听消息方法会阻断线程,所以需要创建新的线程
thrWatch = new Thread(WatchConnecting);
thrWatch.IsBackground = true;
thrWatch.Start();
ShowMsg("服务器启动啦~~!");
} void WatchConnecting()
{
//2.4开始监听:此方法会阻断当前线程,直到有 其它程序 连接过来,才执行完毕
Socket sokMsg = sokWatch.Accept(); //将当前连接成功的 【与客户端通信的套接字】 的 标识 保存起来,并显示到 列表中
//将 远程客户端的 ip和端口 字符串 存入 列表
lbOnline.Items.Add(sokMsg.RemoteEndPoint.ToString());
//将 服务端的通信套接字 存入 字典集合
dictCon.Add(sokMsg.RemoteEndPoint.ToString(), sokMsg); ShowMsg("有客户端连接了~~!");
//2.5创建 通信线程 注:因为接受消息方法会阻断线程,所以必须穿件新的线程进行消息接受
Thread thrMsg = new Thread(ReceiveMsg);
thrMsg.IsBackground = true;
thrMsg.Start(sokMsg);
} bool isReceive = true;
void ReceiveMsg(object obj)
{
Socket sokMsg = obj as Socket;
//3.通信套接字 监听 客户端的 消息
//3.1创建 消息缓存区
byte[] arrMsg = new byte[ * * ];
while (isReceive)
{
//3.2接收客户端的消息 并存入 缓存区,
//注意:Receive方法也会阻断当前的线程
sokMsg.Receive(arrMsg);
//3.3将接收到的消息 转成 字符串
string strMsg = System.Text.Encoding.UTF8.GetString(arrMsg);
//3.4将消息 显示到 文本框
ShowMsg(strMsg);
}
} void ShowMsg(string strmsg)
{
this.txtShow.AppendText(strmsg + "\r\n");
} private void btnSend_Click(object sender, EventArgs e)
{
string strOnline = "";
if (lbOnline.SelectedItem==null)
{
MessageBox.Show("请选择要回复的客户端");
}
else
{
strOnline = lbOnline.SelectedItem.ToString();
string strMsg = txtInput.Text.Trim().ToString();
if (dictCon.ContainsKey(strOnline))
{
ShowMsg("向客户端[" + strOnline + "]说:\r\n");
//3.通信套接字 监听 客户端的 消息
//3.3将接收到的消息 转成 字符串
byte[] arrMsg = System.Text.Encoding.UTF8.GetBytes(strMsg);
dictCon[strOnline].Send(arrMsg);
}
}
}
}
}

客户端:

using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms; using System.Net.Sockets;
using System.Net;
using System.Threading; namespace C04聊天室客户端
{
public partial class Form1 : Form
{
public Form1()
{
InitializeComponent();
//在多线程程序中,新创建的线程不能访问UI线程创建的窗口控件,如果需要访问窗口中的控件,可以在窗口构造函数中将CheckForIllegalCrossThreadCalls设置为 false
TextBox.CheckForIllegalCrossThreadCalls = false;
}
Socket sokMsg = null;
private void btnConnect_Click(object sender, EventArgs e)
{
//1.创建监听套接字 使用 ip4协议,流式传输,TCP连接
sokMsg = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);
//2.获取要连接的服务端 节点
//2.1获取网络节点对象
IPAddress address = IPAddress.Parse(txtIP.Text);
IPEndPoint endPoint = new IPEndPoint(address, int.Parse(txtPort.Text));
//3.向服务端 发送链接请求
sokMsg.Connect(endPoint);
ShowMsg("服务器连接成功"); Thread threceive = new Thread(Receives);
threceive.IsBackground = true;
threceive.Start();
} bool strtype = true;
void Receives()
{ //3.1创建 消息缓存区
byte[] arrMsg = new byte[ * * ];
while (strtype)
{ sokMsg.Receive(arrMsg);
//3.3将接收到的消息 转成 字符串
string strMsg = System.Text.Encoding.UTF8.GetString(arrMsg);
ShowMsg("服务器说:" + strMsg + "\r\n");
} } void ShowMsg(string strmsg)
{
this.txtShow.AppendText(strmsg + "\r\n");
}
private void btnSend_Click(object sender, EventArgs e)
{
string strMsg = txtInput.Text.Trim();
byte[] arrMsg = System.Text.Encoding.UTF8.GetBytes(strMsg);
sokMsg.Send(arrMsg);
}
}
}
 
 
 

服务端页面:

客户端页面:

Soket编程的更多相关文章

  1. DELPHI SOKET 编程(使用TServerSocket和TClientSocket) 转

    http://www.cnblogs.com/findumars/p/5272658.html   本文采用delphi7+TServerSocket+TClientSocket; 笔者在工作中遇到对 ...

  2. DELPHI SOKET 编程(使用TServerSocket和TClientSocket)

    本文采用delphi7+TServerSocket+TClientSocket; 笔者在工作中遇到对局域网中各工作站与服务器之间进行Socket通信的问题.现在将本人总结出来的TServerSocke ...

  3. DELPHI SOKET 编程--使用TServerSocket和TClientSocket

    本文采用delphi7+TServerSocket+TClientSocket; 笔者在工作中遇到对局域网中各工作站与服务器之间进行Socket通信的问题.现在将本人总结出来的TServerSocke ...

  4. Python socket编程之一:

    soket 编程步骤 # -*- coding: utf-8 -*- ################################################################# ...

  5. .Net程序猿需掌握的知识

    作为一个.Net的技术人员需要掌握的技术,当然,理解这些知识点并不能让你学会.NET开发. 但能够衡量你是否有着走出校门的能力,也算是给自己留一个知识的储备库吧. 共勉! 基础知识: 数据类型 变量 ...

  6. 计算机网络课设之基于UDP协议的简易聊天机器人

    前言:2017年6月份计算机网络的课设任务,在同学的帮助和自学下基本搞懂了,基于UDP协议的基本聊天的实现方法.实现起来很简单,原理也很简单,主要是由于老师必须要求使用C语言来写,所以特别麻烦,而且C ...

  7. socket-遇到一枚假程序员

    1. 一脸懵比 今天又偶然看到socket,对socket有点简单的概念,知道是网络编程.客户端与服务端通信等,但是不是太了解,就随便搜了下,几千万条记录,随便点开看了几页,socket跟网络编程也是 ...

  8. C# Winform Soket 网络编程 多个客户端连接服务器并返回客户端操作请求

    2017.8.2 服务器: #region 参数与集合 /// <summary> /// 客户端IP /// </summary> string clientIP; /// ...

  9. Python(七)Socket编程、IO多路复用、SocketServer

    本章内容: Socket IO多路复用(select) SocketServer 模块(ThreadingTCPServer源码剖析) Socket socket通常也称作"套接字" ...

随机推荐

  1. 《Java中的不可变类》

    //不可变类举例: /* 下面程序试图定义一个不可变类Person类,但=因为Person类包含一个引用类型的成员变量, 且这个引用类是可变类,所以导致Person类也变成了可变类. */ class ...

  2. js---html---body标签

    <body bgcolor="背景颜色" background="背景图片" text="文本颜色" link="连接文件颜 ...

  3. Linux的yum源的配置

    yum实际上是管理的rpm软件包 只要连接网络就可以使用在线的yum源,不用配置本地yum源 网络yum源/etc/yum.repos.d/fedora.repo(Fedora)[fedora]nam ...

  4. 三部曲一(搜索、数学)-1016-Code

    Code Time Limit : 2000/1000ms (Java/Other)   Memory Limit : 60000/30000K (Java/Other) Total Submissi ...

  5. EntityFramework 基础的crud

    EntityFramework 基础的crud操作 根据上一张实体映射的demo学习基础的crud操作 1.增加 BlogDbContext dbContext = new BlogDbContext ...

  6. div弹出层的效果带关闭按钮

    下面我做的这个是个进度条的弹出层 <style type="text/css"> #tuxiang { width: 57px; } /*div弹出框的css*/ .t ...

  7. 2015GitWebRTC编译实录10

    2015.07.20 rtc_p2p编译通过[879/1600 ] CXX obj /webrtc/p2p/client/rtc_p2p.httpportallocator.o[880/1600 ] ...

  8. Android——数据库相关(课堂整理)

    layout文件: <?xml version="1.0" encoding="utf-8"?> <LinearLayout xmlns:an ...

  9. [cyber security][php]pfSense目录遍历漏洞分析

    0×00 导言 pfSense是一个基于FreeBSD,专为防火墙和路由器功能定制的开源版本. 在本文中,我们将向大家介绍在pfSense的2.1.3以及更低版本中的CVE-2014-4690漏洞:对 ...

  10. (转) 坚持完成这套学习手册,你就可以去 Google 面试了

      坚持完成这套学习手册,你就可以去 Google 面试了 系统 指针 value Google 面试 阅读6138    本文为掘金投稿,译文出自:掘金翻译计划 原文地址:Google Interv ...