软蚁社区 - 互联网小白聚集地!

 找回密码
 立即注册

QQ登录

只需一步,快速开始

便捷登录,只需一步

查看: 43|回复: 0

简单Socket通信示例

[复制链接]

41

主题

42

帖子

174

积分

网站管理

Rank: 9Rank: 9Rank: 9

积分
174
发表于 2017-10-31 14:28:42 | 显示全部楼层 |阅读模式
这是一个简单的C#Socket通信示例,界面采用WPF设计下面是界面截图及对应XAML代码小白上路,功能简单,
仅供参考!服务器端:

XAML代码:
<Window x:Class="Server.MainWindow"
        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
        Title="简单Socket通信示例—服务器端" Height="360.072" Width="525"
        FontSize="20px"
        ResizeMode="CanMinimize"
        WindowStartupLocation="CenterScreen"
        Closed="Window_Closed_1"
        >
    <Grid>
        <Label Content="主机 IP:" HorizontalAlignment="Left" Margin="10,10,0,0" VerticalAlignment="Top"/>
        <TextBox Name="txtIP" HorizontalAlignment="Left" Height="36" Margin="114,10,0,0" TextWrapping="Wrap" Text="192.168.1.103" VerticalAlignment="Top" Width="159"/>
        <Label Content=":" HorizontalAlignment="Left" Margin="276,7,0,0" VerticalAlignment="Top"/>
        <TextBox Name="txtPort" HorizontalAlignment="Left" Height="36" Margin="296,10,0,0" TextWrapping="Wrap" Text="8080" VerticalAlignment="Top" Width="76"/>
        <Button Content="开始侦听" Name="btnListen" Click="btnListen_Click_1" Cursor="Hand" HorizontalAlignment="Left" Margin="392,10,0,0" VerticalAlignment="Top" Width="99" Height="36"/>
        <Label Content="信息记录:" HorizontalAlignment="Left" Margin="10,51,0,0" VerticalAlignment="Top"/>
        <TextBox Name="txtLog" VerticalScrollBarVisibility="Visible" HorizontalAlignment="Left" Height="175" Margin="10,92,0,0" TextWrapping="Wrap" Text="" VerticalAlignment="Top" Width="481"/>
        <TextBox Name="txtSend" HorizontalAlignment="Left" Height="33" Margin="10,278,0,0" TextWrapping="Wrap" Text="" VerticalAlignment="Top" Width="362"/>
        <Button Content="发送消息"  x:Name="btnSend" Click="btnSend_Click_1" IsEnabled="False" Cursor="Hand" HorizontalAlignment="Left" Margin="392,278,0,0" VerticalAlignment="Top" Width="99" Height="36"/>
    </Grid>
</Window>hou


后台.CS代码:
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
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.Navigation;
using System.Windows.Shapes;
//导入相关命名空间
using System.Net;
using System.Net.Sockets;
using System.Threading;

namespace Server
{
    /// <summary>
    /// MainWindow.xaml 的交互逻辑
    /// </summary>
    public partial class MainWindow : Window
    {
        public MainWindow()
        {
            InitializeComponent();
        }


        //声明全局变量
        private Thread thr;//通信线程
        private TcpListener server;//创建服务器对象
        private TcpClient client;//创建客户端对象
        private NetworkStream ns;//创建数据流对象
        private delegate void Help(string msg);//委托 实现跨线程访问
        private const int bufSize = 8000;//缓存空间常量

        //IP与端口结构体
        private struct IpAndPort
        {
            public string ip;
            public int port;
        }
        /// <summary>
        /// 开始侦听
        /// </summary>
        /// <param name="sender"></param>
        /// <param name="e"></param>
        private void btnListen_Click_1(object sender, RoutedEventArgs e)
        {
            if (string.IsNullOrEmpty(txtIP.Text) || string.IsNullOrEmpty(txtPort.Text))
            {
                MessageBox.Show("主机信息不可为空!");
                return;
            }
            IpAndPort iap = new IpAndPort();
            iap.ip = txtIP.Text;//获取输入的主机IP
            iap.port = int.Parse(txtPort.Text);//获取输入的主机端口
            thr = new Thread(Listen);//创建通信线程,并委托给Listen方法
            thr.Start((object)iap);//启动线程
            btnListen.Content = "侦听中...";
            btnListen.IsEnabled = false;
        }


