c# 服务器端网络通信
最近的工作涉及到网络通信,在此小结一下这段时间的收获和遇到的问题。
一.通信方式:
1. Server/Client:
Server:Client :
1 : 1
1 : n(并发服务器方式)
n : 1(电驴,工控软件 ,额~我们的项目做客户端界面,也是如此的架构,不过目前只是1对1的,n对1需要创建多个连接,目前还没做)
2.连接方式
长连接
短连接
3.发送接收数据方式
异步
异步双工:接收和发送都在同一个程序中,有两个不同的子进程分别负责发送和接收。
异步单工:接收和发送是用两个不同的程序。
同步
报文发送后等待接收。同步通讯时,要考虑到超时。
下面贴一些最近学习网络编程时写的一些程序,我是用Socket调试工具调试完成了,不过还需要很多的改进。
Part .1 同步通信
public class SyncServer
{
public delegate void ActionMsgDelegate(object sender, ActionMsgEventArgs args);
public event ActionMsgDelegate ActionMsgEvent;
private IPAddress myIP= IPAddress.Parse("127.0.0.1");
private int myPort = 8000;
private IPEndPoint myServer;
private Socket socket;
private bool check = true;
private Socket acceptSocket;
public static bool SocketServiceFlag = true;
public SyncServer( string ip,int port )
{
myIP = IPAddress.Parse(ip);
myPort = port;
}
public void Accept( )
{
myServer = new IPEndPoint(myIP, myPort);
socket = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);
Thread thread = new Thread(new ThreadStart( Receive));
thread.Start();
}
public void Receive()
{
try
{
socket.Bind(myServer);
socket.Listen(50);
while (SocketServiceFlag)
{
acceptSocket = socket.Accept();
if (acceptSocket.Connected)
{
Thread thread = new Thread(new ThreadStart(Round));
thread.IsBackground = true;
thread.Start();
}
Thread.Sleep(1000);
}
}
catch (Exception ex)
{
}
}
public void Round()
{
while( true )
{
try
{
if (!acceptSocket.Connected||!check)
{
break;
}
Byte[] Rec = ReadData();
///输出数据
if(Rec!=null)
{
string RecMessage = System.Text.Encoding.Default.GetString(Rec,0,Rec.Length);
updateUI("接收数据:" + RecMessage);
if (!check)
{
break;
}
string SendMessage = "返回数据:" + RecMessage;
updateUI(SendMessage);
byte[] sendByte = System.Text.Encoding.Default.GetBytes(SendMessage.ToCharArray());
SendData(sendByte);
if (!check)