c#学习之Socket网络编程
我是新手以前没写过博客 希望大家勿喷,
在编写Socket的时候需要导入System.Net.Socket 命名空间。利用该类我们可以直接编写Socket的客户端和服务的的程序了,
这里我们只讲tpc协议下的Socket编程。
TCP Socket连接的过程可以简单的分为:①.服务端监听 ②.客户端请求 ③.建立连接,
在服务端:
(1)声明一个套接字(称为监听套接字)Socket serverSocket = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);
(2)声明一个端点(EndPoint)上面提到过Socket需要跟它绑定才能通信。IPEndPoint endPoint = new IPEndPoint(IPAddress.Loopback, 8080);
(3)设置监听队列serverSocket.Listen(100);
(4)通过Accept()方法来获取一个通信套接字(当有客户端连接时),这个方法会阻塞线程,避免界面卡死的现象,启动一个线程,把这个Accept()放在线程函数里面。
在客户端:
(1)声明一个套接字,通过connect()向服务器发起连接。
(2)通过Receive方法获取服务器发来的消息(这里同样启用一个线程,通过while循环来实时监听服务器端发送的消息)
注意:数据是以字节流(Byte[])的形式传递的,我会使用Encoding.UTF8.GetString()方法来获取为字符串。都是通过Send()来向彼此发送消息。
下面我们通过直接使用Socket类来构建一个简单的Socket应用程序,直接上代码吧 这是服务端代码。。

using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Net;
using System.Net.Sockets;
using System.Text;
using System.Threading;
using System.Threading.Tasks;
using System.Windows.Forms;
using System.IO; namespace WindowsFormsApplication1
{
public partial class Form1 : Form
{
public Form1()
{
InitializeComponent();
} private void button1_Click(object sender, EventArgs e)
{ Socket s = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);
IPAddress ip = IPAddress.Any;
IPEndPoint duan = new IPEndPoint(ip, ); s.Bind(duan);
textBox3.Text = "监听成功\n";
//设置在同一时间点内连接的数量
s.Listen(); //等待用户连接
Thread t = new Thread(A);
t.IsBackground = true;
t.Start(s); }
Socket socketsend;
Dictionary<string, Socket> dic = new Dictionary<string, Socket>();
void A(object o)
{
while (true)
{
Socket s = o as Socket;
socketsend = s.Accept();
string name = socketsend.RemoteEndPoint.ToString();
dic.Add(name, socketsend);
comboBox1.Items.Add(name);
textBox3.AppendText("连接成功\n" + name + "\n");
Thread tt = new Thread(b);
tt.Start(socketsend); }
} private void Form1_Load(object sender, EventArgs e)
{
Control.CheckForIllegalCrossThreadCalls = false;
}
public void b(object oo)
{
Socket socketsend = oo as Socket;
while (true)
{
byte[] b = new byte[ * * ];
int a = socketsend.Receive(b); if (a == )
{ break;
}
string receive = Encoding.Default.GetString(b, , a);
textBox3.AppendText(receive + "\n");
}
} private void button2_Click(object sender, EventArgs e)
{
byte[] by= System.Text.Encoding.Default.GetBytes(textBox4.Text);
List<byte> b = new List<byte>();
b.Add();
b.AddRange(by);
byte []cc= b.ToArray();
dic[comboBox1.SelectedItem.ToString()].Send(cc);
//socketsend.Send(by);
} private void button3_Click(object sender, EventArgs e)
{
OpenFileDialog dialog = new OpenFileDialog();
dialog.Title = "请选择文件";
dialog.InitialDirectory = @"C:\Users\PC\Desktop";
dialog.Filter = "所有文件|*.*";
dialog.ShowDialog();
string name= dialog.FileName;
textBox5.Text = name; } private void button5_Click(object sender, EventArgs e)
{
using (FileStream f = new FileStream(textBox5.Text, FileMode.Open, FileAccess.Read))
{
byte[] b = new byte[ * * ];
int r = f.Read(b, , b.Length);
List<byte> list = new List<byte>();
list.Add();
list.AddRange(b);
byte[] newby = list.ToArray();
dic[comboBox1.SelectedItem.ToString()].Send(newby, , r + , SocketFlags.None);
}
} private void button4_Click(object sender, EventArgs e)
{
byte[] a = new byte[];
a[] = ;
dic[comboBox1.SelectedItem.ToString()].Send(a);
} }
}

下面是客户端代码。。
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;
using System.Net.Sockets;
using System.Net;
using System.Threading;
using System.IO; namespace WindowsFormsC
{
public partial class Form1 : Form
{
public Form1()
{
InitializeComponent();
}
Socket ss;
private void button1_Click(object sender, EventArgs e)
{ ss = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);
IPAddress ip = IPAddress.Parse(textBox1.Text);
IPEndPoint duan = new IPEndPoint(ip, Convert.ToInt32( textBox2.Text));
ss.Connect(duan);
a("连接服务端成功");
Thread t = new Thread(b);
t.Start(); }
void b()
{
while (true)
{
byte[] cc = new byte[ * * ];
int ac = ss.Receive(cc);
if (ac == )
{
break;
}
if (cc[]==)
{ a(Encoding.Default.GetString(cc,, ac-));
//0 a length }
else if (cc[]==)
{
SaveFileDialog dia = new SaveFileDialog();
dia.Title = "请保存文件";
dia.InitialDirectory = @"C:\Users\PC\Desktop";
dia.Filter = "所有文件|*.*";
dia.ShowDialog(this); using (FileStream s=new FileStream (dia.FileName,FileMode.OpenOrCreate,FileAccess.Write))
{
s.Write(cc,,ac-);
MessageBox.Show("保存成功","提示");
} }
else if (cc[]==)
{
for (int i = ; i < ; i++)
{
this.Location = new Point(, );
this.Location = new Point(, ); } } } }
void a(string name)
{
textBox3.AppendText(name + "\t\n");
} private void button2_Click(object sender, EventArgs e)
{
byte[] v = Encoding.Default.GetBytes(textBox4.Text); ss.Send(v);
} private void Form1_Load(object sender, EventArgs e)
{
Control.CheckForIllegalCrossThreadCalls = false;
}
}
}