        /// <summary>
        /// 线程委托事件
        /// </summary>
        /// <param name="iap"></param>
        private void Listen(object iap)
        {
            IpAndPort i = (IpAndPort)iap;
            IPAddress ipAdr = IPAddress.Parse(i.ip);//将结构体内的IP 解释为IPAddress类型
            server = new TcpListener(ipAdr,i.port);//实例化服务器对象
            server.Start();
            App.Current.Dispatcher.Invoke(new Help(txtLog.AppendText),"服务器开始侦听...\n");//跨线程显示信息
            client = server.AcceptTcpClient();//获取连接主机的客户端,将会阻塞线程
            App.Current.Dispatcher.Invoke(new Help(txtLog.AppendText),"发现新客户端连接!\n");
            App.Current.Dispatcher.Invoke(new Help(ChangeBtnSend), "");//使发送信息按钮可用
            //循环读取客户端发送来的信息
            do
            {
                try
                {
                    ns = client.GetStream();//获取信息流
                    byte[]buf=new byte[bufSize];//声明信息缓存空间
                    int msgSize = 0;//声明真实信息容量
                    lock (ns)
                    {
                        msgSize = ns.Read(buf, 0, bufSize);//读取信息流存放至缓存空间,同时获取真实信息容量
                    }
                    if (msgSize == 0) return;
                    string msg = Encoding.Default.GetString(buf, 0, msgSize);//转换为字符串
                    App.Current.Dispatcher.Invoke(new Help(txtLog.AppendText),DateTime.Now.ToString()+"接收:"+msg+"\n");
                }
                catch
                {
                    App.Current.Dispatcher.Invoke(new Help(txtLog.AppendText),"通信发生异常!\n");
                }
            }
            while(true);
        }

        /// <summary>
        /// 使发送信息按钮可用
        /// </summary>
        /// <param name="str"></param>
        private void ChangeBtnSend(string str)
        {
            btnSend.IsEnabled = true;
        }

        /// <summary>
        /// 发送信息
        /// </summary>
        /// <param name="sender"></param>
        /// <param name="e"></param>
        private void btnSend_Click_1(object sender, RoutedEventArgs e)
        {
            if (client != null)
            {
                if (string.IsNullOrEmpty(txtSend.Text))
                {
                    MessageBox.Show("请输入你要发送的信息!");
                    return;
                }
                byte[] buf = Encoding.Default.GetBytes(txtSend.Text);
                ns.Write(buf, 0, buf.Length);
                txtLog.AppendText(DateTime.Now.ToString() + "发送:" + txtSend.Text + "\n");
                txtSend.Text = string.Empty;
            }
        }

        /// <summary>
        /// 程序完全退出
        /// </summary>
        /// <param name="sender"></param>
        /// <param name="e"></param>
        private void Window_Closed_1(object sender, EventArgs e)
        {
            thr.Abort();//终止通信线程
            System.Environment.Exit(0);//结束当前应用所有线程
        }
    }

}

客户端:


客户端XAML代码:
<Window x:Class="Client.MainWindow"
        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
        Title="简单Socket通信示例—客户端" Height="360.072" Width="525"
        FontSize="20px"
        ResizeMode="CanMinimize"
        WindowStartupLocation="CenterScreen"
        Closed="Window_Closed_1"
        >
    <Grid>
        <Label Content="主机 IP:" HorizontalAlignment="Left" Margin="10,10,0,0" VerticalAlignment="Top"/>
        <TextBox Name="txtIP" HorizontalAlignment="Left" Height="36" Margin="114,10,0,0" TextWrapping="Wrap" Text="192.168.1.103" VerticalAlignment="Top" Width="159"/>
        <Label Content=":" HorizontalAlignment="Left" Margin="276,7,0,0" VerticalAlignment="Top"/>
        <TextBox Name="txtPort" HorizontalAlignment="Left" Height="36" Margin="296,10,0,0" TextWrapping="Wrap" Text="8080" VerticalAlignment="Top" Width="76"/>
        <Button Content="开始连接" Name="btnConn" Click="btnConn_Click_1" Cursor="Hand" HorizontalAlignment="Left" Margin="392,10,0,0" VerticalAlignment="Top" Width="99" Height="36"/>
        <Label Content="信息记录:" HorizontalAlignment="Left" Margin="10,51,0,0" VerticalAlignment="Top"/>
        <TextBox Name="txtLog" VerticalScrollBarVisibility="Visible" HorizontalAlignment="Left" Height="175" Margin="10,92,0,0" TextWrapping="Wrap" Text="" VerticalAlignment="Top" Width="481"/>
        <TextBox Name="txtSend" HorizontalAlignment="Left" Height="33" Margin="10,278,0,0" TextWrapping="Wrap" Text="" VerticalAlignment="Top" Width="362"/>
        <Button Content="发送消息"  x:Name="btnSend" Click="btnSend_Click_1" IsEnabled="False" Cursor="Hand" HorizontalAlignment="Left" Margin="392,278,0,0" VerticalAlignment="Top" Width="99" Height="36"/>
    </Grid>
