

以下代码来自SIKI学院:
服务器端:
using
System;
using
System.Net.Sockets;
using
System.Net;
namespace
tcpconnect
{
class
MainClass
{
public
static
void
Main
(
string
[] args)
{
Socket
serverSocket =
new
Socket
(
AddressFamily
.
InterNetwork
,
SocketType
.
Stream
,
ProtocolType
.
Tcp
);
// 172.18.32.163 172.0.0.1
//绑定IP
//不推荐,注意数字之间为逗号
//IPAddress ipadress = new IPAddress (new byte[]{172,18,32,163});
IPAddress
ipadress =
IPAddress
.
Parse
(
"172.18.32.163"
);
//创建端口号
IPEndPoint
ipEndPoint =
new
IPEndPoint
(ipadress,
88
);
//绑定端口号
serverSocket.
Bind
(ipEndPoint);
//开始监听(对列为50个,参数为0是无数个,考虑性能50个)
serverSocket.
Listen
(
50
);
//为当前客户端建立服务器连接
Socket
clientSocket = serverSocket.
Accept
();
//测试消息
string
msg =
"hello你好"
;
//中文处理(byte传输)
byte
[] data = System.Text.
Encoding
.
UTF8
.
GetBytes
(msg);
//向客户端发消息
clientSocket.
Send
(data);
//接收客户端消息
byte
[] databuffer =
new
byte
[
1024
] ;
//数据byte个数
int
count = clientSocket.
Receive
(databuffer);
//将数据从0到count转为字符串
string
msgReceive = System.Text.
Encoding
.
UTF8
.
GetString
(databuffer,
0
,count);
//打印
Console
.
WriteLine
(msgReceive);
//关闭与当前客户端的连接
clientSocket.
Close
();
//关闭服务器连接
serverSocket.
Close
();
客户端:
using
System;
using
System.Net.Sockets;
using
System.Net;
using
System.Text;
namespace
TCPClient
{
class
MainClass
{
public
static
void
Main
(
string
[] args)
{
//创建一个socket接口
Socket
clientSocket =
new
Socket
(
AddressFamily
.
InterNetwork
,
SocketType
.
Stream
,
ProtocolType
.
Tcp
);
//与服务器进行连接(注意不要写错)
clientSocket.
Connect
(
new
IPEndPoint
(
IPAddress
.
Parse
(
"172.18.32.163"
),
88
));
//创建一个数组用于接收来自服务器的消息
byte
[] data =
new
byte
[
1024
] ;
//接收来自服务器的消息(接收不到程序会一直停在这里接收,指导接收到为止)
int
count = clientSocket.
Receive
(data);
//字节转字符串
string
msg =
Encoding
.
UTF8
.
GetString
(data,
0
,count);
Console
.
WriteLine
(msg);
//发送消息(发送则不会停止)
string
s =
Console
.
ReadLine
();
clientSocket.
Send
(
Encoding
.
UTF8
.
GetBytes
(s));
//关掉与服务器的连接
clientSocket.
Close
();
同步接收:只能一条一条的接收和发送
异步接收:多条连续发送接收
服务器端:
//异步传输
static
void
StartServerAsync
(){
Socket
serverSocket =
new
Socket
(
AddressFamily
.
InterNetwork
,
SocketType
.
Stream
,
ProtocolType
.
Tcp
);
// 172.18.32.163 172.0.0.1
//绑定IP
//不推荐,注意数字之间为逗号
//IPAddress ipadress = new IPAddress (new byte[]{172,18,32,163});
IPAddress
ipadress =
IPAddress
.
Parse
(
"172.18.32.163"
);
//创建端口号
IPEndPoint
ipEndPoint =
new
IPEndPoint
(ipadress,
88
);
//绑定端口号
serverSocket.
Bind
(ipEndPoint);
//开始监听(对列为50个,参数为0是无数个,考虑性能50个)
serverSocket.
Listen
(
50
);
Console
.
WriteLine
(
"服务器开启成功!"
);
//为当前客户端建立服务器连接
Socket
clientSocket = serverSocket.
Accept
();
//测试消息
string
msg =
"hello你好"
;
//中文处理(byte传输)
byte
[] data = System.Text.
Encoding
.
UTF8
.
GetBytes
(msg);
//向客户端发消息
clientSocket.
Send
(data);
//开始接收消息(异步)
//将接收来的消息从第0位存到1024位,存进databuffer中,并且在接收到每条消息后,用ReceiveCallBack方法进行处理,方法参数为clientSocket
clientSocket.
BeginReceive
(
databuffer
,
0
,
1024
,
SocketFlags
.
None
,
ReceiveCallBack
,clientSocket);
#region 关掉单条接收功能 并且不关闭服务器端
// //接收客户端消息
// byte[] databuffer = new byte[1024] ;
// //数据byte个数
// int count = clientSocket.Receive(databuffer);
// //将数据从0到count转为字符串
// string msgReceive = System.Text.Encoding.UTF8.GetString(databuffer,0,count);
// //打印
// Console.WriteLine (msgReceive);
//
// //暂停一下
// Console.ReadKey();
// //关闭与当前客户端的连接
// clientSocket.Close();
// //关闭服务器连接
// serverSocket.Close ();
#endregion
}
//回调函数(自带参数,方法名随便起)
static
void
ReceiveCallBack
(
IAsyncResult
ar){
Socket
clientSocket = ar.
AsyncState
as
Socket
;
//完成数据接收(和BeginReceive对应)
int
count = clientSocket.
EndReceive
(ar);
string
msg =
Encoding
.
UTF8
.
GetString
(
databuffer
,
0
,count);
Console
.
WriteLine
(
"从客户端接收到数据"
+msg);
//接收完一条再接收一条
clientSocket.
BeginReceive
(
databuffer
,
0
,
1024
,
SocketFlags
.
None
,
ReceiveCallBack
,client
Socket);
客户端:
while (true) {
//发送消息(发送则不会停止)
string
s =
Console
.
ReadLine
();
clientSocket.
Send
(
Encoding
.
UTF8
.
GetBytes
(s));
}
}
}
}
}
接受多个客户端连接
//异步传输
static
void
StartServerAsync
(){
//建立服务器
Socket
serverSocket =
new
Socket
(
AddressFamily
.
InterNetwork
,
SocketType
.
Stream
,
ProtocolType
.
Tcp
);
// 172.18.32.163 172.0.0.1
//绑定IP
//不推荐,注意数字之间为逗号
//IPAddress ipadress = new IPAddress (new byte[]{172,18,32,163});
IPAddress
ipadress =
IPAddress
.
Parse
(
"172.18.32.163"
);
//创建端口号
IPEndPoint
ipEndPoint =
new
IPEndPoint
(ipadress,
88
);
//绑定端口号
serverSocket.
Bind
(ipEndPoint);
try
{
//开始监听(对列为50个,参数为0是无数个,考虑性能50个)
serverSocket.
Listen
(
50
);
Console
.
WriteLine
(
"服务器开启成功!"
);
}
catch
(
Exception
ex) {
Console
.
WriteLine
(ex);
}
//为当前客户端建立服务器连接(当与一个客户端建立连接后,执行AcceptCallBack函数,参数为serverSocket)
//Socket clientSocket = serverSocket.Accept();
serverSocket.
BeginAccept
(
AcceptCallBack
,serverSocket);
#region 关掉单条接收功能 并且不关闭服务器端
// //接收客户端消息
// byte[] databuffer = new byte[1024] ;
// //数据byte个数
// int count = clientSocket.Receive(databuffer);
// //将数据从0到count转为字符串
// string msgReceive = System.Text.Encoding.UTF8.GetString(databuffer,0,count);
// //打印
// Console.WriteLine (msgReceive);
//
// //暂停一下
// Console.ReadKey();
// //关闭与当前客户端的连接
// clientSocket.Close();
// //关闭服务器连接
// serverSocket.Close ();
#endregion
}
//回调函数(自带参数,方法名随便起) IAsyncResult:异步操作接口 AsyncState:异步操作返回的信息
static
void
ReceiveCallBack
(
IAsyncResult
ar){
//每有一个客户端连接就与它建立一个socket连接
Socket
clientSocket = ar.
AsyncState
as
Socket
;
//完成单条数据接收(和BeginReceive对应)
int
count = clientSocket.
EndReceive
(ar);
string
msg =
Encoding
.
UTF8
.
GetString
(
databuffer
,
0
,count);
Console
.
WriteLine
(
"从客户端接收到数据"
+msg);
//接收完一条再接收一条
clientSocket.
BeginReceive
(
databuffer
,
0
,
1024
,
SocketFlags
.
None
,
ReceiveCallBack
,clientSocket);
}
static
void
AcceptCallBack
(
IAsyncResult
ar){
//serverSocket是需要异步操作的对象
Socket
serverSocket = ar.
AsyncState
as
Socket
;
//返回一个与客户端的连接
Socket
clientSocket = serverSocket.
EndAccept
(ar);
//测试消息
string
msg =
"hello你好"
;
//中文处理(byte传输)
byte
[] data = System.Text.
Encoding
.
UTF8
.
GetBytes
(msg);
//向客户端发消息
clientSocket.
Send
(data);
//开始接收消息(异步)
//将接收来的消息从第0位存到1024位,存进databuffer中,并且在接收到每条消息后,用ReceiveCallBack方法进行处理,方法参数为clientSocket
clientSocket.
BeginReceive
(
databuffer
,
0
,
1024
,
SocketFlags
.
None
,
ReceiveCallBack
,clientSocket);
//处理完一个客户端再处理另一个客户端
serverSocket.
BeginAccept
(
AcceptCallBack
,serverSocket);
}
}
}