说明: 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. docker速记

    1.docker:一个轻量级的虚拟机.是一个容器 2.Linux系统包括—RedHat(商业版).Centos.Ubuntu 3.docker比作码头的集装箱,image镜像就是基石,images类似 ...

  2. python的Debug调试

    先打开Shell的Debug-->Debugger调试, 然后点击程序的运行 点击Debug的step按钮查看每一步的结果

  3. 暑期训练狂刷系列——Foj 1894 志愿者选拔 (单调队列)

    题目连接: http://acm.fzu.edu.cn/problem.php?pid=1894 解题思路: 因为出队和入队都满足队列的性质,优先单调队列的优先级有进入队列的顺序和人品的高低,在一段区 ...

  4. “玲珑杯”第七届郑州轻工业学院ACM程序设计大赛 ------- D:社交网络

    题目链接: http://acm.zzuli.edu.cn/problem.php?cid=1099&pid=3 题目大意: 国语题目,题意显而易见, 解题思路: 只需要对每一个节点进行假设, ...

  5. 把List<Map<String,Object>>转成Map<String,Object>

    Map<String, Object> parmMap = new HashMap<String, Object>(); //定义一个用于存储强转后的Map List<M ...

  6. 公众号如何获取已关注用户的unionid的问题

    避免误导,先加一句:首先,得公众号绑定开放平台 这个问题困扰了我一早上,我尝试了很多次获取unionid都失败. 微信的开发文档上有说: 关于特殊场景下的静默授权 1.上面已经提到,对于以snsapi ...

  7. 安卓(Android)关于 RecyclerView 不能填充满宽度

    RecyclerView 不能填充满屏幕宽度 RecyclerView 的 Adapter 在使用是,一定要 @Overridepublic RecyclerView.ViewHolder onCre ...

  8. (1) Jenkins + Subversion + Maven + TestNG - 软件

    软件需求 1 Jenkins http://jenkins-ci.org/ 2 Visual SVN Server https://www.visualsvn.com/server/ 3 Tortoi ...

  9. 合并百度影音的离线数据 with python 2.2 bdv格式的更新

    百度影音的bdv格式又有变化. 此次存在2种bdv格式. 格式1:每个文件夹内就一个bdv文件,文件合并后改名avi即可. 格式2:每个文件夹内一个bdv文件作为索引,其他附加guid的文件作为数据. ...

  10. cookie和session的用法用途,执行流程,区别联系

    1.为什么要有cookie/session?在客户端浏览器向服务器发送请求,服务器做出响应之后,二者便会断开连接(一次会话结束).那么下次用户再来请求服务器,服务器没有任何办法去识别此用户是谁.比如w ...