</Window>

后台.CS代码:
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
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.Navigation;
using System.Windows.Shapes;
//导入相关命名空间
using System.Net;
using System.Net.Sockets;
using System.Threading;

namespace Client
{
    /// <summary>
    /// MainWindow.xaml 的交互逻辑
    /// </summary>
    public partial class MainWindow : Window
    {
        public MainWindow()
        {
            InitializeComponent();
        }

        //声明全局变量
        private Thread thr;//通信线程
        private TcpClient client;//创建客户端对象
        private NetworkStream ns;//创建数据流对象
        private delegate void Help(string msg);//委托 实现跨线程访问
        private const int bufSize = 8000;//缓存空间常量


        /// <summary>
        /// 连接至主机
        /// </summary>
        /// <param name="sender"></param>
        /// <param name="e"></param>
        private void btnConn_Click_1(object sender, RoutedEventArgs e)
        {
            if(string.IsNullOrEmpty(txtIP.Text)||string.IsNullOrEmpty(txtPort.Text))
            {
                MessageBox.Show("请填写主机信息!");
                return;
            }
            IPAddress ipAdr = IPAddress.Parse(txtIP.Text);//将结构体内的IP 解释为IPAddress类型
            client =new TcpClient();//实例化客户端对象
            client.Connect(ipAdr,int.Parse(txtPort.Text));//连接至主机,这里的主机IP与端口需要与服务器的保持一致
            txtLog.AppendText("连接主机成功!\n");
            btnConn.Content = "连接成功";
            btnConn.IsEnabled = false;
            btnSend.IsEnabled = true;
            thr = new Thread(Listen);//委托线程监听来自服务器的消息
            thr.Start();
        }

        /// <summary>
        /// 监听信息
        /// </summary>
        private void Listen()
        {
            do
            {
                try
                {
                    byte[] buf = new byte[bufSize];//信息缓存空间
                    int msgSize = 0;//声明信息实际容量变量
                    ns = client.GetStream();//获取信息流
                    lock (ns)
                    {
                        msgSize = ns.Read(buf, 0, bufSize);//存储信息到缓存空间并返回实际信息容量
                    }
                    if (msgSize == 0) return;
                    string msg = Encoding.Default.GetString(buf, 0, msgSize);//转换为字符串
                    App.Current.Dispatcher.Invoke(new Help(txtLog.AppendText),DateTime.Now.ToString()+"接收:"+msg+"\n");
                }
                catch
                {
                    App.Current.Dispatcher.Invoke(new Help(txtLog.AppendText),"通信发生异常!\n");
                }
            }
            while (true);
        }

        /// <summary>
        /// 发送信息
        /// </summary>
        /// <param name="sender"></param>
        /// <param name="e"></param>
        private void btnSend_Click_1(object sender, RoutedEventArgs e)
        {
            if (client != null)
            {
                if(string.IsNullOrEmpty(txtSend.Text))
                {
                    MessageBox.Show("请输入您要发送的信息!");
                    return;
                }
                    byte[] buf = Encoding.Default.GetBytes(txtSend.Text);
                    ns.Write(buf, 0, buf.Length);
                    txtLog.AppendText(DateTime.Now.ToString() + "发送:" + txtSend.Text+"\n");
                    txtSend.Text = string.Empty;
            }
        }

        /// <summary>
        /// 完全退出
        /// </summary>
        /// <param name="sender"></param>
        /// <param name="e"></param>
        private void Window_Closed_1(object sender, EventArgs e)
        {
            thr.Abort();//终止通信线程
            System.Environment.Exit(0);//结束当前应用所有线程
        }
    }

}



回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

Archiver|手机版|小黑屋|软蚁社区 ( 鄂ICP备16025467 )|申请友情链接

GMT+8, 2018-1-19 15:20 , Processed in 0.123052 second(s), 25 queries .

Powered by Discuz X3.4

© 2001-2017 Comsenz Inc.

快速回复 返回顶部 返回列表