说明: TcpClient 链接是一个比较安全稳定的链接,作为聊天或者是数据稳定传输,是比较合适的,下面的代码测试过,如果你吧他放在公网服务器上,也是可以用的

using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;
using System.Net;
using System.Threading;
using System.IO;
using System.Net.Sockets;
using System.Text.RegularExpressions; namespace ChatsTolls
{
public partial class Form1 : Form
{
public Form1()
{
InitializeComponent();
}
bool b=true;
private Thread td;
private TcpListener listenter;
private NetworkStream ns;
private StreamWriter sw;
private StreamReader sr;
private Socket socket;
private TcpClient client; private void Form1_Load(object sender, EventArgs e)
{ }
private void Run()
{
b = false;
while (true)
{
try
{
socket = listenter.AcceptSocket();
}
catch (Exception)
{
return;
}
label1.Text = "已经连接";
ns = new NetworkStream(socket);
sr = new StreamReader(ns); //读取信息
sw = new StreamWriter(ns); //写入信息 ClosingFrom();
} }
private void button1_Click(object sender, EventArgs e)
{
if (sw != null && txtWrite.Text != "")
{
if (b)
{
sw.WriteLine("ci说:" + txtWrite.Text.Trim());
sw.Flush();
lisAdd.Items.Add("我说:" + txtWrite.Text.Trim());
txtWrite.Clear();
}
else
{
sw.WriteLine("zhu说:" + txtWrite.Text.Trim());
sw.Flush();
lisAdd.Items.Add("我说:" + txtWrite.Text.Trim());
txtWrite.Clear();
}
} }
private void ClosingFrom()
{
try
{
while ( == )
{
string line = null;
if ((line = sr.ReadLine()) != null)
{
lisAdd.Items.Add(line);
}
else
{
label1.Text = "已经断开";
break;
}
}
}
catch (Exception ex)
{ label1.Text = "";
}
finally
{
if (td.ThreadState == ThreadState.Running)
{
sr.Close();
sw.Close();
ns.Close();
if (!b)
{
socket.Close();
}
else
{
client.Close();
}
listenter.Stop(); sw = null;
td.Abort();
}
}
} private void btnGet_Click(object sender, EventArgs e)
{
if (td != null)
{
if (td.ThreadState == ThreadState.Running)
{
sr.Close();
sw.Close();
ns.Close();
if (!b)
{
socket.Close();
}
else
{
client.Close();
}
listenter.Stop();
sw = null;
td.Abort();
}
}
this.Close();
} private void Form1_FormClosing(object sender, FormClosingEventArgs e)
{
if (td != null)
{
if (td.ThreadState == ThreadState.Running)
{
sr.Close();
sw.Close();
ns.Close();
if (!b)
{
socket.Close();
}
else
{
client.Close();
}
listenter.Stop();
sw = null;
td.Abort();
}
}
} private void button1_Click_1(object sender, EventArgs e)
{
if (btnZ.Text =="连 接")
{
if (string.IsNullOrEmpty(txtPort.Text))
{
MessageBox.Show("请输入端口号");
txtPort.Focus();
return;
} //判断端口号
if (string.IsNullOrEmpty(txtIp.Text))
{
MessageBox.Show("请输入Ip");
txtIp.Focus();
return;
}
b = true;
int j = int.Parse(txtPort.Text.Trim());
string ip = txtIp.Text.Trim();
//w外网上不能用Dns
//IPHostEntry ipHost = Dns.GetHostEntry(ip);
try
{ client = new TcpClient();
client.Connect(IPAddress.Parse(ip), j);
ns = this.client.GetStream();
sr = new StreamReader(ns);
sw = new StreamWriter(ns);
td = new Thread(new ThreadStart(Runs));
td.IsBackground = true;
td.Start();
label1.Text = "已经连接";
btnZ.Text = "断开连接";
btnX.Enabled = false;
}
catch (Exception ex)
{ label1.Text = "未找到网络";
}
}
else
{
if (td != null)
{ try
{
sr.Close();
sw.Close();
ns.Close();
if (!b)
{
socket.Close();
}
else
{
client.Close();
}
sw = null;
td.Abort();
}
catch (Exception)
{ } } btnX.Enabled = true;
btnZ.Text = "连 接";
label1.Text = "";
}
}
private void Runs()
{
ClosingFrom();
} private void button2_Click(object sender, EventArgs e)
{
if (btnX.Text == "监 听")
{
if (string.IsNullOrEmpty(txtPort.Text))
{
MessageBox.Show("请输入端口号");
txtPort.Focus();
return;
} //判断端口号的方法
b = false;
int j = int.Parse(txtPort.Text.Trim());
Control.CheckForIllegalCrossThreadCalls = false;
listenter = new TcpListener(j); //监听实例化 并写入需要监听的端口
listenter.Start(); //开始监听
td = new Thread(new ThreadStart(Run)); //定义线程进行监听
td.IsBackground = true;
td.Start(); //线程启动
btnX.Text = "取消监听";
btnZ.Enabled = false;
labJ.Text = "正在监听...";
}
else
{ try
{
listenter.Stop();
td.Abort();
}
catch (Exception)
{ }
btnZ.Enabled = true;
btnX.Text = "监 听";
labJ.Text = "";
}
}
}
}

