新思想

C# 双向即时通信/聊天 源代码

// http://ccckmit.wikidot.com/csharpchatbox
using System;
using System.Net;
using System.Net.Sockets;
using System.IO;
using System.Threading;

namespace IMCmd
{
    class Program
    {
        int port = 888;

        static void Main(String[] args)
        {
            Program chatBox = new Program();
            if (args.Length == 0)
                chatBox.ServerMain();
            else
                chatBox.ClientMain(args[0]);
        }

        public void ServerMain()
        {
            IPEndPoint ipep = new IPEndPoint(IPAddress.Any, port);
            Socket newsock = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);
            newsock.Bind(ipep);
            newsock.Listen(10);
            Socket client = newsock.Accept();
            new TcpListen(client); // 创建新对象,再收发消息.
            newsock.Close();
        }

        public void ClientMain(string ip)
        {
            IPEndPoint ipep = new IPEndPoint(IPAddress.Parse(ip), port);
            Socket server = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);
            server.Connect(ipep);
            new TcpListen(server);
            server.Shutdown(SocketShutdown.Both);
            server.Close();
        }

    }

    public class TcpListen
    {
        Socket socket;
        Thread inThread, outThread;
        NetworkStream stream;
        StreamReader reader;
        StreamWriter writer;
        bool quit = false;

        public TcpListen(Socket s)
        {
            socket = s;
            stream = new NetworkStream(s);
            reader = new StreamReader(stream);
            writer = new StreamWriter(stream);
            inThread = new Thread(new ThreadStart(inLoop));
            inThread.Start();
            outThread = new Thread(new ThreadStart(outLoop));
            outThread.Start();
            inThread.Join(); // 等待 inThread 执行续完成,才离开此函数。 
        }

        public void inLoop()
        {
            while (!quit)
            {
                string line = reader.ReadLine();
                Console.WriteLine("收到:" + line);
                if (line == "exit")
                {
                    //stream.Close();
                    quit = true;
                    socket.Shutdown(SocketShutdown.Receive);
                    //socket.Close();
                    break;
                }
            }
        }

        public void outLoop()
        {
            while (!quit)
            {
                string line = Console.ReadLine();
                if (!quit)
                {
                    writer.WriteLine(line);
                    writer.Flush();
                }
                if (line == "exit")
                {
                    //stream.Close();
                    quit = true;
                    socket.Shutdown(SocketShutdown.Send);
                    //socket.Close();
                    break;
                }
            }
        }
    }
}

 

源程序下载

执行程序下载

posted on 2015-12-13 16:51  新思想  阅读(1117)  评论(1)    收藏  举报

导航