一个C/S模式客户端和服务器端对话的例子:
服务器端代码:
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Text;
using System.Windows.Forms;
using System.Threading;
using System.Net.Sockets;
using System.IO;
namespace chat
{
public partial class Server : Form
{
delegate void SetTextCallback(string text);
private System.Windows.Forms.TextBox inputTextBox;
private System.Windows.Forms.TextBox displayTextBox;
private Socket connection;
private Thread readThread;
private System.ComponentModel.Container components = null;
private NetworkStream socketStream;
private BinaryWriter writer;
private BinaryReader reader;
private string str = "";
public Server()
{
InitializeComponent();
readThread = new Thread(new ThreadStart(RunServer));
readThread.Start();
}
[STAThread]
static void Main()
{ Application.Run(new Server()); }
private void Server_Load(object sender, EventArgs e)
{
this.backgroundWorker1.RunWorkerAsync();
}
protected void Server_Closing(object sender,CancelEventArgs e)
{
System.Environment.Exit(System.Environment.ExitCode);
}
private void inputTextBox_KeyDown(object sender, KeyEventArgs e)
{
try {
if (e.KeyCode == Keys.Enter && connection != null)
{
writer.Write("服务器:" + inputTextBox.Text);
this.displayTextBox.Text += "\r\n服务器:" + this.inputTextBox.Text;
if (inputTextBox.Text == "terminate")
connection.Close();
this.inputTextBox.Text = "";
}//end if
}
catch(SocketException)
{
displayTextBox.Text += "\n写入文件错误。";
}
}//end inputTextBox_KeyDown
public void RunServer()
{
TcpListener listener;
int counter = 1;
try
{
listener = new TcpListener(5000);
listener.Start();
while (true)
{
//this.displayTextBox.Text = "等待连接\r\n";
this.SetText("等待连接\r\n");
connection = listener.AcceptSocket();
socketStream = new NetworkStream(connection);
writer = new BinaryWriter(socketStream);
reader = new BinaryReader(socketStream);
//displayTextBox.Text += "连接" + counter + "接通。\r\n";
this.SetText("连接" + counter + "接通。\r\n");
this.SetText("服务器>>>连接成功。");
writer.Write("服务器>>>连接成功。");
inputTextBox.ReadOnly = false;