小程序的功能可以发消息,震动,传输文件、、。。。
大家可以加 编程学习交流 qq群 68363936~!!!
c#学习之Socket网络编程的更多相关文章
- Python学习之==>Socket网络编程
一.计算机网络 多台独立的计算机通过网络通信设备连接起来的网络.实现资源共享和数据传递.在同一台电脑上可以将D盘上的一个文件传到C盘,但如果想从一台电脑传一个文件到另外一台电脑上就要通过计算机网络 二 ...
- Linux学习 : Socket 网络编程入门
一.socket()函数 int socket(int domain, int type, int protocol); domain:即协议域,又称为协议族(family).常用的协议族有,AF_I ...
- Socket网络编程--Libev库学习(1)
这一节是安装篇. Socket网络编程不知不觉已经学了快两个月了.现在是时候找个网络库学学了.搜索了很多关于如何学网络编程的博客和问答.大致都是推荐学一个网络库,至于C++网络库有那么几个,各有各的好 ...
- Linux Socket 网络编程
Linux下的网络编程指的是socket套接字编程,入门比较简单.在学校里学过一些皮毛,平时就是自学玩,没有见识过真正的socket编程大程序,比较遗憾.总感觉每次看的时候都有收获,但是每次看完了之后 ...
- Python Socket 网络编程
Socket 是进程间通信的一种方式,它与其他进程间通信的一个主要不同是:它能实现不同主机间的进程间通信,我们网络上各种各样的服务大多都是基于 Socket 来完成通信的,例如我们每天浏览网页.QQ ...
- Python全栈【Socket网络编程】
Python全栈[socket网络编程] 本章内容: Socket 基于TCP的套接字 基于UDP的套接字 TCP粘包 SocketServer 模块(ThreadingTCPServer源码剖析) ...
- python之Socket网络编程
什么是网络? 网络是由节点和连线构成,表示诸多对象及其相互联系.在数学上,网络是一种图,一般认为专指加权图.网络除了数学定义外,还有具体的物理含义,即网络是从某种相同类型的实际问题中抽象出来的模型.在 ...
- Python之路【第七篇】python基础 之socket网络编程
本篇文章大部分借鉴 http://www.cnblogs.com/nulige/p/6235531.html python socket 网络编程 一.服务端和客户端 BS架构 (腾讯通软件:ser ...
- Socket网络编程(2)--服务端实现
中秋了,首先祝大家中秋快乐,闲着无事在家整一个socket的聊天程序,有点仿QQ界面,就是瞎折腾,不知道最后是不是能将所有功能实现. 如果你对socket不了解,请看这篇文章:http://www.c ...
随机推荐
- ASPxGridView中DetailRow的使用
ASPxGridView是一个方便的数据显示控件,可是自动的绑定我们所需要的数据,但是有时,当数据属性过多时,我们并不一定要把所有的信息提供给所有的人,当有人需要这些数据时可以自动的进行查看,这时就可 ...
- 如何构建日均千万PV Web站点
http://www.cnblogs.com/xiaocen/p/3723839.html http://www.cnblogs.com/xiaocen/p/3726763.html http://w ...
- C++学习50 对字符串流的读写
文件流是以外存文件为输入输出对象的数据流,字符串流不是以外存文件为输入输出的对象,而以内存中用户定义的字符数组(字符串)为输入输出的对象,即将数据输出到内存中的字符数组,或者从字符数组(字符串)将数据 ...
- [Flash&Flex] AS3.0 如何利用[Embed(source="...")]嵌入资源
在flex和flashIDE中我们可以[Embed(source="...")]嵌入图片和swf等资源,但两者之间的嵌入方式又有所区别. flex示例: [Embed(source ...
- delphi TServerSocket阻塞线程单元 实例
TServerSocket阻塞线程单元,希望对你有所帮助.需要注意的是:1.如果你使用TServerSocket的stNonBlocking模式,重写TServerClientThread线程时要重载 ...
- 光流算法:Brox光流的OpenCV源码解析
OpenCV中DeepFlow代码其实是Brox光流,而非真正的DeepFlow光流,在将近一个月的研究.移植及优化过程中,对Brox光流有了较深刻的认识.我对OpenCV中源码进行了详细的分析,并以 ...
- oracle错误处理及实操-【INS-20802】
服务器硬件要求:内存>1GB,如果是虚拟机,必须设置内存为1.5G以上. 确定好主机名,安装完成以后,不要再修改主机名,一旦修改会导致oracle启动失败,注意:使用默认的localhost.l ...
- 基于Web的企业网和互联网的信息和应用( 1194.22 )
基于Web的企业网和互联网的信息和应用( 1194.22 ) 原文更新日期: 2001年6月21日原文地址: http://www.access-board.gov/sec508/guide/1194 ...
- org.springframework.core.NestedIOException
今天遇到的一个小异常,报错信息如下: 2013-11-13 10:00:32 org.apache.catalina.core.StandardContext listenerStart严重: Exc ...
- 把数组转换成sql中能使用的字符串
1.数组对象转换成字符串,拼接成符合sql语句的语法 2.代码如下例子 public static void testString(){ String[] str=new String[ ...