使用socket实现简单的客户端和服务端通信(C#语言)

1.主要思路: (1) 服务端开启监听线程,等待客户端的连接。 每个socket连接放到独立线程中处理。 (2) 服务端和客户端使用约定的消息格式通信。对于比较复杂的消息(如向服务端传递一个实例),可以使用json封装传输。 (3) 每个连接的客户端,注册唯一的ClientID,在服务端以此来区分消息的来源。 2.代码构成 实现该样例包含两个cs的客户端程序。 分别为 服务端 和 客户端。 3.主要代码: (1) 服务端 xaml

<Window x:Class=”WpfApplication1.Window1″xmlns=”http://schemas.microsoft.com/winfx/2006/xaml/presentation”xmlns:x=”http://schemas.microsoft.com/winfx/2006/xaml”Title=”Window1″ Height=”432″ Width=”817″><Grid><TextBox Height=”23″ HorizontalAlignment=”Left” Margin=”16,20,0,0″ Name=”tbox_listner_ip” Text=”127.0.0.1″ VerticalAlignment=”Top” Width=”114″ /><TextBox Height=”23″ HorizontalAlignment=”Left” Margin=”136,20,0,0″ Name=”tbox_listner_port” Text=”2000″ VerticalAlignment=”Top” Width=”43″ /><Button Content=”开启监听” Height=”23″ HorizontalAlignment=”Right” Margin=”0,22,440,0″ Name=”button2″ VerticalAlignment=”Top” Width=”75″ Click=”button2_Click” /><RichTextBox Height=”132″ HorizontalAlignment=”Left” Margin=”470,20,0,0″ Name=”richTextBox1″ VerticalAlignment=”Top” Width=”313″ /><Grid Margin=”19,82,354,287″><Grid.ColumnDefinitions><ColumnDefinition Width=”260″ /><ColumnDefinition Width=”80″ /><ColumnDefinition Width=”60*” /></Grid.ColumnDefinitions><=”Bold” Padding=”0″ Height=”18″></Label><=”Bold” Padding=”0″ Height=”18″></Label><=”Bold” Padding=”0″ Height=”18″></Label></Grid><ListBox Height=”278″ HorizontalAlignment=”Left” Margin=”19,103,0,0″ Name=”listBox2″ VerticalAlignment=”Top” Width=”422″><ListBox.ItemTemplate><DataTemplate><Grid><Grid.ColumnDefinitions><ColumnDefinition Width=”260″ /><ColumnDefinition Width=”80″ /><ColumnDefinition Width=”60*” /></Grid.ColumnDefinitions><=”0″ Height=”25″ Content=”{Binding Path=clientID}”></Label><=”0″ Height=”25″ Content=”{Binding Path=messageContent}”></Label><RadioButton Grid.Column=”2″ Margin=”0,5,0,0″ Height=”25″ IsChecked=”{Binding Path=handleFlag}”></RadioButton></Grid></DataTemplate></ListBox.ItemTemplate></ListBox><RichTextBox Height=”132″ HorizontalAlignment=”Left” Margin=”470,193,0,0″ Name=”richTextBox2″ VerticalAlignment=”Top” Width=”313″ /></Grid></Window>

(2) 服务端 cs

using System;using System.Collections.Generic;using System.Linq;using System.Text;using System.Windows;using System.Windows.Controls;using System.Windows.Data;using System.Windows.Documents;using System.Windows.Input;using System.Windows.Media;using System.Windows.Media.Imaging;using System.Windows.Shapes;using System.Net.Sockets;using System.Threading;using System.Net;using Newtonsoft.Json;namespace WpfApplication1{Window1.xaml 的交互逻辑Window1 : Window{int BufferSize = 1024;private bool executeFlag = false;List<MySocketMessage> list_message = new List<MySocketMessage>();private int ClientFlag = 1;private Socket socket_server;public Window1(){InitializeComponent();}(object sender, RoutedEventArgs e){button2.IsEnabled = false;int listner_port = Convert.ToInt32(tbox_listner_port.Text);string listner_ip = tbox_listner_ip.Text;executeFlag = true;IPAddress ip_server = IPAddress.Parse(listner_ip);IPEndPoint ipEndPoint = new IPEndPoint(ip_server, listner_port);socket_server = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);socket_server.Bind(ipEndPoint);socket_server.Listen(10); //开始监听 (有监听就接收) 设置最多十个排队连接请求Thread thread_serve = new Thread(new ThreadStart(CreateListner));thread_serve.Name = “server thread”;thread_serve.Start();}(){while (true){Socket socketConn = socket_server.Accept(); //为建立的连接创建socket EndPoint point = socketConn.RemoteEndPoint;AppendStrToRtbox(“\n连接来自:” + point.ToString());Thread receiveThread = new Thread(ServerHandleMessage);receiveThread.Start(socketConn);}}接收消息 (object clientSocket){Socket socketConn = clientSocket as Socket;string clientID = “”;while (true){if (socketConn.Connected == true){try{string recvStr = GetReceiveStr(socketConn);if (recvStr != “”){if (recvStr.Contains(“connectRequest”)){int i_pos = recvStr.IndexOf(“connectRequest”) + “connectRequest”.Length;AppendStrToRtbox(“分割字符串前:” + recvStr);recvStr = recvStr.Substring(i_pos, recvStr.Length – i_pos);Send_Mess(socketConn, “Confirm”);AppendStrToRtbox(” 连接已被确认,客户ID:” + recvStr);clientID = recvStr;continue;}else if (recvStr.Contains(“jsonMessage:”)){int i_pos = recvStr.IndexOf(“jsonMessage:”) + “jsonMessage:”.Length;AppendStrToRtbox(“分割字符串前:” + recvStr);recvStr = recvStr.Substring(i_pos, recvStr.Length – i_pos);AppendStrToRtbox(“分割字符串后:” + recvStr);MySocketMessage socketMessage = JsonConvert.DeserializeObject<MySocketMessage>(recvStr);list_message.Add(socketMessage);}MySocketMessage message_tmp = list_message.Find(p => p.clientID == clientID && p.isDoing == true);if (message_tmp != null){message_tmp.isDoing = false;message_tmp.dt_message_handleTime = DateTime.Now;RefreshListBox();string sendStr = “ReturnCode:” + message_tmp.messageContent;Send_Mess(socketConn, sendStr);AppendStrToRtbox_two(String.Format(“消息来自{0},指令:{1}”, clientID, message_tmp.messageContent));AppendStrToRtbox(” 执行请求指令:” + recvStr);continue;}string sendStr2 = “Confirm”;Send_Mess(socketConn, sendStr2);}}catch (Exception ce){executeFlag = false;AppendStrToRtbox(“服务端检测到客户端连接断开”);}}else{executeFlag = false;AppendStrToRtbox(“服务端检测到客户端连接断开”);}Thread.Sleep(50);}}(Socket socket_tmp){[BufferSize];int bytes;string recvStr = “”;bytes = socket_tmp.Receive(recvBytes, recvBytes.Length, 0); //从服务器端接受返回if (bytes > 0){recvStr += Encoding.ASCII.GetString(recvBytes, 0, bytes);Console.WriteLine(“\nGetReceiveStr 客户端接收到服务端的返回:” + recvStr);}return recvStr;}发送消息指令(Socket socket_tmp,string sendMessage){if (socket_tmp.Connected == false){return;}byte[] send_bytes = Encoding.ASCII.GetBytes(sendMessage); //把字符串编码为字节 if (send_bytes.Length > 0){socket_tmp.Send(send_bytes, send_bytes.Length, 0);}}(string content){this.Dispatcher.BeginInvoke(System.Windows.Threading.DispatcherPriority.Normal,new Action(() =>{richTextBox1.AppendText(“\n” + content);richTextBox1.ScrollToEnd();}));}(string content){this.Dispatcher.BeginInvoke(System.Windows.Threading.DispatcherPriority.Normal,new Action(() =>{richTextBox2.AppendText(“\n” + content);richTextBox2.ScrollToEnd();}));}(){this.Dispatcher.BeginInvoke(System.Windows.Threading.DispatcherPriority.Normal,new Action(() =>{listBox2.ItemsSource = new List<MySocketMessage>();listBox2.ItemsSource = list_message;}));}}public class MySocketMessage{public MySocketMessage(){handleFlag = false;isDoing = false;}public string clientID { get; set; }public string messageContent { get; set; }public DateTime dt_message_addTime { get; set; }public DateTime dt_message_handleTime { get; set; }public bool handleFlag { get; set; }public bool isDoing { get; set; }}}

(3) 客户端 xaml

==========================================>===>====>==>>===>长江后浪催前浪,一辈新人换旧人。

使用socket实现简单的客户端和服务端通信(C#语言)

相关文章:

你感兴趣的文章:

标签云: