C# socket通信实现两个控制台之间聊天

1、运行效果

图1 启动服务端

图2 启动客户端

图3 客户发消息

图4 服务端发消息

图5 客户主动关闭,服务段打印异常详情

2、服务器端源码

服务端和客户端都要添加一下namespace:

using System.Net;

using System.Net.Sockets;

using System.Threading;

源码:

 class Program
    {
        private static string serverIP = "192.168.3.42";//本机ip地址
        private static int serverPort = 8888;
        private static int bufferSize = 1024;
        private static int count = 0;//表示对话序号

        static void Main(string[] args)
        {
            IPAddress ip = IPAddress.Parse(serverIP);
            IPEndPoint ipe = new IPEndPoint(ip, serverPort);
            Socket s = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);
            try
            {
                s.Bind(ipe);
                s.Listen(10);
                Console.WriteLine("等待连接……");
            }
            catch (Exception ex)
            {
                Console.WriteLine(ex);
            }
            Thread mainTrd = new Thread(Run);
            mainTrd.Start(s);
        }
        /// <summary>
        /// 启动服务器的socket。
        /// 此处要想修改为多用户连接,对每个新用户都new一个RecMsg线程,并且Dictionary<T1,T2>存储每一对ipe和socket即可
        /// </summary>
        /// <param name="o">传入的socket对象</param>
        private static void Run(object o)
        {
            Socket socket = o as Socket;
            try
            {               
                Socket connSocket = socket.Accept();
                //客户和服务器连接成功。
                Console.WriteLine("{0}成功连接到本机。", connSocket.RemoteEndPoint);
                //接下来的事情交给会话线程
                Thread recTh = new Thread(RecMsg);
                recTh.Start(connSocket);
                Thread sendTh = new Thread(SendMsg);
                sendTh.Start(connSocket);
            }
            catch (Exception ex)
            {
                Console.WriteLine(ex);
                throw;
            }
        }
        private static void RecMsg(object o)
        {
            Socket connSocket = o as Socket;
            while (true)
            {
                byte[] buffer = new Byte[bufferSize];
                try
                {
                    int length = connSocket.Receive(buffer);
                    byte[] realBuffer = new Byte[length];
                    Array.Copy(buffer, 0, realBuffer, 0, length);
                    string str = System.Text.Encoding.Default.GetString(realBuffer);
                    Console.Write("[{0}] ", count++);
                    Console.WriteLine("{0}说:{1}.", connSocket.RemoteEndPoint, str);
                }
                catch (Exception ex)
                {
                    Console.WriteLine(ex);
                    Console.ReadKey();
                    break;
                }                            
            }
        }
        private static void SendMsg(object o) 
        {
            Socket connSocket = o as Socket;
            while (true)
            {
                string str = Console.ReadLine();
                if (str != string.Empty)
                {
                    byte[] buffer = Encoding.Default.GetBytes(str);
                    connSocket.Send(buffer, buffer.Length, SocketFlags.None);
                }               
            }
        }
    }

3、客户端源码

class Program
    {
        private static string host = "192.168.3.42";
        private static int port = 8888;
        private static int bufferSize = 1024;
        static IPAddress ip = IPAddress.Parse(host);
        static IPEndPoint ipe = new IPEndPoint(ip, port);
        private static int count = 0;//表示对话序号
        static void Main(string[] args)
        {            
            Socket s = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);
            try
            {
                s.Connect(ipe);
                Console.WriteLine("成功连接到{0}。", s.RemoteEndPoint);
                Console.WriteLine("请输入要发送给服务器的话,按Enter发送。");
            }
            catch (Exception ex)
            {
                Debug.WriteLine(ex);
                throw;
            }
            Thread clientTh = new Thread(SendToServer);
            clientTh.Start(s);
            Thread recTh = new Thread(RecMsg);
            recTh.Start(s);            
        }
        private static void RecMsg(object o)
        {
            Socket connSocket = o as Socket;
            while (true)
            {
                byte[] buffer = new Byte[bufferSize];
                try
                {
                    int length = connSocket.Receive(buffer);
                    byte[] realBuffer = new Byte[length];
                    Array.Copy(buffer, 0, realBuffer, 0, length);
                    string str = System.Text.Encoding.Default.GetString(realBuffer);
                    Console.Write("[{0}] ", count++);
                    Console.WriteLine("{0}说:{1}.", connSocket.RemoteEndPoint, str);
                }
                catch (Exception ex)
                {
                    Console.WriteLine(ex);
                    Console.ReadKey();
                    break;
                }
            }
        }
        private static void SendToServer(object o)
        {            
            Socket socket = o as Socket;            
            while (true)
            {
                try
                {
                    string str = Console.ReadLine();                    
                    if (str != string.Empty)
                    {
                        byte[] bt = Encoding.Default.GetBytes(str);
                        socket.Send(bt, bt.Length, 0);
                    }
                }
                catch (Exception ex)
                {
                    Console.WriteLine("发送失败。");
                    Debug.WriteLine(ex);
                    throw;
                }
            }                     
        }
    }
时间: 2024-10-12 13:12:06

C# socket通信实现两个控制台之间聊天的相关文章

一起talk C栗子吧(第一百四十七回:C语言实例--socket通信一)

各位看官们,大家好,上一回中咱们说的是socket属性的例子,这一回咱们说的例子是socket通信.闲话休提,言归正转.让我们一起talk C栗子吧! 看官们,我们在前面章回中介绍了socket的基本概述,这一回中我们将介绍如何使用socket来实现两个进程之间的通信.为了方便大家理解socket通信的方式,我们把通信的双方分别称作客户端和服务器端.大家都知道,套接字有两种类型:流套接字和数据报套接字.不同类型的套接字,通信的方式也不同,本章回中我们先介绍流套接字的通信方式,数据报套接字的通信方

pyton 编写脚本检测两台主机之间的通信状态,异常邮件通知

最近客户有一个需求要检测两台服务器之间的通信状态.要是通信是失败就需要邮件通知相关人.本来想用shell来实现,shell脚本ping 对端服务器很简单,但是shell的邮件发送比较麻烦,于是使用python实现并且用smtplib模块可以快速实现邮件的发送. 功能如下:1秒钟ping一次目标地址.代码中把你的邮箱改为自己的就可以, 代码: #coding:utf-8 import socket import smtplib import email.MIMEText import email.

Java与C之间的socket通信

最近正在开发一个基于指纹的音乐检索应用,算法部分已经完成,所以尝试做一个Android App.Android与服务器通信通常采用HTTP通信方式和Socket通信方式.由于对web服务器编程了解较少,而且后台服务器已经采用原始socket实现与c客户端通信,这就要求Android客户端也采用socket实现.所以在开发Android app时采用了原始socket进行编程. 由于算法是用C语言实现的,而Android应用一般是Java开发,这就不可避免得涉及Java和C语言之间的通信问题.一种

两个页面之间的通信

今天要给大家说的是两个不同页面之间的通信,通过一个拖拽demo来模拟: 首先,写好基础的拖拽代码: <script> window.onload = function() { var oDiv = document.getElementById('div'); oDiv.onmousedown = function(ev) { var ev = window.event || ev; var disX = ev.clientX - oDiv.offsetLeft; var disY = ev.

(转载) Android两个子线程之间通信

Android两个子线程之间通信 标签: classthreadandroid子线程通信 2015-03-20 17:03 3239人阅读 评论(0) 收藏 举报  分类: 个人杂谈 版权声明:本文为博主原创文章,未经博主允许不得转载. Android中,相信主线程和子线程之间的通信大家都不陌生了吧.在一次面试经历中被问到了两个子线程之间是如何进行通信的.哎呦!这可蒙住我了.后来回家研究了下,分享给大家. 其实android中线程通信无非就是handler和looper的操作. 一般情况下的主线

Android两个子线程之间通信

Android中,相信主线程和子线程之间的通信大家都不陌生了吧.在一次面试经历中被问到了两个子线程之间是如何进行通信的.哎呦!这可蒙住我了.后来回家研究了下,分享给大家. 其实android中线程通信无非就是handler和looper的操作. 一般情况下的主线程和子线程之间的通信,都是通过主线程中的handler把子线程中的message发给主线程中的looper,或者,主线程中的handler通过post向looper中发送一个runnable.looper默认存在于main线程中.那么子线

两个控制器之间的通信

//A控制器中 - (void)toDo{ [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(nearbyToRootVcCommunication) name:@"nearbyToRootVcCommunication" object:nil]; } //当B控制器中的viewDidLoad方法调用时,此方法也会被触发 -(void)nearbyToRootVcCommunication

Android中两个Activity之间简单通信

在Android中,一个界面被称为一个activity,在两个界面之间通信,采用的是使用一个中间传话者(即Intent类)的模式,而不是直接通信. 下面演示如何实现两个activity之间的通信. 信息的发起者为Test,接收者为Target,代码如下: Test类: 1 package com.example.testsend; 2 3 import android.content.Intent; 4 import android.support.v7.app.AppCompatActivit

ThinkPHP和Workerman整合实现Socket通信Demo(转载)

转自: https://www.jianshu.com/p/668ac301f9ca 因为最近有个项目涉及到Socket通信,于是自己尝试了一下搭建一个服务端WebSocket通信的项目,写个笔记,能帮助到你的话,十分荣幸.废话不多说进入正题: 先说下编者的运行环境 我是用 CentOS 6.5 ,PHP 5.6 首先要实现Socket通信要了解Socket的作用和用法(自行百度),然后就是需要你的服务器或者本地php环境支持并开启了Socket,一般集成环境都是支持的 phpinfo中如下图所