本文实例讲述了C#中Socket通信用法。分享给大家供大家参考。具体如下:
一、UDP方式:
服务器端代码:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
|
static void Main( string [] args)
{
int recv;
byte [] data = new byte [1024];
IPEndPoint ipep = new IPEndPoint(IPAddress.Any, 9050); //定义一网络端点
Socket newsock = new Socket(AddressFamily.InterNetwork, SocketType.Dgram, ProtocolType.Udp); //定义一个Socket
newsock.Bind(ipep); //Socket与本地的一个终结点相关联
Console.WriteLine( "Waiting for a client.." );
IPEndPoint sender = new IPEndPoint(IPAddress.Any, 0); //定义要发送的计算机的地址
EndPoint Remote = (EndPoint)(sender); //
recv = newsock.ReceiveFrom(data, ref Remote); //接受数据
Console.WriteLine( "Message received from{0}:" , Remote.ToString());
Console.WriteLine(Encoding.ASCII.GetString(data, 0, recv));
string welcome = "Welcome to my test server!" ;
data = Encoding.ASCII.GetBytes(welcome);
newsock.SendTo(data, data.Length, SocketFlags.None, Remote);
while ( true )
{
data = new byte [1024];
recv = newsock.ReceiveFrom(data, ref Remote);
Console.WriteLine(Encoding.ASCII.GetString(data, 0, recv));
newsock.SendTo(data, recv, SocketFlags.None, Remote);
}
}
|
客户端代码:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
|
void MainInfo()
{
byte [] data = new byte [1024]; //定义一个数组用来做数据的缓冲区
string input, stringData;
IPEndPoint ipep = new IPEndPoint(IPAddress.Parse( "192.168.1.21" ), 9050);
Socket server = new Socket(AddressFamily.InterNetwork, SocketType.Dgram, ProtocolType.Udp);
string welcome = "Hello,are you there?" ;
data = Encoding.ASCII.GetBytes(welcome);
server.SendTo(data, data.Length, SocketFlags.None, ipep); //将数据发送到指定的终结点
IPEndPoint sender = new IPEndPoint(IPAddress.Any, 0);
EndPoint Remote = (EndPoint)sender;
data = new byte [1024];
int recv = server.ReceiveFrom(data, ref Remote); //接受来自服务器的数据
Console.WriteLine( "Message received from{0}:" , Remote.ToString());
Console.WriteLine(Encoding.ASCII.GetString(data, 0, recv));
while ( true ) //读取数据
{
input = richTextBox1.Text; //从键盘读取数据
if (input == "text" ) //结束标记
{
break ;
}
server.SendTo(Encoding.ASCII.GetBytes(input), Remote); //将数据发送到指定的终结点Remote
data = new byte [1024];
recv = server.ReceiveFrom(data, ref Remote); //从Remote接受数据
stringData = Encoding.ASCII.GetString(data, 0, recv);
Console.WriteLine(stringData);
}
Console.WriteLine( "Stopping client" );
server.Close();
}
|
二、TCP方式:
服务器端代码:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
|
Socket serverSocket = null ;
Thread clientThread = null ;
Socket clientSocket = null ;
Thread thread = null ;
IPAddress ips = null ;
PEndPoint ipep = null ;
void ServerStart()
{
ips = Dns.GetHostAddresses(Dns.GetHostName())[0];
//创建IPEndPoint实例
ipep = new IPEndPoint(ips, 9050);
//创建一个套接字
serverSocket = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);
serverSocket.SetSocketOption(SocketOptionLevel.Socket, SocketOptionName.ReuseAddress, true );
//将所创建的套接字与IPEndPoint绑定
serverSocket.Bind(ipep);
//设置套接字为收听模式
serverSocket.Listen(20);
while (listenalive)
{
try
{
//在套接字上接收接入的连接
clientSocket = serverSocket.Accept();
clientThread = new Thread( new ParameterizedThreadStart(ReceiveData));
clientThread.Start(clientSocket);
}
catch (Exception ex)
{
WriteErrorLog(ex.Message);
serverSocket.Close();
serverSocket = null ;
}
}
}
static void ReceiveData( object obj)
{
bool keepalive = true ;
Socket s = obj as Socket;
Byte[] buffer = new Byte[1024];
//根据收听到的客户端套接字向客户端发送信息
IPEndPoint clientep = (IPEndPoint)s.RemoteEndPoint;
Console.WriteLine( "客户端ip:" + clientep.Address + " 端口:" + clientep.Port);
string welcome = "连接服务器成功" ;
buffer = System.Text.Encoding.Unicode.GetBytes(welcome);
//向客户端发送“连接服务器成功”消息
s.Send(buffer, buffer.Length, SocketFlags.None);
buffer = new Byte[1024];
int bufLen = 0;
string content = string .Empty;
while ( true )
{
//在套接字上接收客户端发送的信息
bufLen = 0;
try
{
bufLen = s.Receive(buffer);
if (bufLen == 0)
{
break ;
}
content += System.Text.Encoding.Unicode.GetString(buffer, 0, bufLen);
}
catch (Exception ex)
{
break ; ;
}
}
Send(s, content);
s = null ;
buffer = null ;
clientep = null ;
Thread.CurrentThread.Abort();
}
|
客户端代码:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
|
void Send( string content)
{
byte [] data = new byte [1024];
newclient = new System.Net.Sockets.Socket(System.Net.Sockets.AddressFamily.InterNetwork, System.Net.Sockets.SocketType.Stream, System.Net.Sockets.ProtocolType.Tcp);
ie = new System.Net.IPEndPoint(System.Net.IPAddress.Parse(ipadd), port); //服务器的IP和端口
try
{
//因为客户端只是用来向特定的服务器发送信息,所以不需要绑定本机的IP和端口。不需要监听。
newclient.Connect(ie);
}
catch (System.Net.Sockets.SocketException e)
{
Console.WriteLine(e.ToString());
return ;
}
int recv = newclient.Receive(data);
//连接服务器成功
string stringdata = System.Text.Encoding.Unicode.GetString(data, 0, recv);
if (stringdata == "连接服务器成功" )
{
newclient.Send(System.Text.Encoding.Unicode.GetBytes(content));
newclient.Shutdown(System.Net.Sockets.SocketShutdown.Send);
data = new byte [1024];
recv = newclient.Receive(data);
string result = System.Text.Encoding.Unicode.GetString(data, 0, recv);
newclient.Shutdown(System.Net.Sockets.SocketShutdown.Receive);
newclient.Close();
MessageBox.Show(result);
}
else
{
MessageBox.Show( "连接服务器失败" , "友情提示" );
}
}
|
希望本文所述对大家的C#程序设计有所帮助。