界面:

首先应在服务器上打开 输入端口号并监听

然后本地输入服务Ip 和端口 点击链接 就可以了

写的比较急,就不多说了

c# TcpClient简易聊天工具的更多相关文章

  1. RDIFramework.NET ━ .NET快速信息化系统开发框架 V2.8 版本━新增企业通(内部简易聊天工具)

    RDIFramework.NET ━ .NET快速信息化系统开发框架 V2.8 版本 新增企业通(内部简易聊天工具) RDIFramework.NET,基于.NET的快速信息化系统开发.整合框架,给用 ...

  2. java+socket 简易聊天工具

    1.服务器端程序 package com.test3; import java.io.*; import java.net.*; import java.awt.*; import java.awt. ...

  3. Python简易聊天工具-基于异步Socket通信

    继续学习Python中,最近看书<Python基础教程>中的虚拟茶话会项目,觉得很有意思,自己敲了一遍,受益匪浅,同时记录一下. 主要用到异步socket服务客户端和服务器模块asynco ...

  4. 05-python 学习第五天,简易聊天工具(shelve模块练习)

    需求:1.有两个用户,一个是mychat.py,另一个是youchat.py2.通过执自己的文件,可以看到对方输入的内容,实现连个命令行窗口之间聊天的功能.3.通过shelve 持久化写入和和读取功能 ...

  5. Python3 实现简易局域网视频聊天工具

    Python3 实现简易局域网视频聊天工具   1.环境 操作系统为 Ubuntu 16.04 python 3.5opencv-python 3.4.1.15numpy 1.14.5PyAudio ...

  6. 基于WebServices简易网络聊天工具的设计与实现

    基于WebServices简易网络聊天工具的设计与实现 Copyright 朱向洋 Sunsea ALL Right Reserved 一.项目内容 本次课程实现一个类似QQ的网络聊天软件的功能:服务 ...

  7. 用Socket做一个局域网聊天工具(转)

    原文:http://www.cnblogs.com/technology/archive/2010/08/15/1799858.html 程序设计成为简单的服务端和客户端之间的通信, 但通过一些方法可 ...

  8. Java之简单的聊天工具

    今天整理资料的时候,找出自己几年前刚学Java时做过的一个简易的聊天工具,有服务器也有客户端,能发送文字消息和文件,但是用户上线并未存入数据库,而只是简单的缓存在服务器的一个数组中,所以,只要服务器一 ...

  9. php+websocket搭建简易聊天室实践

    1.前言 公司游戏里面有个简单的聊天室,了解了之后才知道是node+websocket做的,想想php也来做个简单的聊天室.于是搜集各种资料看文档.找实例自己也写了个简单的聊天室. http连接分为短 ...

随机推荐

  1. Robot Framework问题汇总...不断更新中

    在实际使用Robot Framework工具过程中,难免会遇到一些问题, 我们将会一一记录下来,以便后来者碰到类似的问题能够快速解决! 安装类问题: ========================= ...

  2. poj 2083 Fractal 递归 图形打印

    题目链接: http://poj.org/problem?id=2083 题目描述: n = 1时,图形b[1]是X n = 2时,图形b[2]是X  X        X               ...

  3. _bzoj1503 [NOI2004]郁闷的出纳员【Splay】

    传送门:http://www.lydsy.com/JudgeOnline/problem.php?id=1503 由于初始工资未达到下限而离开的员工不算在离开人数之内...坑爹... 然后就是写kth ...

  4. multiset || 线段树 HDOJ 4302 Holedox Eating

    题目传送门 题意:一个长度L的管子,起点在0.n次操作,0 p表示在p的位置放上蛋糕,1表示去吃掉最近的蛋糕(如果左右都有蛋糕且距离相同,那么吃同方向的蛋糕),问最终走了多少路程 分析:用multis ...

  5. 如何移除EditText自动焦点

    <LinearLayout android:layout_width="match_parent" android:layout_height="wrap_cont ...

  6. 8.JAVA-向上转型、向下转型

    父子对象之间的转换分为了向上转型和向下转型,它们区别如下: 向上转型 : 通过子类对象(小范围)实例化父类对象(大范围),这种属于自动转换 向下转型 : 通过父类对象(大范围)实例化子类对象(小范围) ...

  7. Mysql——Innodb和Myisam概念与数据恢复

    Innodb和Myisam是Mysql常见的两种数据存储引擎.没有研究过Oracle.SQL Server等数据库,所以下面只针对Mysql. 一.两种方式的数据存储结构: 在Myisam下,数据库的 ...

  8. 读取Java文件到byte数组的三种方式

    package zs; import java.io.BufferedInputStream; import java.io.ByteArrayOutputStream; import java.io ...

  9. C#斐波那契数列递归算法

    public static int Foo(int i)        {            if (i < 3)            {                return 1; ...

  10. Android(java)学习笔记194:ContentProvider使用之获得系统联系人信息02(掌握)

    1.重要: 系统删除一个联系人,默认情况下并不是把这个联系人直接删除掉了,只是做了一个标记,标记为被删除. 2.前面一讲说过了如何获取系统联系人信息(通过ContentProvider),获取联系人信 ...