C#完整代码:针对ip和域名的tcp聊天完整代码
·
界面展示

本文展示了一个基于C#的TCP聊天应用程序的界面代码实现。该程序同时具备服务器和客户端功能,主要特点包括:1) 自动获取本地IP和主机名;2) 支持配置服务器端口和客户端连接参数;3) 使用多线程处理网络连接和消息收发;4) 实现双向消息传输功能;5) 包含消息显示和发送的UI界面。代码结构清晰,通过BinaryReader/Writer处理网络流,使用Timer定时检查新消息,并提供完善的资源释放机制。该实现可作为基础网络通信框架,适用于需要双向通信的应用场景。
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.IO;
using System.Linq;
using System.Net;
using System.Net.Sockets;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;
using System.Threading;
using System.Runtime.Remoting.Messaging;
namespace BothSeverClientChat
{
public partial class tcpchat : Form
{
//初始化变量
string myip;
string myname;
string myport;
//自己作为服务端的公共数据
string myserverip;//自己的服务端IP
string myservername;//服务端名称
int myserverport;//服务端端口
private TcpClient mywaitclient;
private TcpListener TcpwaitListener;
NetworkStream serverstream;
private BinaryReader serverreader;
private BinaryWriter serverwriter;
private Thread mywaitthread;//等待连接线程
private static string messageasserver = "";//作为服务端的消息
//自己作为客户端的公共数据
string myclientip;
string myclientname;
int myclientport;
private TcpClient mysendclient;
NetworkStream clientstream;
private BinaryReader clientreader;
private BinaryWriter clientwriter;
private Thread myclientthread;//客户端线程
private static string messageasclient = "";//作为客户端的消息
public string getmyip()
{
ipcbbox.Items.Clear();
//获取本机局域网IP
string localname = Dns.GetHostName();//获取本机名
IPAddress[] ips = Dns.GetHostAddresses(localname);//获取所有IP地址
ipcbbox.Items.Add("127.0.0.1");
foreach (IPAddress ip in ips)
{
if (!ip.IsIPv6SiteLocal)
{
myip = ip.ToString();
ipcbbox.Items.Add(ip.ToString());
}
}
return myip;
}
public string getmyname()
{
//获取本机名称
myname = Dns.GetHostName();
return myname;
}
//按照指定格式发送
private void sendformat(BinaryWriter wt, string msg)
{
wt.Write(myip+" \n"+myname+":"+msg);
return;
}
private string getinforeceive(string msgrd,out IPAddress ip)
{
string[] strs = msgrd.Split(new char[] { ' '});
string ipstr = strs[0];
if(IPAddress.TryParse(ipstr,out ip))
ip = IPAddress.Parse(ipstr);
return msgrd;
}
//作为服务端的方法
public void serverstart()
{
//开启服务端线程
mywaitthread = new Thread(new ThreadStart(serverrun));
mywaitthread.Start();
tm_checkmessage1.Start();
}
public void serverrun()
{
//开始监听
messageasserver = "";
TcpwaitListener = new TcpListener(IPAddress.Parse(myserverip), myserverport);
TcpwaitListener.Start();
//循环接收连接
while (true)
{
//等待连接
mywaitclient = TcpwaitListener.AcceptTcpClient();
serverstream = mywaitclient.GetStream();
serverreader = new BinaryReader(mywaitclient.GetStream());
serverwriter = new BinaryWriter(mywaitclient.GetStream());
//开启服务端循环
while (true)
{
try
{
string message = "来自客户端:"+serverreader.ReadString();
messageasserver += message + "\n";
//sendformat(serverwriter,"");
}
catch
{
break;
}
}
}
}
//作为客户端的方法
public void clientstart()
{
//开启客户端线程
myclientthread = new Thread(new ThreadStart(clientrun));
myclientthread.Start();
tm_checkmessage2.Start();
}
private void clientrun()
{
mysendclient = new TcpClient();
mysendclient.Connect(myclientip, myclientport);
if (mysendclient.Connected)
{
clientstream = mysendclient.GetStream();
clientreader = new BinaryReader(mysendclient.GetStream());
clientwriter = new BinaryWriter(mysendclient.GetStream());
//开启客户端循环读取消息
while (true)
{
try
{
//接收消息
string message = clientreader.ReadString();
messageasclient += message + "\n";
}
catch
{
break;
}
}
}
}
public tcpchat()
{
InitializeComponent();
getmyip();
getmyname();
}
private void listenbtn_Click(object sender, EventArgs e)
{
//初始化作为服务端的ip,端口和名称
IPAddress ip;
if (!IPAddress.TryParse(ipcbbox.Text, out ip) || port2.Text == "")
{
rtxboxserver.AppendText("请填写完整信息\n");
}
else
{
myserverip = ipcbbox.Text;
myservername = myname;
myserverport = Convert.ToInt32(port2.Text);
rtxboxserver.AppendText("服务端正在开启\n");
serverstart();
}
//开启服务端
}
private void linkbtn_Click(object sender, EventArgs e)
{
//初始化作为客户端的ip,端口和名称
IPAddress ip;
//检查ip是否合法
//if(!IPAddress.TryParse(ip1.Text,out ip))
//{
// rtxboxclient.AppendText("请输入正确的IP地址\n");
//}
//else if (port1.Text == ""|| Convert.ToInt32(port1.Text)>65535)
//{
// rtxboxclient.AppendText("请输入正确的端口号\n");
//}
//else
//{
// myclientip = ip1.Text;
// myclientname = myname;
// myclientport = Convert.ToInt32(port1.Text);
// rtxboxclient.AppendText("客户端正在开启\n");
// clientstart();
//}
myclientip = ip1.Text;
myclientname = myname;
myclientport = Convert.ToInt32(port1.Text);
rtxboxclient.AppendText("客户端正在开启\n");
clientstart();
}
//防止输入非数字端口号
private void port2_KeyPress(object sender, KeyPressEventArgs e)
{
if (char.IsDigit(e.KeyChar) || (e.KeyChar == '\r') || (e.KeyChar == '\b'))
e.Handled = false;
else
e.Handled = true;
}
private void port1_KeyPress(object sender, KeyPressEventArgs e)
{
if (char.IsDigit(e.KeyChar) || (e.KeyChar == '\r') || (e.KeyChar == '\b'))
e.Handled = false;
else
e.Handled = true;
}
//tm负责更新富文本
private void tm_checkmessage1_Tick(object sender, EventArgs e)
{
if (messageasserver != "")
{
rtxboxserver.AppendText(messageasserver);
rtxboxserver.ScrollToCaret();
messageasserver = "";
}
}
private void tm_checkmessage2_Tick(object sender, EventArgs e)
{
if (messageasclient != "")
{
rtxboxclient.AppendText(messageasclient);
rtxboxclient.ScrollToCaret();
messageasclient = "";
}
}
private void sendtosever_Click(object sender, EventArgs e)
{
if(myclientthread!=null)
{
if (myclientthread.ThreadState == ThreadState.Running)
{
if (clientwriter != null)
{
sendformat(clientwriter, msgtoser.Text);
}
}
}
}
private void sendtoclient_Click(object sender, EventArgs e)
{
if (mywaitthread != null)
{
if(mywaitthread.ThreadState == ThreadState.Running)
{
if (serverwriter != null)
{
sendformat(serverwriter, msgtocli.Text);
}
}
}
}
//回车发送消息
private void msgtocli_KeyPress(object sender, KeyPressEventArgs e)
{
if (e.KeyChar == '\r')
{
sendtoclient_Click(sender, e);
}
}
private void msgtoser_KeyPress(object sender, KeyPressEventArgs e)
{
if (e.KeyChar == '\r')
{
sendtosever_Click(sender, e);
}
}
private void tcpchat_FormClosed(object sender, FormClosedEventArgs e)
{
//释放线程和TCP监听
if (this.TcpwaitListener != null)
{
TcpwaitListener.Stop();
}
//释放tcp流
if (clientstream != null)
clientstream.Close();
if(mysendclient != null)
if (mysendclient.Connected)
mysendclient.Close();
if (serverstream != null)
serverstream.Close();
if (mywaitclient!=null)
{
if (mywaitclient.Connected)
mywaitclient.Close();
}
if (mywaitthread != null)
{
if (mywaitthread.ThreadState == ThreadState.Running)
{
mywaitthread.Abort();
}
}
if (myclientthread != null)
{
if (myclientthread.ThreadState == ThreadState.Running)
{
myclientthread.Abort();
}
}
}
private void rtxboxclient_TextChanged(object sender, EventArgs e)
{
}
private void tcpchat_Load(object sender, EventArgs e)
{
}
}
}
更多推荐

所有评论(0)