// 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;
}
}
}
}
}
源程序下载
执行程序下载