Soket编程
是一种面向连接的Socket,针对于面向连接的TCP服务应用,安全,但是效率低
是一种无连接的Socket,对应于无连接的UDP服务应用.不安全(丢失,顺序混乱,在接收端要分析重排及要求重发),但效率高.
1.服务端welcoming socket 开始监听端口(负责监听客户端连接信息)
2.客户端client socket连接服务端指定端口(负责接收和发送服务端消息)
3.服务端welcoming socket 监听到客户端连接,创建connection 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编程的更多相关文章
- DELPHI SOKET 编程(使用TServerSocket和TClientSocket) 转
http://www.cnblogs.com/findumars/p/5272658.html 本文采用delphi7+TServerSocket+TClientSocket; 笔者在工作中遇到对 ...
- DELPHI SOKET 编程(使用TServerSocket和TClientSocket)
本文采用delphi7+TServerSocket+TClientSocket; 笔者在工作中遇到对局域网中各工作站与服务器之间进行Socket通信的问题.现在将本人总结出来的TServerSocke ...
- DELPHI SOKET 编程--使用TServerSocket和TClientSocket
本文采用delphi7+TServerSocket+TClientSocket; 笔者在工作中遇到对局域网中各工作站与服务器之间进行Socket通信的问题.现在将本人总结出来的TServerSocke ...
- Python socket编程之一:
soket 编程步骤 # -*- coding: utf-8 -*- ################################################################# ...
- .Net程序猿需掌握的知识
作为一个.Net的技术人员需要掌握的技术,当然,理解这些知识点并不能让你学会.NET开发. 但能够衡量你是否有着走出校门的能力,也算是给自己留一个知识的储备库吧. 共勉! 基础知识: 数据类型 变量 ...
- 计算机网络课设之基于UDP协议的简易聊天机器人
前言:2017年6月份计算机网络的课设任务,在同学的帮助和自学下基本搞懂了,基于UDP协议的基本聊天的实现方法.实现起来很简单,原理也很简单,主要是由于老师必须要求使用C语言来写,所以特别麻烦,而且C ...
- socket-遇到一枚假程序员
1. 一脸懵比 今天又偶然看到socket,对socket有点简单的概念,知道是网络编程.客户端与服务端通信等,但是不是太了解,就随便搜了下,几千万条记录,随便点开看了几页,socket跟网络编程也是 ...
- C# Winform Soket 网络编程 多个客户端连接服务器并返回客户端操作请求
2017.8.2 服务器: #region 参数与集合 /// <summary> /// 客户端IP /// </summary> string clientIP; /// ...
- Python(七)Socket编程、IO多路复用、SocketServer
本章内容: Socket IO多路复用(select) SocketServer 模块(ThreadingTCPServer源码剖析) Socket socket通常也称作"套接字" ...
随机推荐
- git 创建版本库
服务器安装后git后 1.在repositories仓库文件夹中执行git init aa.git --bare 创建aa的中心库(注意建立aa版本库时当前登录用户必须为git的相关用户,并保证/d ...
- Mobiscroll 3.0 官方同步版
Mobiscroll 3.0 官方同步版发布了. Mobiscroll是一个用于触摸设备的日期和时间选择器,它的使用不会改变HTML5.PhoneGap以及混合应用的原生用户体验.作为一款jQuery ...
- sqoop的export导入到oracle中
- 设置类型Double小数点位数
Double amount = 100;DecimalFormat dcmFmt = new DecimalFormat("0.0000"); String amountStr = ...
- C++虚函数的实现机制示例
C++虚函数的实现机制是通过一个vtable表,指向子类的虚函数地址. 另外,如果不是虚函数,则不能实现用父类引用调用子类方法. #include <windows.h> #include ...
- 动手实现自己的 STL 容器 《1》---- vector
本文参考了侯捷的 <STL 源码分析>一书,出于兴趣,自行实现了简单的 vector 容器. 之后会陆续上传 list, deque 等容器的代码,若有错误,欢迎留言指出. vector ...
- codeforces 446B(优先队列)
题目链接:http://codeforces.com/problemset/problem/446/B #include<bits/stdc++.h> using namespace st ...
- c++类的声明和对象的定义---10
原创博客:转载请标明出处:http://www.cnblogs.com/zxouxuewei/ 类是创建对象的模板,一个类可以创建多个对象,每个对象都是类类型的一个变量:创建对象的过程也叫类的实例化. ...
- C语言实现Web客户端(转-kungstriving)
和我的上一篇文章是一起写的,呵呵,大家给提点意见啊. :-) /*********filename : Client.cpp**************** 该程序通过标准socket实 ...
- Python 爬虫学习 urllib2
用urllib2抓取被限制的网站页面 # coding:utf-8 import urllib2 url = "http://blog.csdn.net/troubleshooter&quo ...